Simple Message Queue (旧称:MNS) は順序付きメッセージをサポートしています。このトピックでは、順序付きメッセージのコアコンセプト、通常のメッセージとの違い、作成方法と使用方法、API の説明、制限、ベストプラクティスについて説明します。
機能の定義
Simple Message Queue (旧称:MNS) の順序付きメッセージは、同じグループ内のメッセージに対して先入れ先出し (FIFO) 配信を提供します。これにより、ビジネスシナリオにおいてメッセージが正しい順序で処理されることが保証されます。
シナリオ
順序付きメッセージは、厳密なメッセージの順序付けを必要とするビジネスシナリオに最適です。
注文ステータスのトランジション
e コマースの注文システムでは、注文の作成、支払い、発送、配達確認などのステータスは、ビジネスの状態が正確に保たれるように時系列で処理する必要があります。
金融トランザクション処理
証券や株式取引システムでは、取引注文が同じ買値を付けた場合、先着順の原則に基づいて処理する必要があります。ダウンストリームシステムは、これらの注文を配置された順序で処理する必要があります。
データベースの同期
アップストリームデータベースは、作成、更新、削除の操作を実行します。二項演算ログをメッセージとしてダウンストリームシステムに送信します。ダウンストリームシステムは、メッセージからこれらの操作を適用して状態を更新し、データの不整合を防ぎます。
ビジネスログの記録
重大なビジネス運用のログは、将来の監査やトラブルシューティングを容易にするために、厳密な時系列で保存する必要があります。
主要な概念
MessageGroupId: メッセージグループの識別子です。システムはこのグループ ID を使用してメッセージの順序を保証します。同じ
MessageGroupId内では、メッセージは厳密な順序で処理されます。異なるグループのメッセージは並行して処理できます。可視性タイムアウト: メッセージが正常にプルされると、タイムアウト期間が終了するまで他のコンシューマーには見えなくなります。これにより、メッセージが複数のコンシューマーによって同時に処理されるのを防ぎます。メッセージの削除が確認されない場合、タイムアウト後に再び表示されるようになります。
グループロックメカニズム: 順序付きキューでは、特定の
MessageGroupIdを持つメッセージがプルされると、非表示状態になり、同じMessageGroupIdを持つ後続のメッセージをブロックします。これにより、厳密な消費順序が保証されます。同じグループの次のメッセージは、現在のメッセージが削除されるか、その可視性タイムアウトが期限切れになった後にのみプルできます。
通常のメッセージとの違い
順序セマンティクス:
通常のメッセージ (スタンダードキュー/Topic): 少なくとも 1 回の配信を提供します。順序はデフォルトでは保証されません。
順序付きメッセージ (順序付きキュー/Topic): 同じ
MessageGroupId内では、メッセージはサーバーに到着した厳密な順序で消費される必要があります。メッセージは、先行するメッセージが処理された後にのみ消費できます。
並行性モデル:
通常のメッセージ: グループの制限はありません。全体的なスループットを重視します。
順序付きメッセージ: 並行性の単位として
MessageGroupIdを使用します。メッセージはグループ内で直列に処理され、グループ間では並行して処理されます。
メッセージ要件:
順序付きメッセージを送信する場合、
MessageGroupIdを指定する必要があります。これはキューと Topic の両方に適用されます。
はじめに
順序付きキュー (FIFO キュー)
キューの作成:
Simple Message Queue (旧称:MNS) コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リージョンを選択します。
キュー ページで、キューを作成 をクリックします。
キューを作成 パネルで、キュータイプ を シーケンシャルキュー に設定し、他のパラメーターを設定してから、OK をクリックします。

メッセージの送信:
SendMessageを使用し、MessageGroupIdを含めます。グループ ID には、注文 ID などのビジネスプライマリキーを使用します。MessageGroupIdを含めない場合、エラーコードFifoMissingMessageGroupIdが返されます。
メッセージの受信と確認:
ReceiveMessageを使用してメッセージをプルします。応答本文にはMessageGroupIdが含まれています。メッセージを処理した後、DeleteMessageを呼び出して確認します。
順序付き Topic (FIFO Topic)
Topic の作成:
Simple Message Queue (旧称:MNS) コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リージョンを選択します。
トピック ページで、トピックの作成 をクリックします。
トピックの作成 パネルで、トピックタイプ を シーケンシャルトピック に設定し、他のパラメーターを設定してから、OK をクリックします。

