株式会社HRBrainの非同期ファイル処理アーキテクチャにおけるEventarc
株式会社HRBrain / nakampany
メンバー / フルスタックエンジニア・プロダクトエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
| 利用プラン | 利用機能 | ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
|---|---|---|---|---|
Eventarc Standard | ファイルアップロード機能 | 101名〜300名 | 2024年4月 | B to B |
| 利用プラン | Eventarc Standard |
|---|---|
| 利用機能 | ファイルアップロード機能 |
| ツールの利用規模 | 101名〜300名 |
| ツールの利用開始時期 | 2024年4月 |
| 事業形態 | B to B |
アーキテクチャ
アーキテクチャの意図・工夫
本構成は、マイクロサービスの一つであるラーニングにおいて、動画やPDFなどのファイルをアップロードし、非同期で処理するためのイベント駆動アーキテクチャです。
大容量になりがちな動画・ドキュメント等のファイルアップロード処理をAPIサーバーから完全に切り離すため、署名付きURLを用いたクライアントからの直接アップロードを採用しています。これにより、APIサーバーのリソースや帯域を占有せず、アップロード後の処理をFile Workerに逃すことで、サーバーの負荷を軽減しています。クライアントによって署名付きURL経由で変換前バケットにファイルがアップロードされると、それをEventarcが検知し、非同期で後続のファイル処理を行うFile Workerをトリガーします。
今後、様々なファイル処理要件や新規機能が追加されることを見据え、特定のドメインに依存しない汎用的なファイル処理基盤を追求した結果、このEventarcを中心としたアーキテクチャ構成に辿り着きました。API経由の同期呼び出しと比べると、クライアントへの進捗通知や処理中の状態管理が必要になるという非同期処理特有の複雑性はありますが、複数のシステムが複雑に相互関連し合う中で個別でもシステムが動作できるよう疎結合を保つことを考えて設計しました。
メッセージの重複配信が発生しても安全に処理されるよう担保しており、また、File Workerがジョブの開始時や完了時に、DBの変換ステータステーブルへレコードを作成・更新するようにしています。
具体的な処理フローは以下の通りです。
- クライアントが、署名つきURLで変換前バケットにファイルをアップロードすると、Eventarc経由でFile Workerが起動します。DBの変換ステータステーブルにレコードを作成し、セキュリティチェックを実行します。
- 動画はストリーミング配信を採用しており、Google CloudのTranscoder APIで、HLS形式のストリーミング配信用フォーマットに変換しています。File WorkerからTranscoder APIに対してジョブ作成リクエストを送信し、変換を行い、変換後バケットに保存します。
- Transcoder APIによる変換処理が完了すると、Transcoder APIが完了イベントをPub/Subに送ります。
- 最後に、Pub/Subを経由してFile Workerがジョブ完了イベントを受け取り、DBのステータスを「処理完了」に更新することで、一連の処理を終了します。
導入の背景・解決したかった問題
導入背景
Eventarcを導入した背景は、以下の通りです。
大容量の動画やPDFファイルをAPIサーバー経由で受け取る構成では、ファイルアップロードの処理により、APIサーバーの他APIの処理や、共通APIゲートウェイに影響を与えてしまう可能性があります。そのため、APIサーバーを介さず、安定したCloud Storageへ直接アップロードできる仕組みが必要でした。
また、ファイルの変換処理はCPUリソースを大量に消費し、完了までに時間を要するため、同期的な処理ではAPIサーバーのタイムアウト許容値を超えてしまい、現実的ではありませんでした。そのため、ユーザーのファイルアップロード完了を検知して、処理を担うCloud Runを非同期で起動する仕組みが求められました。
そこで、「google.cloud.storage.object.v1.finalized(アップロード完了)」イベントを直接検知し、後続のファイル処理を行うCloud Runへ自動的にルーティングする連携役として、Eventarcを採用しました。
比較検討したサービス
非同期でイベントをルーティングする仕組みとして、以下を比較検討しました。
API経由で通知
- クライアントが、APIサーバーに対してCloud Storageの「アップロード完了」のイベントを送信し、APIサーバーがジョブを起動する構成。
Pub/Subで通知
- Cloud Storageの「アップロード完了」のイベントをPub/Subトピックへ通知し、サブスクリプション経由でCloud Runを起動する構成。
選定理由
API経由のアプローチでは、システムメンテナンス時にAPIサーバー側でリクエストを一律に拒否できるといったメリットがありました。しかし、このメンテナンス時のリクエスト制限については、APIサーバーが発行するCloud Storageの事前署名URLの有効期限を調整することでも代替可能であるため、API方式ならではの決定的な優位性とは言えませんでした。
API経由の構成では、クライアントがCloud Storageへファイルをアップロードした直後に通信の瞬断などが起きた場合、「ファイルのアップロード」と「APIサーバーへのジョブ起動リクエスト」という一連のステップが途中で分断されるリスクがありました。このステップ分断によってファイルだけがストレージに残存する問題自体は、変換前バケットのオブジェクトライフサイクル設定によって自動削除することで解決可能です。しかし、「ファイルはアップロードされたのに処理が開始されない」という不整合な状態に陥るリスクは残ります。したがって、後続処理のトリガーを、通信状態という不確実な要素を含むクライアントの挙動に依存させる構成は、システムの信頼性に欠けると判断しました。そのため、Google Cloud側でのファイルアップロード検知を起点として、確実に処理を実行するイベント駆動アーキテクチャを採用しました。
また、イベント駆動を実現するにあたり、「Cloud Storageの更新通知を受け取る」というシンプルな要件であったため、変換前バケットのオブジェクト更新の検知からCloud Runの起動までを一気通貫で仲介してくれるEventarcを採用しました。これにより、実装および運用コストを抑えつつ、イベント連携を実現できると判断しました。
導入時の苦労・悩み
イベントのルーティング設計において、フォルダ構成(変換前バケットパス)に起因する依存関係をインフラとアプリケーションのどちらに担わせるかは検討課題でした。
Eventarcには、Cloud Storageのパス単位で直接イベントをフィルタリングできないという技術的な制約がありました。また、仮にEventarc側でパスごとの振り分けを実現しようとした場合、変換前バケットパス情報がインフラ側に漏れ出ることになります。その結果、フォルダ構成が変更されるたびにインフラ側の修正が必要となり、インフラとアプリケーションが密結合に陥る懸念がありました。
そこで本設計では、Eventarc側での振り分けは行わず、すべてのアップロードイベントをCloud Runの単一エンドポイントへ転送する構成を採用しました。イベントを受信したアプリケーション側でバケットのパス情報を解析し、内容に応じて適切なハンドラーへ動的にルーティングしています。
導入に向けた社内への説明
上長・チームへの説明
Eventarc自体は利用料金が比較的小さく、単体で大きなコスト要因にはなりませんでした。そのため、Eventarcの採用については主に技術的なトレードオフやアーキテクチャ上のメリット・デメリットを説明し、チーム内で合意形成を行いました。
一方で、ファイルアップロード基盤全体のアーキテクチャ選定については、技術面だけでなくコスト面も含めて検討を行いました。具体的には、複数のアーキテクチャ案を比較し、それぞれについてCloud Storage、Cloud Run、Cloud Load Balancingなどの利用料金を試算しました。その際、想定利用企業数や月間アップロード数を基に概算コストを算出し、サービス開始時だけでなく将来的に利用者数が増加した場合でも事業として成立するかを確認しました。また、料金体系やイベント配信量に関する不明点についてはGoogleのサポートへ問い合わせを行い、見積もりの前提条件を整理したうえで最終的なコストを確定させました。
その結果、要求を満たしながら十分に運用可能なコストであることを確認できたため、技術的な妥当性と事業性の両面から現在のアーキテクチャの採用を合意しました。
活用方法
よく使う機能
- Cloud Storageのオブジェクト作成イベントのルーティング
- その他:https://docs.cloud.google.com/eventarc/docs/event-types?hl=ja#directly-from-a-google-cloud-source
ツールの良い点
Eventarcを採用する最大のメリットは、Pub/Subのようなメッセージング基盤を明示的に構築・管理することなく、イベントの配送をシンプルに実現できる点にあります。
Pub/Sub では、トピックやサブスクリプションなどのリソースを個別に設計・管理・運用する手間が発生しますが、Eventarcはこれらを抽象化して裏側で処理します。これにより、メッセージング基盤の明示的な管理負荷を排除し、開発側はビジネスロジックの実装に集中することができます。
ツールの課題点
処理の追跡が困難である点です。システムが疎結合になるため、エラー発生時にどこが原因なのか、一目で把握することが難しくなります。
ローカル環境での開発・テストも課題の一つでした。Cloud StorageからEventarcを経由してCloud Runへイベントが配信される一連の流れを手元で完全に再現することは難しく感じました。そのため、アプリケーションのテストではCloudEvent形式のリクエストを模擬して検証し、Eventarc自体を含めた結合テストについては実際のデプロイ環境で手動で確認する運用としています。
株式会社HRBrain / nakampany
メンバー / フルスタックエンジニア・プロダクトエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
株式会社HRBrain / nakampany
メンバー / フルスタックエンジニア・プロダクトエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法


