LoginSignup
5
1

More than 1 year has passed since last update.

AWS SQSの性能を引出すチューニングポイント (ロングポーリングにする & 並行処理で受信 & バッチサイズは10)

Last updated at Posted at 2020-12-17

前提 & 注意

__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にすることが望ましいです。

  1. Randomキューの場合は順序と重複の担保をしないため、後続のシステムが冪等性を保てるかの考慮が必要になります。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1