サブスクリプションの作成:
メッセージの順序が維持されるように、順序付きキューにメッセージをプッシュするサブスクリプションを作成します。標準 Topic のサブスクリプションは、標準キューにのみメッセージをプッシュできます。詳細については、「ステップ 3: サブスクリプションの作成」をご参照ください。
メッセージの公開:
PublishMessageを使用し、MessageGroupIdを含めます。MessageGroupIdを含めない場合、エラーコードFifoMissingMessageGroupIdが返されます。
メッセージの消費と確認:
サブスクライブされた順序付きキューで、
ReceiveMessageを使用してメッセージをプルし、DeleteMessageを使用して確認します。これにより、グループ内の処理順序が維持されます。
API の説明
キュー関連の API
API 名 | パラメーターの説明 | 応答の説明 |
CreateQueue-キューの作成 | リクエストパラメーター
| 指定されたタイプのキューを作成します。 |
GetQueueAttributes-キュー属性の取得 | 特別なパラメーターなし |
|
ListQueue-指定された Alibaba Cloud アカウントのすべてのキューを一覧表示 | 特別なパラメーターなし | キューのリストを返します。各キューには |
Topic 関連の API
API 名 | パラメーターの説明 | 応答の説明 |
CreateTopic-Topic の作成 | リクエストパラメーター
| 指定されたタイプの Topic を作成します。 |
GetTopicAttributes-Topic 属性の取得 | 特別なパラメーターなし |
|
ListTopic-Alibaba Cloud アカウントの Topic を一覧表示 | 特別なパラメーターなし | Topic のリストを返します。各 Topic には |
メッセージ送受信 API
API 名 | パラメーター要件 | 応答の説明 | 注 |
順序付きキューの場合、 | 標準応答。 | 単一のメッセージをキューに送信します。 | |
順序付きキューの場合、 | 標準応答。 | メッセージをバッチでキューに送信します。 | |
順序付き Topic の場合、 | 標準応答。 | メッセージを Topic に公開します。 | |
特別なパラメーターなし。 | 応答本文には | キューから単一のメッセージを受信します。 | |
| 応答本文には | 複数のグループからのメッセージを含む場合があります。各グループ内の順序は維持されます。 |
制限
この機能は現在、中国 (深圳)、中国 (上海)、および中国 (杭州) リージョンで利用可能です。他のリージョンで順序付きメッセージを使用するには、チケットを送信してください。
グループ ID が必要: 順序付きキューまたは Topic にメッセージを送信する場合、
MessageGroupIdを含める必要があります。タイプの照合:
デッドレターキュー (DLQ): DLQ は、そのソースキューと同じタイプである必要があります。たとえば、順序付きキューは順序付き DLQ にのみアタッチでき、スタンダードキューは標準 DLQ にのみアタッチできます。
サブスクリプション: 標準 Topic のサブスクリプションは、標準キューにのみメッセージをプッシュできます。メッセージの順序を保証するために、順序付き Topic のサブスクリプションは、順序付きキューにメッセージをプッシュする必要があります。
ピークはサポートされていません: 順序付きキューは PeekMessage API をサポートしていません。
ベストプラクティス
グループ設計:
注文 ID などの安定して均等に分散された
MessageGroupIdを使用して、少数のホットスポットグループによるパフォーマンスボトルネックを回避します。極端なホットスポットを持つビジネスの場合、ビジネスレイヤーでグループを細分化して並行度を高めることを検討してください。
可視性タイムアウト: 実際の処理時間に基づいてタイムアウトを設定します。これにより、タイムアウト前にビジネス運用が完了および確認され、再配信の可能性が低減されます。
べき等性とリトライ: コンシューマーに対してべき等処理とリトライメカニズムを実装して、エンドツーエンドの一貫性を確保します。
バッチプル:
numOfMessagesの値を増やしてスループットを向上させ、単一メッセージの処理遅延が許容範囲内であることを確認します。
よくある質問
順序はどのように定義されますか?
同じ MessageGroupId 内のメッセージは、サーバーに到着した厳密な先入れ先出し (FIFO) 順で処理されます。異なるグループのメッセージは並行して処理できます。
MessageGroupId は必要ですか?
はい。MessageGroupId は、順序付きキューまたは Topic にメッセージを送信するときに含める必要があります。そうしないと、処理順序は保証できません。
順序付きキュー/Topic と標準キュー/Topic のどちらを選択すればよいですか?
ビジネスが注文ステータスのトランジションなど、厳密な順序付けに依存している場合は、順序付きキューまたは Topic を選択します。全体的なスループットと弾力性をより重視し、厳密な順序付けを必要としない場合は、標準キューまたは Topic を使用します。開始するには、コンソールで [順序付きキュー] または [順序付き Topic] を作成し、メッセージを送信するときに MessageGroupId を含め、コンシューマー側でこのプロパティを使用してメッセージを処理および確認します。