見出し画像

ユートニックのアプリケーションを裏で支えるバックエンドシステムの全貌

初投稿です!株式会社ユートニックでバックエンドを担当している衛藤です!
普段はアプリケーション全体のバックエンドシステム開発/運用/監視全般の他に、最近ではデータ分析やブロックチェーンアプリケーション開発、その他チーム体制の改善等にも力を入れています。
本記事では、ユートニックのサービスを支える裏方であるバックエンドシステムの全貌について紹介したいと思います。

今後の記事にて、さらに細かい技術についての投稿ができればと考えています。

ユートニックについて

株式会社ユートニックは 「Stay Artistic!! 表現者にパワーを。」 をステートメントに、音楽活動を始めとするエンターテイメント領域において、アーティストやクリエイターが生きやすい世界を創りたいという想いで立ち上げられた会社です。

ユートニックのサービスを支える裏方「utoniq core」

ユートニックが提供するサービスの中で「U-Series」というファンビジネスに特化したノーコードアプリ開発システムがあり、アーティストやクリエイターがファンコミュニティを立ち上げ運営することができます。
SNSのようなポスト投稿やデジタルアイテム販売、ガチャ、プリペイドポイント決済システム、会員限定サブスクリプション、ライブ配信、NFTの発行など様々な機能が含まれますが、そんなU-Seriesを裏で支えるバックエンドサービスの全体について紹介します。

システム全体概要図

システム全体の概要図です。

ユートニックのバックエンドシステム全体概要

細かい部分は割愛していますが、基本となる技術スタックは図の通りで、Google Cloud Platformをメインとし、APIサーバーではGraphQL、データベースはFirestoreを利用しています。
以下では、主要なサービスをピックアップしてどのように利用しているかを紹介します。

Firestore

フルマネージドなサーバーレスなドキュメント志向のNoSQLデータベースです。
リアルタイムな同期や、後述のドキュメントフックにより様々なケースに順応したアプリケーション開発が可能になります。
また、フルマネージドのため自動でスケールアップ、スケールダウンするとともに、強整合性のレプリケーションも実現されます。ACIDトランザクションも保証され、高度なデータ操作も比較的シンプルに、信頼度高く実現可能なデータベースです。

Cloud Run

フルマネージドなサーバーレスプラットフォームで、ユートニックではNode.js(TypeScrypt実装)で動かしています。主にユートニックのアプリケーション群から利用されるAPIサービスで、ビジネスロジックの心臓部として機能しています。
ユートニックのサービスでは、その特性上リクエスト量が極端に増減することがありますが、Cloud Runのオートスケールにより常時監視せずに状態に応じてスケーリングしてくれるため、開発作業に集中することができています。

Cloud Functions

FaaSで、Cloud Runとは違いコンテナによる管理も不要なサービスです。ユートニックでは以下のユースケースでCloud Functionsを利用しています。

  • 一部のhttpsサーバーとして

  • cron用のschedulerサーバーとして

  • PubSubのバッチサーバーとして

  • Firestoreのドキュメントフックとして

特にFirestoreのドキュメントフックにより、データの作成・更新・削除をトリガーとした機能の開発では重宝しています。

GraphQL

RESTに代わるAPI開発用のクエリ言語であり、かつAPIサーバーとしてのランタイム環境です。REST APIと異なり、レスポンスとして欲しいFieldのみに絞ってクエリを発行することができます。エンドポイントは1つのみで、Postのbodyによりクライアントが欲しいFieldを指定します。
ユートニックではCloud RunでGraphQLサーバーを稼働させています。
便利な半面、N+1問題というパフォーマンスに影響する問題が出てきますが、こちらについてはまた別の機会で詳しく書こうと思います。
また外部サービスではありますが、Stellateというサービスを導入しており、Edgeキャッシュによるレスポンスタイムの改善も行っています。

CI/CD, DevOps, SRE

CI/CD

現在ユートニックのバックエンドでは、GithubActionsを利用して以下の処理を自動化しています。

  • GitHubでPullRequestをオープンした場合の単体実行

  • GitHubでPullRequestをマージした場合のCloud Runデプロイ

テストは単体テスト、インテグレーションテストがありますが、現在はほぼ単体テストをメインとしてCoverageを徐々に上げていっています。

Cloud Runデプロイについては、以前はCloud Buildを利用していましたが現在はGihubActionsに移行、Dockerのbuildxにより中間レイヤーをContainer Registryにキャッシュすることで、もともと30分ほどかかっていたビルドを最短5-10分程度まで短縮しています。


また、mainマージ次第自動的にデプロイされるため、1日に複数回本番環境にデプロイされます。DevOps four key metricsの1つであるDeployment Frequencyは高めではないかと思われます。

DevOps

バックエンドではひとたび障害が発生してしまうと、場合によってはすべてのアプリケーションがストップしてしまう自体になりかねません。
常時の監視用にCloud Monitoringで独自のダッシュボードを作成し、バックエンド状態を監視するとともに、何かあった際のアラートも設定することで、異常時にはSlack上で検知し被害を最小限に抑えられるよう試みています。

Cloud Monitoringのダッシュボード
リクエスト急増アラート(Slack)

以上、ユートニックのアプリケーションを支えるバックエンドシステム全体像の説明でした。
今後はパフォーマンスを向上させ、よりユーザーが快適に利用できるシステムを目指して行きたいと思っています。またその辺のチューニングについても記事を書いていきたと思いますので、興味があればぜひご覧ください!

最後に

ユートニックでは様々な職種を募集中です。
カジュアル面談も行っておりますので、興味がありましたらお気軽に応募してください!


この記事が気に入ったらサポートをしてみませんか?