このトピックでは、メッセージがカスタマーによって消費されるときの、メッセージの可視性タイムアウトの管理に関連する用語、シナリオ、およびソリューションについて説明します。
用語
可視: 可視メッセージは、多数のコンシューマーが読み取りおよび受信できます。コンシューマーとは、メッセージを受信して処理するサービスまたはアプリケーションです。
不可視: メッセージが1 つのコンシューマーによって受信されると、不可視になり、他のコンシューマーは受信できなくなります。これにより、他のコンシューマーが同じメッセージを処理することを防ぎます。
可視性タイムアウト期間: メッセージがコンシューマーによって受信されてから(他のコンシューマーには不可視)、再び他のコンシューマーによって受信できるようになるまでの期間(他のコンシューマーには可視)。
メッセージが単一のコンシューマによって受信された後、それは見えなくなり、他のコンシューマによって受信することができなくなります。 非表示ステータスは、他のコンシューマーが同じメッセージを処理できないようにする可視性タイムアウト期間によって異なります。
可視性タイムアウト期間の詳細については、「可視性タイムアウト期間」をご参照ください。
シナリオ
Simple Message Queue (SMQ、旧 MNS) は、各メッセージに VisibilityTimeout パラメーターを提供します。コンシューマーがメッセージを受信した後、SMQ は可視性タイムアウトの時間を計測し始めます。コンシューマーが指定されたタイムアウト期間内にメッセージの処理を完了しない場合、メッセージは他のコンシューマーによって受信および処理される可能性があります。メッセージに VisibilityTimeout パラメーターを指定し、コンシューマーがメッセージの処理に失敗した場合、メッセージは削除されず、他のコンシューマーによって処理できます。
VisibilityTimeout パラメーターに大きな値を設定して、コンシューマーがメッセージを処理するのに十分な時間があることを確認できます。キューの VisibilityTimeout パラメーターの値が 6 時間に設定されているとします。コンシューマーはメッセージ M1 を受信します。コンシューマーがメッセージを処理した後、プロセスが失敗するか、ホストが再起動されます。この場合、メッセージ M1 は 6 時間後まで別のコンシューマーによって受信または処理できません。コードを作成して時間を短縮することはできますが、プロセスがより複雑になります。
特定のシナリオでは、メッセージを受信した直後に処理する必要があります。次の要件があるとします。
VisibilityTimeout パラメーターの値は小さい値(たとえば、5 分)です。コンシューマーに障害が発生した場合、コンシューマーによって処理されていないメッセージは 5 分以内に他のコンシューマーによって受信および処理できます。
コンシューマーがメッセージを処理するときは、接続を維持する必要があります。これは、プロセスに 5 分以上かかる場合があるためです。
ソリューション
Simple Message Queue (SMQ、旧 MNS) は、前のシナリオで説明されている問題を解決するための C# サンプルコードを提供します。プロセスは次のとおりです。コンシューマーがメッセージを処理すると、SMQ は ChangeVisibility 操作を呼び出すかどうかを定期的にチェックします。コンシューマーがメッセージを処理した後、deleteMessage 操作が呼び出されてメッセージが削除されます。
C# サンプルコードのダウンロード方法の詳細については、「C++ 用 SDK」をご参照ください。デモの使用に関するテクニカルサポートについては、チケットを送信 してください。
サンプルコードを使用する場合は、次の情報に注意してください。
コードを実行する前に、
accessId、accessKey、およびEndPointを構成する必要があります。変数:
変数
説明
MessageMinimalLife
メッセージが登録されるときに必要な最小限の存続期間。たとえば、メッセージが登録されてから 0.1 秒後にタイムアウトになる場合、SMQ には ChangeVisibility 操作を呼び出してメッセージの存続期間を延長するのに十分な時間はありません。したがって、MessageMinimalLife は、SMQ が ChangeVisibility 操作を呼び出してメッセージの存続期間を延長できるようになる前に、メッセージがタイムアウトにならないようにします。ビジネスニーズに基づいて MessageMinimalLife パラメーターを指定できます。
TimerInterval
マネージャーの内部タイマーが時間計測に使用する間隔。メッセージの指定された存続期間が終了する前に、タイマーが開始されていることを確認する必要があります。TimerInterval パラメーターに小さい値を設定して、メッセージが短い間隔でチェックされるようにすることができます。
QueueMessageVisibilityTimeout
キュー内のメッセージのデフォルトのタイムアウト期間。サンプルコードを使用して ChangeVisibility 操作を呼び出す場合、VisibilityTimeout パラメーターの値は QueueMessageVisibilityTimeout パラメーターに指定された値と同じです。したがって、QueueMessageVisibilityTimeout パラメーターの値は、TimerInterval パラメーターと MessageMinmalLife パラメーターの値の合計よりも大きくする必要があります。そうでない場合、メッセージがタイムアウトになる可能性があります。
MessageTimeout
マネージャーにおけるメッセージのタイムアウト期間。たとえば、コンシューマーに障害が発生した場合、マネージャーはメッセージの可視性を変更しなくなります。その後、メッセージはタイムアウトになります。
プロセス:
メッセージを受信した後、コンシューマーはメッセージを登録および処理し、次に Manager.
deleteMessage操作を呼び出してメッセージを削除します。メッセージが登録されると、マネージャーは ThreadPool.ChangeVisibilityTask 操作を呼び出して、ChangeVisibility 操作が必要かどうかを確認します。次に、マネージャーはメッセージを内部メッセージリストに追加します。
マネージャーのタイマーは、Parallel.ChangeVisibilityTask 操作を定期的に呼び出して、メッセージリスト内のすべてのメッセージをチェックします。
次の図は、Manager.ChangeMessageVisibility (ChangeVisibilityTask) 操作を呼び出すことによってメッセージの可視性タイムアウトを管理するために使用されるプロセスを示しています。
次の図は、メッセージの可視性タイムアウトを管理する手順を示しています。