メッセージキューとは何か、そしてそれをどのように使用しますか?
メッセージキューは、切断されたサービス間で短いメッセージを送信するために使用されます。マイクロサービスや同期を保つ必要がある分散システムの通信に使用できます。基本的な概念について説明し、AWS SQSとの使い方についても話し合います。
メッセージキューはどのように機能しますか?
メッセージキューは、切り離されたサービス間の「接着剤」と考えることができます。それらは、メッセージの生産者とメッセージの消費者の間のリンクを提供します。
例えば、ロードバランサーの後ろに多くの異なるサーバーに展開されたWebアプリケーションがあるとしましょう。ユーザーが画像をアップロードしていて、別のサーバーで画像処理を実行したいとします。各サーバーが手動で処理サーバーにPOSTリクエストを送信するという方法は機能しますが、そのサーバーがリクエストを受信できなかったり、プロデューサーがリクエストが処理されたことを確認したいと思った場合はどうでしょうか。このようなシステムをスケールさせるのは難しくなります。特に、1秒あたり何千ものメッセージを処理する必要があるときはなおさらです。
メッセージキューを使用すると、すべてのウェブサーバーが中央のキューにメッセージを送信することができます。その後、処理サーバーは定期的にキューをチェックし、各メッセージを処理します。処理が完了した後、コンシューマーはキューからメッセージを削除し、他のコンシューマーによって二重に処理されないようにします。順序が重要な場合は、受信した順番どおりにメッセージを処理しなければならない先入れ先出し(FIFO)キューを使用できます。
メッセージには好きなものを含めることができますが、一般的にはかなり小さく保たれるべきです。AWS SQSの最大メッセージサイズは256KBで、メタデータを含むJSONの少しには十分です。大きなオブジェクトを保存する必要がある場合は、S3のようなストレージサービスにアップロードし、メッセージ内でURIを参照するべきです。
キューには他にも多くの利点があります。それらはメッセージの永続性を通じて冗長性を可能にします。キューに置かれたメッセージは手動で削除される必要があるため、遅延があっても必ずいつか処理されることが保証されます。何かが失敗した場合、システムが再オンラインになるとメッセージは処理されることができます。
キューはアイテムをバッチ処理するためにも使用できます。100のデータベースリクエストを送信するのではなく、キュー全体を同時に処理し、一度に大きなリクエストを送信することで、しばしばよりパフォーマンスが向上します。
さらに、AWS SQSのようなほとんどのキューサービスには、組み込みの監視ツールがあるため、時間の経過に伴って送信されているメッセージの数を追跡できます。
AWS SQSの始め方
SQSキューの設定は非常に簡単です。SQSコンソールに移動して、新しいキューを作成します:
利用可能なオプションは二つあります:スタンダードは、メッセージが少なくとも一度は配信されることを保証し、適切な順序での配信を最善を尽くして行います。一方、先入先出(FIFO)は、メッセージが一度だけ処理され、正確な順序で処理されることを保証します。しかし、両方には利点があります。FIFOは、毎秒大量のメッセージを生成するワークロードに対して、一般的にパフォーマンスが低下します。
次はメッセージの処理方法に関する設定です。「可視性タイムアウト」はメッセージが成功裏に処理される必要がある時間の長さを定義します。コンシューマがSQSにメッセージの更新を求めると、そのメッセージは一時的にキューから削除され、コンシューマが手動で処理して削除するための時間が与えられます。これにより、スケールアウトして複数のコンシューマを持つことができますが、各コンシューマにメッセージを送信したい場合は、複数のキューを作成する必要があります。
メッセージ保持期間とは、処理されていないメッセージがキュー内にどのくらいの間保持されるかを指します。配信遅延は、メッセージがプロデューサーに送信されるのを遅らせるために使用でき、「メッセージ受信待機時間」は、長いポーリングを可能にし、空のメッセージ受信の数を減らすことができ、高性能システムにおけるコスト削減につながります。
最後に、アクセスポリシーを使用して、このキューを特定のIAMユーザーまたはロールに制限することができます。
キューを使用するには、クライアント SDK を使用してプログラムで SQS にメッセージを送信するか、AWS API からアクセスできます。理解しやすいようにコードを使って示します。
.NET SDKでは、新しいものを作成できます
AmazonSQSClientサービスURLを渡すことによって、キューが存在する地域を示します。
それから、新しいものを構築することができます。
SendMessageRequestsメッセージ本文とキューのURLを指定し、それを送信します。
SQSClient.SendMessageAsync
、これはできる
await'ed と HTTP ステータスコードを返します。
メッセージを消費するには、次のようにします
RecieveMessageAsync同様の方法で。このコードはメッセージの配列を含むオブジェクトを返し、それを処理のために残りのコードに送信することができます。
もちろん、作業が完了したら、後片付けをする必要があります。処理した各メッセージについて、キューから削除するためにSQSにDeleteMessageRequestを送信する必要があります。これは、メッセージのタイムアウト前に行う必要があります。さもなければ、メッセージが二重に処理される可能性があります。









