この Topic では、BatchReceiveMessage および BatchPeekMessage 操作がキュー内の可視メッセージ数よりも少ないメッセージを返す理由について説明します。
Simple Message Queue (formerly MNS) のキューサービスはサーバーレスです。複数のコンピューティングノードとデータノードを使用します。ノードの数は数十から数百の範囲です。この数は、リージョン内の全体的なトラフィックとメッセージ量に基づいて調整されます。連続するメッセージは、異なるノードに保存される場合があります。たとえば、メッセージ 1 はノード 1 に、メッセージ 2 はノード 2 に保存される可能性があります。
BatchReceiveMessage
BatchReceiveMessage 操作を使用してメッセージを取得すると、ロードバランシングによってまずデータノードが選択されます。次に、この操作はバッチで最大 'n' 個のメッセージを取得しようとします。メッセージが見つかった場合、それらはすぐに返されます。メッセージが見つからない場合、ロードバランシングは別のデータノードを選択して操作を再試行します。この迅速な返却設計により、操作のパフォーマンスが保証されます。BatchReceiveMessage 操作を継続的に呼び出すと、最終的にすべてのメッセージが消費されます。
たとえば、キューに 11 個のメッセージがあるとします。BatchReceiveMessage 操作を 1 回呼び出して、最大 15 個のメッセージを読み取ります。ただし、11 個のメッセージは複数のデータノードに保存されています。BatchReceiveMessage 操作は、メッセージを持つノードを見つけて、それらを迅速に返します。返されるメッセージの数は 11 未満になる場合があります。
BatchPeekMessage
この操作は BatchReceiveMessage と同じメカニズムを使用します。主な違いは次のとおりです。
BatchPeekMessage: コンシューマーがバッチでメッセージを表示できるようにします。返される情報にはReceiptHandleは含まれません。BatchReceiveMessage: コンシューマーがキューからバッチでメッセージを消費できるようにします。