前提 & 注意
__2020年12月時点__のAmazon SQSの仕様に基づいた筆者の観点から判断した内容です。
TL;DR
- ショートポーリングではなく__ロングポーリング(20秒)__にしよう
- 受信側では並行処理対応しよう
- 受信バッチサイズは最大値の10にしよう
できるだけMessageReceiveのSQS API(受信API)を叩く回数を少なくすることで送信されたメッセージを効率良く受信することが性能を引き出すポイントになります。
【ポイント1】 ロングポーリングにしよう
今回の検証の結果、ロングポーリングの方が(同負荷時のレイテンシーが)ショートポーリングより1.5倍ほど良いと出ました。
AWS公式でもロングポーリングを推奨しており、パフォーマンスも料金コストも両方優れているよ、とあるのでその通りのようです。
ロングポーリングの設定は1秒から20秒まで選べますが、システムが問題なく動作する限り__20秒一択__で良いとわかりました。
AWSコンソール上から作成するとショートポーリングがデフォルトなので注意が必要です。
じゃあいつショートポーリングが必要になる?
複数のSQSから受信するプログラムが1スレッドで動くようなシステム構成の場合は1つのキューでのみ待ちになるため、ショートポーリングを選択する必要があります。
詳細は、【公式】SQS よくある質問 を参照。
【ポイント2】 受信側は複数スレッドで処理した方がスループットがよくなる
これは自明ですが、検証の結果でも、複数スレッド(Goのgoroutineを利用)で対応した方が性能が良くなると出ました。可能ならば並行処理で受信するとパフォーマンスが上がります。1
【ポイント3】 メッセージ受信のバッチサイズは最大値の10にしよう
SQSメッセージ受信において送信に対して受信リクエストが過度な場合、受信側の性能においてボトルネックになります。
できる限り少ない受信リクエスト数にすることが必要であり、そのために受信バッチサイズは最大値の10にすることが望ましいです。
-
Randomキューの場合は順序と重複の担保をしないため、後続のシステムが冪等性を保てるかの考慮が必要になります。 ↩