Simple Message Queue (旧称:MNS) は、順序付きメッセージをサポートしています。このトピックでは、主要な概念、標準メッセージとの違い、作成および使用方法、API の手順、関連する制限とベストプラクティスについて説明します。
機能の定義
Simple Message Queue (旧称:MNS) は、同一グループ内のメッセージに対して FIFO (先入れ先出し) 処理を提供し、ビジネスシナリオにおける順次処理を保証します。
シナリオ
順序付きメッセージは、厳密なメッセージ順序を必要とするビジネスシナリオに適しています。
-
注文ステータスの遷移
Eコマースの注文システムでは、注文の作成 → 支払い → 発送 → 配達確認などの状態は、正しいビジネス状態を維持するために時系列順に処理される必要があります。
-
金融取引処理
証券や株式の取引システムでは、同一の買値を持つ注文は、発注された順序に厳密に従って処理される必要があります。下流システムは、これらの注文をその発注順序に従って処理する必要があります。
-
データベース同期
上流のデータベースは、挿入、削除、または更新操作を実行します。バイナリ操作ログはメッセージとして下流システムに送信され、下流システムはそれを再生して状態データを順次更新し、データの不整合を回避します。
-
業務ログの記録
重要な業務操作のログは、監査やトラブルシューティングをサポートするために、厳密に時系列順で保存される必要があります。
基本概念
-
MessageGroupId:メッセージグループの識別子です。システムは各グループ内のメッセージの順序を保証します。同じ
MessageGroupIdを持つメッセージは厳密に順序通りに処理され、異なるグループのメッセージは並行して処理できます。 -
可視性タイムアウト:メッセージが正常に取得された後、タイムアウトが切れるまで他のコンシューマーには見えなくなります。これにより、複数のコンシューマーが同じメッセージを同時に処理することを防ぎます。タイムアウト前にメッセージが削除確認されない場合、再び可視状態になります。
-
グループのロックメカニズム:順序付きキューでは、特定の
MessageGroupIdを持つメッセージが取得されたが削除確認されていない (つまり、不可視のままである) 場合、同じMessageGroupId内の後続のすべてのメッセージはブロックされます。これにより、厳密な消費順序が保証されます。現在のメッセージが削除確認されるか、その可視性タイムアウトが切れた後にのみ、同じグループの次のメッセージを取得できます。
標準メッセージとの違い
-
順序セマンティクス:
-
標準メッセージ (標準キュー/トピック):ベストエフォートで少なくとも1回配信されますが、順序は保証されません。
-
順序付きメッセージ (FIFO キュー/トピック):同じ
MessageGroupId内で、メッセージはサーバーに到着した順序で厳密に消費されます。後のメッセージが消費される前に、先のメッセージが完全に処理される必要があります。
-
-
同時実行モデル:
-
標準メッセージ:グルーピングの制限はなく、全体的なスループットに最適化されています。
-
順序付きメッセージ:
MessageGroupIdを同時実行の単位として使用します。グループ内では直列処理、グループ間では並列処理です。
-
-
メッセージ要件:
-
順序付きメッセージを送信するには、
MessageGroupIdを指定する必要があります (キューとトピックの両方に適用されます)。
-
クイックスタート
FIFO キュー
-
キューの作成:
- MNS コンソールにログインします。
- 左側のナビゲーションウィンドウで、キュー をクリックします。
- ナビゲーションバーの上部でリージョンを選択します。
- [キュー] ページの右上角にある キューの作成 をクリックします。
-
キューを作成 パネルで、キュータイプ を シーケンシャルキュー に設定し、他のパラメーターを構成してから OK をクリックします。
その他の設定可能なパラメーターには、[Maximum message size]、[Long polling period]、[Message visibility timeout]、[Message retention period]、[Message delay time]、[Enable logging]、[Dead-letter policy]、[Rate limiting policy] があります。
-
メッセージの送信:
-
SendMessageを使用し、MessageGroupIdを含めます。注文 ID のような安定したビジネスキーを使用します。 -
MessageGroupIdを省略した場合、システムはエラーコードFifoMissingMessageGroupIdを返します。
-
-
受信と確認:
-
ReceiveMessageを使用してメッセージを取得します。応答にはMessageGroupIdが含まれます。処理後、DeleteMessageを呼び出して確認します。
-
FIFO トピック
-
トピックの作成:
- MNS コンソールにログインします。
- 左側のナビゲーションウィンドウで、トピック をクリックします。
- ナビゲーションバーの上部でリージョンを選択します。
-
トピック ページで、トピックの作成 をクリックします。
-
トピックの作成 パネルで、トピックタイプ を シーケンシャルトピック に設定し、他のパラメーターを構成してから OK をクリックします。
-
サブスクリプションの作成:
メッセージの順序を保証するために、FIFO キューにサブスクライブします。標準トピックは標準キューのみをサブスクライブできます。詳細については、「手順3:サブスクリプションの作成」をご参照ください。
-
メッセージの公開:
-
PublishMessageを使用し、MessageGroupIdを含めます。 -
MessageGroupIdを省略した場合、システムはエラーコードFifoMissingMessageGroupIdを返します。
-
-
消費と確認:
-
サブスクライブした FIFO キュー側で、
ReceiveMessageを使用してメッセージを取得し、DeleteMessageを使用して確認することで、各グループ内での順次処理を維持します。
-
API の使用
キュー関連の API
|
API名 |
パラメーターの説明 |
戻り値の説明 |
|
CreateQueue-キューの作成 |
入力パラメーター
|
指定されたタイプのキューを作成します。 |
|
GetQueueAttributes-キュー属性の取得 |
特になし |
|
|
ListQueue-Alibaba Cloudアカウント配下のすべてのキューを一覧表示 |
特になし |
キューのリストを返します。各キューには |
トピック関連の API
|
API名 |
パラメーターの説明 |
戻り値の説明 |
|
CreateTopic-トピックの作成 |
入力パラメーター
|
指定されたタイプのトピックを作成します。 |
|
GetTopicAttributes-トピック属性の取得 |
特になし |
|
|
ListTopic-Alibaba Cloudアカウント配下のトピックを一覧表示 |
特になし |
トピックのリストを返します。各トピックには |
メッセージ送受信 API
|
API名 |
パラメーター要件 |
戻り値の説明 |
注 |
|
FIFO キューには |
標準レスポンス。 |
単一のメッセージをキューに送信します。 |
|
|
FIFO キューには |
標準レスポンス。 |
複数のメッセージをバッチでキューに送信します。 |
|
|
FIFO トピックには |
標準レスポンス。 |
メッセージをトピックに公開します。 |
|
|
特になし。 |
応答本文には |
キューから単一のメッセージを受信します。 |
|
|
|
応答本文には |
複数のグループからのメッセージを返す場合があります。各グループ内では順序が維持されます。 |
制限
-
サポートされているリージョンは、中国 (深セン)、中国 (上海)、および中国 (杭州) です。他のリージョンでの FIFO サポートをリクエストするには、 チケットを起票してください。
-
グループIDが必須:FIFO キューまたはトピックにメッセージを送信するには、
MessageGroupIdが必要です。 -
タイプの互換性:
-
デッドレターキュー (DLQ):同じタイプのキューのみがバインドできます。FIFO メッセージは FIFO デッドレターキューにのみバインドでき、標準メッセージは標準デッドレターキューにのみバインドできます。
-
サブスクリプション:標準トピックは標準キューにのみサブスクライブできます。順序付き配信のためには、FIFO トピックを FIFO キューにサブスクライブします。
-
-
ピークはサポートされていません:FIFO キューはメッセージのピークインターフェイス (PeekMessage) をサポートしていません。
ベストプラクティス
-
グループ設計:
-
安定していて均等に分散された
MessageGroupIdの値 (注文 ID など) を使用して、少数のホットスポットグループがパフォーマンスボトルネックになるのを防ぎます。 -
極端なホットスポットワークロードの場合は、アプリケーションレイヤーでグループを細分化して同時実行性を高めます。
-
-
可視性タイムアウト:実際の処理時間に基づいてこれを設定し、タイムアウト前にアプリケーションが処理を完了してメッセージを確認できるようにすることで、重複配信を減らします。
-
べき等性とリトライ:コンシューマーにべき等処理とリトライロジックを実装して、エンドツーエンドの一貫性を確保します。
-
バッチ受信:メッセージごとの処理遅延が許容範囲内である限り、
numOfMessagesを増やしてスループットを向上させます。
よくある質問
順序はどのように定義されますか?
同じ MessageGroupId を持つメッセージは、送信順に厳密に配信および処理されます。異なるグループのメッセージは並行して処理できます。
MessageGroupId は必須ですか?
はい。FIFO キューまたはトピックにメッセージを送信するには、MessageGroupId が必要です。これがないと、順序を保証できません。
FIFO と標準のキュー/トピックはどのように選択すればよいですか?
ビジネスで厳密な順序 (注文ステータスの遷移など) が必要な場合は、FIFO キューまたはトピックを使用します。全体的なスループットと弾力性を優先し、メッセージの順序が不要な場合は、標準キューまたはトピックを使用します。開始するには、コンソールで シーケンシャルキュー または シーケンシャルトピック を作成し、送信時に MessageGroupId を含め、コンシューマー側でこの属性を読み取って順序付き処理と確認を行います。