概要
- twitterの #多分日刊IT問題 で流している問題と解説について、あとで見直せるようにブログに転記しておく
#多分日刊IT問題
— 𝔈𝔩𝔞𝔰𝔱𝔦𝔠 𝔎𝔞𝔧𝔦 𝔖𝔢𝔯𝔳𝔦𝔠𝔢@魔人ママチャリライダー (@Anorlondo448) 2018年6月16日
Amazon SQS(Simple Queue Service)の仕様として正しいものはどれか?!
なお、仕様は2018年6月時点の東京リージョンを基準とします。
#多分日刊IT問題
— 𝔈𝔩𝔞𝔰𝔱𝔦𝔠 𝔎𝔞𝔧𝔦 𝔖𝔢𝔯𝔳𝔦𝔠𝔢@魔人ママチャリライダー (@Anorlondo448) 2018年6月17日
多数の回答ありがとうございました!
仕様として正しいのは「3」の「遅延キューを使用すると、遅延期間の間はコンシューマに表示されない」になります。 https://t.co/kmrpRKHBvX
問題
- Amazon SQS(Simple Queue Service)の仕様として正しいものはどれか?! なお、仕様は2018年6月時点の東京リージョンを基準とします。
回答
- 仕様として正しいのは「3」の「遅延キューを使用すると、遅延期間の間はコンシューマに表示されない」になります。
解説
- 今回は俺が実際にSQSを使ってみて、こんな仕様なのかよ!ここに気をつけたほうが良いな!と思ったことを問題にしました。
- 「1.」 AWS Lambdaのイベントソースに使用できません。
- 例えば、SQSのキューにメッセージを投げて、それをトリガーにLambdaに処理させる、ということができません。
- キューのポーリングやメッセージの取得処理などはアプリ側で自前で実装する必要があります。
- しかもアプリ側で排他制御などをしておかないと、同じメッセージを処理してしまう可能性もあり、やや面倒な仕様となっています。
- ちなみにLambdaでサポートされているイベントソースはここです SQSはよ!!!
- 「2,4.」 メッセージは順不同で、複数回配信されることがあります。
- SQSには「スタンダードqueue」と「FIFO queue」があり、FIFO queueなら順番もキューに入った順になり、配信も1回のみになります。が!!!!
- バージニア北部、オハイオ、オレゴン、アイルランドのみしか使えません(なぜ・・・)
- スタンダード queueというのはほぼ無制限のスループットが可能ですが、送信順や回数についてはベストエフォート型になります。
- このため、処理順序を意識する必要がある場合は、メッセージ内に情報をもたせ、アプリ側で制御する必要があります。
- また、メッセージの複数配信を考慮し、重複処理を許可しないにアプリを実装する必要があります。
- アプリ側でここまでやらないといけないのは正直面倒・・・
- FIFO queueで無制限のスループットタイプをやってくれ!!!
- 「3.」 遅延キューを使うと、メッセージの配信を遅らせることができます。
- これはメッセージを投げた後、処理されるまである一定の時間を置きたい場合に使います。
- 遅延期間の間はキュー内にメッセージはありますが、コンシューマ側には表示されません
まとめ
- という感じで、Queue Serviceといいつつも、本当にメッセージを格納するキューだけを提供している感じです。
- もうちょっと・・・配信の一貫性が担保されてたり・・・SQSトリガーのメッセージ配信などの機能があると良いのですが、現状はただのメッセージの入れ物のような感じです。
- アプリ側でやらないといけないことが結構あるので、用法用量を守って使いましょう。