CHAPTER 04 / D1 / D4
イベント駆動と非同期処理
SQS・SNS・EventBridgeと、失敗時の動きを整理する。
01 / 非同期サービスを目的で選ぶ
| サービス | 中心となる役割 | 設問の手がかり |
|---|---|---|
| SQS | 処理待ちのメッセージをキューに保持 | 負荷を平準化、ワーカーで分担、処理失敗の再試行 |
| SNS | 一つの通知を複数の購読先へ配信 | ファンアウト、複数のSQSやLambdaへ同じ情報を渡す |
| EventBridge | イベントの内容に応じて配送先を決める | AWS / SaaS / 独自アプリのイベント、パターンによる振り分け |
| Kinesis Data Streams | 連続したデータを保持して読み取る | ストリーミング、同じデータを複数の利用者が読む、再処理 |
| Step Functions | 複数ステップの実行を管理する | 分岐・並列・待機・再試行・失敗処理を一つのワークフローに |
02 / SQSの一件は、いつ消える?
通常のSQS APIでは、受信しただけではメッセージは消えません。受信後は可視性タイムアウトの間だけ見えにくい状態となり、処理に成功したらDeleteMessageします。Lambdaのイベントソースマッピングでは、バッチ成功時の削除をLambda側が行います。
| 設定 | 何を制御するか |
|---|---|
| Visibility timeout | 受信したメッセージが再び見えるまでの時間。処理時間より短いと重複処理の原因 |
| Message retention period | メッセージを保持する期間。可視性タイムアウトとは別 |
| ReceiveMessageWaitTimeSeconds | ロングポーリングの待ち時間。空の応答を減らす |
| Redrive policy / maxReceiveCount | 受信が繰り返されたメッセージをDLQへ移す基準 |
Lambdaとの連携では、可視性タイムアウトを関数タイムアウトの少なくとも6倍にすることが推奨されます。バッチウィンドウを設定している場合は、その時間も加味します。単に関数タイムアウトより長ければ十分、と覚えないようにします。
公式資料:Lambda と SQS の設定
03 / StandardとFIFOを分ける
| 比較 | Standard | FIFO |
|---|---|---|
| 順序 | ベストエフォート。厳密な順序を保証しない | 同じMessageGroupId内で順序を維持 |
| 重複 | 少なくとも一回の配送。重複し得る | 重複排除ID等で送信時の重複を抑止。排除期間は5分 |
| 並列性 | 多数のワーカーで分担 | 異なるメッセージグループは並列に処理できる |
| アプリの処理 | 冪等性が必要 | タイムアウトや削除前の障害に備え、やはり冪等性を考える |
FIFOの重複排除は「外部の決済が必ず一度だけ実行される」保証ではありません。決済成功後、メッセージ削除前にワーカーが停止すれば、再処理され得ます。また、一つのMessageGroupIdへ集中させると、そのグループ内の直列性がボトルネックになります。
公式資料:FIFO の重複排除
04 / バッチ処理と失敗の切り分け
SQSのバッチで一件だけ失敗しても、既定ではバッチ全体が失敗扱いになるため、成功したメッセージまで再配送されます。部分バッチ応答を有効にすると、失敗したメッセージIDだけを返せます。
{
"batchItemFailures": [
{"itemIdentifier": "失敗したメッセージのmessageId"}
]
}イベントソースマッピングにReportBatchItemFailuresを設定し、関数がこの形式で応答する必要があります。FIFOでは順序を守るため、最初の失敗後の未処理メッセージの扱いにも注意します。
KinesisやDynamoDB Streamsでは、失敗したバッチがシャードの処理を遅らせることがあります。分割して再試行する設定、再試行回数・レコード有効期間、失敗先を検討し、IteratorAgeで遅延を見ます。
公式資料:SQS バッチ失敗の扱い
05 / EventBridge・Kinesis・Step Functions
EventBridgeでは、イベント内のsource、detail-type、detailなどに基づくルーティングを学びます。Pipesは一つのソースから一つのターゲットへの連携で、フィルタリングやエンリッチメントに使えます。Schedulerはスケジュールに基づく起動に使います。
Kinesis Data Streamsでは、partition keyでシャードへの振り分けが決まります。シャード内の順序や読み取り位置を意識し、キーの偏りとコンシューマーの処理遅延を調べます。キューのように一人が読んだら全員から消えるモデルではありません。
Step Functionsは、各Lambdaが次のLambdaを呼ぶコードを抱える代わりに、分岐・並列・待機・Retry・Catchを状態機械として表現します。
| ワークフロー | 選択の目安 | 実行モデル |
|---|---|---|
| Standard | 長時間・実行履歴・コールバック待機など | 最大1年。ワークフローはexactly-once。ただし明示的なRetryでタスクを再実行し得る |
| Asynchronous Express | 大量・短時間の非同期処理 | 最大5分。at-least-once |
| Synchronous Express | 短時間で結果を同期取得したい処理 | 最大5分。at-most-once |
構成練習:メール障害でも受注したい
受注後のメールサーバーが一時的に落ちても、受注APIは素早く成功を返したい。どこを分離する?
考え方・解答例
受注データを確実に保存し、メール処理をSQS等へ渡して別ワーカーで実行します。保存とイベント送信の片方だけ成功する問題もあるため、必要ならStreamsやトランザクショナル・アウトボックスなどの設計を検討します。キューだけ追加しても、この二重書き込み問題は自動解決しません。
06 / 確認問題
07 / この章の到達点
上のチェックは、このページでの振り返り用です。章単位の進捗は下のボタンで記録できます。
公式資料
内容確認日:2026年11月8日。仕様の詳細や更新情報は、各公式資料で確認できます。
理解を確認できたら、章の進捗を記録できます。