AWS SQSはフルマネージドなジョブキューのサービスです。
利用する際にはいくつか注意点があるので要点をまとめてみました。
1. 順番は保証されない
- キューに送信した順番で受信されるとは限らない
- 順番を確保したい時はメッセージ内容にシーケンス番号やタイムスタンプを含めて、自前で実装する必要がある
2. 同じメッセージが複数回配信される場合がある
- 同じ処理を行いたくない場合は、メッセージを受信した時に、同じメッセージIDの場合は処理をスキップする等の処理が必要
3. メッセージの削除にはReceiptHandle
を使う
- メッセージの受信時に取得できる
- メッセージの削除・
Visibility timeout
の変更に必要 - メッセージを受信したエビデンスにもなる
- ただし、同じメッセージでも複数回受信した場合は
ReceiptHandle
は別になるため注意
4. Visibility timeout
について
- メッセージが1回受信された後、他のクライアントから同じメッセージを受信不可にするための時間(デフォルトは30秒)
- この設定した時間よりも、処理に時間がかかると同じメッセージが再度キューイングされ複数回受信されることになるので処理に時間がかかる場合は多めに設定する
5. メッセージの削除について
- SQSでは一度キューイングしたメッセージはユーザーが明示的に削除するか、
Message Retention Period
(デフォルト4日間)を経過しないと削除されない - つまり、処理完了後に受信したメッセージを削除する必要がある
- 処理中にエラーが発生した場合は削除処理が行われず、同じメッセージが
Message Retention Period
を超えるまで何度もキューイングされてしまうため対策が必要
6. Dead Letter Queues
について
- 処理が正常に行われずに、キューにメッセージがいつまでも残ってしまう問題を解決するための機能
- 設定した回数以上にメッセージが受信された場合、この
Dead Letter Queues
にメッセージが移動される
7. リクエスト数の節約のためのTips
- SQSはリクエスト数に対する課金なのでリクエスト数の削減対策は重要
- ロングポーリングを利用する(これは必須。劇的にリクエスト数が改善されます)
- ロングポーリングは管理画面から設定できるので簡単。
- 送信側はバッチリクエストを利用すると良い(
SendMessageBatch
) - 受信側も複数メッセージを一度に受信すると良い(
MaxNumberOfMessages
) - 1回10メッセージまで受信できる
- ただし10メッセージを指定しても受信数はそれ以下になることもある