Mirai Translate TECH BLOG

株式会社みらい翻訳のテックブログ

AWSのサービスを利用したイベント駆動アーキテクチャのパターン

 

こんにちは、プラットフォーム開発部のtoshと申します。

この記事は、 みらい翻訳のカレンダー | Advent Calendar 2022 - Qiita の7日目です。

寒さも増してきて、今年ももうアドベントカレンダーの時期が来たのかと感傷に浸っています。この時期になると手荒れがひどいんですよね。。。

 

今回はAWSのサービスを利用して構築するイベント駆動アーキテクチャの設計パターンを紹介します。

きっかけとして、AWSが提供しているSkill Builderという学習用のサービスがあり、そこでイベント駆動アーキテクチャの設計を学ぶコースができたとのツイートを見かけたので受講してみました。その中で紹介されているパターンの一部を紹介します。

 

サーバーレスで実現するイベント駆動アーキテクチャ

イベント駆動アーキテクチャとは、何らかの出来事や状態の変化などをイベントと定義し、イベントの発生に伴い特定の処理を実行させるアーキテクチャのことです。
イベント駆動アーキテクチャが提唱された当時は構築・実装にコストがかかっていたそうです。
今日ではAWS LambdaやAmazon SQS、Amazon Kinesisなどを利用することにより、自前で重厚な仕組みを構築する必要がなく、比較的容易に実現できるようになっているようです。
下記の図はAWSの提供しているサーバーレスのサービスのみで実現されたイベント送信用の非同期API*1です。

 

 

API GatewayとLambdaだけでも非同期処理を実現することは可能ですが、上記の構成では、API GatewayとLambdaの間にSQSを挟んでいます。このような構成にすると、Lambdaの処理時間に関係なく非同期処理を実現することができます。また、可視性タイムアウトやデッドレターキューといったSQSの便利な機能を使うことができます。

 

また、非同期で複数の処理を行いたい場合にはStep Functionsを組み合わせて使うこともできます。Step Functionsを使った例は次の章で紹介します。

 

ステータス更新の通知のパターン

イベント駆動アーキテクチャのような非同期処理を実現する際に、ステータス管理をどのように実現するかを考える必要があります。

一般的によく使われるのはポーリングしてデータを取得する方法かと思います。これは設計がシンプルで従来の同期処理と考え方も似ており、導入は容易かと思われます。

一方で、無駄な通信が発生したり、ステータスが更新されてから実際に取得するまでのラグが発生してしまうといったデメリットも存在します。

上記のデメリットへの対応として、SNSを利用したWebhookを使用するパターンを紹介します。

*2

上記の例ではクライアントが公開しているWebhook URLを用いてSNSが通知する仕組みです。Step Functionsはステータスの変更を通知する際にSNSにメッセージを発行しているものとお考えください。

この設計の利点は、エラー時の再実行やエクスポネンシャルバックオフ*3、デッドレターキューなどがSNSに組み込まれていることです。

反対に、ポーリングと比較するとクライアントがWebhook用のエンドポイントを用意する必要があるため、システム全体としては複雑になる点がデメリットです。

 

データ処理のパターン

データ処理のパターンはSkill Builderでは様々なパターンが紹介されていますが、その中でも興味深かったパターンを紹介しようと思います。

SNSとSQSを用いて、並列で複数の処理を実行させることができます。

以下の例は、とある処理の実行後にバックアップやログの送信、分析用のDWHへのデータ投入等様々な処理を並列して実行させる例です。このような設計はファンアウトと呼ばれます。

 

 

仮にSNSが無ければメッセージ送信のコードを複数書くことになり実装コストが増えますし、publisherの処理時間もそれに伴い増加します。

上記のパターンでは、publisherに負荷をかけずに並列で処理を実行させることができます。

 

まとめ

AWSのサービスを組み合わせてサーバーレスでイベント駆動アーキテクチャを実現するためのパターンをいくつか紹介しました。

イベント駆動アーキテクチャは従来のリクエスト・レスポンスアーキテクチャよりも複雑なので、まずはAWSのサービスを使って低い導入コストで学習していくのが良いのではないかと考えています。

 

We're hiring!

みらい翻訳では、アーキテクチャに興味のある方や技術ブログを盛り上げていただけるエンジニアを募集しています! ご興味のある方は、ぜひ下記リンクよりご応募・お問い合わせをお待ちしております。

miraitranslate.com

*1:

非同期とイベント駆動はイコールではありません。イベント駆動アーキテクチャを実現する上でイベント送信のため非同期APIを構築した時の例とお考えください)

*2:この図は内部のバックエンドサービスで構築されているものとお考えください。外部に公開されるようなwebhookを構築する場合は上記の絵に現れないものも考慮する必要があります。

*3:エラー時のリトライ間隔を少しずつ伸ばすような仕組みのことです。詳細は以下のドキュメントをご確認ください。

AWSでのエラー再試行とエクスポネンシャルバックオフ - AWS 全般のリファレンス