非同期設計ガイドライン
Async Design Guidelines
かつて、非同期処理は専門的なメッセージングミドルウェアを必要とする、一部のミッションクリティカルなシステムで採用される特別な技術と言えた。今やクラウドネイティブなサービス(例:AWS SQSなど)の登場で状況は様変わりし、応答時間の長い処理のオフロードなどを目的に、非同期処理を取り入れることは珍しくない。一方で、非同期特有の難しさは変わらず、「処理のトレース」 「デバッグ」 「リラン」が困難であり、データストアにまたがる場合のデータの整合性担保や障害発生時のリカバリは難易度が高い。
本ガイドラインは、非同期導入時のメリットを享受しつつ、「本質的な難しさ」を回避または適切に管理するための実務的な設計論点と指針を提供する。堅牢で運用しやすい非同期システムを設計するための一助になれば幸いである。
免責事項
本ガイドラインが対象とするスコープは、バックエンドシステムにおける以下のような非同期メッセージングを用いた処理に限る。
以下は含まれない。
非同期処理には、メッセージキューのサービスを利用する。そうした種別や、プロダクトごとに呼び名が様々存在する。
| 分類 | キュー | Pub/Sub | ストリーミング |
|---|---|---|---|
| 説明 | 1:1型。1つのメッセージが1つの受信者に処理される。メッセージは処理後に削除 | 1:N型。1つのメッセージを複数のワーカーが受け取る。メッセージは処理後に削除 | 1:N型。複数のワーカーが異なる読み取り位置から再生可能。メッセージは指定期間、永続化 |
| 具体例 | SQS, RabbitMQ | SNS、MQTT | Kafka、Kinesis |
| 送信者 | プロデューサー | パブリッシャー | プロデューサー |
| 受信者 | コンシューマー | サブスクライバー | コンシューマー |
| メッセージ格納場所 | キュー | トピック | トピック/ストリーム |
| データ単位 | メッセージ | メッセージ/Notification/イベント | レコード/イベント |
| 順序性保証/グループ化 | Message Group ID (SQS FIFOキューの場合) | - | パーティション |
| 読み取り位置 | Visibility Timeout | - | オフセット/シーケンス番号 |
上表のように非同期処理で利用される技術や製品によって用語は様々であるが、本ガイドラインでは、一貫性を保つために以下の用語を使用する。
| 用語 | 説明 |
|---|---|
| プロデューサー | メッセージの送信側のコンポーネント |
| コンシューマー | メッセージを受信して処理するコンポーネント |
| メッセージ | プロデューサーとコンシューマー間でやり取りされるデータの単位 |
| キュー | メッセージを中継するサービス |
このアーキテクチャガイドラインの作成には多くの方々にご協力いただいた。心より感謝申し上げる。