血と汗となみだを流す

個人の思ったこと、やったことの吐き出し口です。

多分日刊IT問題(Amazon SQSについて)

概要

  • twitterの #多分日刊IT問題 で流している問題と解説について、あとで見直せるようにブログに転記しておく

twitter

問題

  • Amazon SQS(Simple Queue Service)の仕様として正しいものはどれか?! なお、仕様は2018年6月時点の東京リージョンを基準とします。
    1. AWS Lambdaのイベントソースとして使用可能
    2. メッセージはFIFOで配信される
    3. 遅延キューの遅延期間中はコンシューマに表示されない
    4. キューのメッセージは1回のみ配信される

回答

  • 仕様として正しいのは「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トリガーのメッセージ配信などの機能があると良いのですが、現状はただのメッセージの入れ物のような感じです。
  • アプリ側でやらないといけないことが結構あるので、用法用量を守って使いましょう。
プライバシーポリシー