パーティション分割されたサービス バスのキューおよびトピック


このポストは、10 月 30 日に投稿された Partitioned Service Bus Queues and Topics の翻訳です。

編集メモ: 今回は、Windows Azure サービス バス チームのプログラム マネージャー II を務める Ruppert Koch の記事をご紹介します。

先週、マイクロソフトは Azure SDK 2.2 およびサービス バス SDK 2.2 をリリースしました。またこれと同時に、サービス バスの新機能としてパーティション分割されたエンティティが実装されました。これらの SDK により (または HTTP 要求で api-version=2013-10 を指定して)、Azure サービス バスでパーティション分割されたキューやトピックを作成し、使用することができます。パーティション分割されたキューやトピックを活用することで、信頼性が向上すると共に、多くの場合、メッセージのスループットの最大化が期待されます。

パーティション分割されたキューおよびトピックの概要

従来のキューやトピックは、単一のメッセージ ブローカーが処理し、単一のメッセージ ストアに保存されますが、パーティション分割されたキューやトピックは、複数のメッセージ ブローカーが処理し、複数のメッセージ ストアに保存されます。このため、パーティション分割されたキューやトピックの総スループットは、単一のメッセージ ブローカーやメッセージ ストアのパフォーマンスに左右されません。また、単一のメッセージ ストアが一時的に使用不能になっても、パーティション分割されたキューやトピックは影響を受けません。

ここで、パーティション分割されたキューおよびトピックのしくみを簡単に説明します。それぞれのパーティション分割されたキューまたはトピックは、複数のフラグメントで構成されています。各フラグメントは異なるメッセージ ストアに保存され、異なるメッセージ ブローカーによって処理されます。メッセージがパーティション分割されたキューまたはトピックに送信されると、サービス バスはそのメッセージをフラグメントの 1 つに割り当てます。このとき割り当てられるフラグメントは、サービス バスによって無作為に選ばれるか、または送信元が指定したパーティション キーによって決定されます。クライアントが、パーティション分割されたキュー、またはパーティション分割されたトピックのサブスクリプションからメッセージを受信しようとすると、サービス バスはメッセージのすべてのフラグメントを確認します。すべてのフラグメントが確認された場合、メッセージをピックして受信者に送信します。

パーティション分割の有効化

パーティション分割されたキューまたはトピックを作成するには、3 つの方法があります。まず、アプリケーションでキューまたはトピックを作成する方法です。各パーティションの QueueDescription.EnablePartitioning (英語) プロパティまたは TopicDescription.EnablePartitioning (英語) プロパティを true に設定します。これらのフラグは、キューまたはトピックの作成時に設定する必要があります。既に作成したキューやトピックでは、このプロパティを変更することはできません。

2 つ目の方法として、Visual Studio でもパーティション分割されたキューやトピックを作成できます。[New Queue] および [New Topic] の各ダイアログ画面に、新たに [Enable Partitioning] チェックボックスが追加されています。

3 つ目は、Windows Azure ポータルで作成する方法です。この機能は、近日中に予定されている次回のポータルの更新後、利用可能になります。

現在 Windows Azure サービス バスでは、パーティション分割されたキューまたはトピックの使用可能数が、名前空間 1 つあたり 100 個に制限されています。また、パーティション分割されたキューおよびトピックは Windows Azure のサービス バスのみでサポートされており、Windows Server 1.1 のサービス バスでは使用できません。

パーティション キーの使用

メッセージがパーティション分割されたキューまたはトピックにエンキューされると、サービス バスはパーティション キーの有無を確認します。キーが存在する場合は、そのキーに従ってフラグメントが選択され、キーが存在しない場合は、内部アルゴリズムに従ってフラグメントが選択されます。

パーティション キーを使用する場合

セッションやトランザクションなど、場合によっては、特定のフラグメントにメッセージを保存する必要があります。この場合には、必ずパーティション キーが使用されます。同一のパーティション キーを使用するメッセージは、すべて同一のフラグメントに割り当てられます。

パーティション キーとして使用されるメッセージ プロパティは、場合によって異なります。

SessionId: メッセージに SessionId プロパティ セットが存在する場合、サービス バスはこの SessionId プロパティをパーティション キーとして使用します。このとき、同一セッションに所属するすべてのメッセージは同一フラグメントに割り当てられ、同一のメッセージ ブローカーによって処理されます。これにより、サービス バスでメッセージの順序およびセッション状態の一貫性が保持されます。

PartitionKey: メッセージに SessionId プロパティが存在せず、PartitionKey (英語) プロパティ セットが存在する場合、サービス バスは PartitionKey プロパティをパーティション キーとして使用します。PartitionKey プロパティは、セッションフルではないトランザクション メッセージの送信に使用されます。このパーティション キーにより、単一トランザクション内で送信されたメッセージは、すべて同一のメッセージ ブローカーに処理されることになります。

MessageId: キューまたはトピックに RequiresDuplicationDetection プロパティが存在し true に設定されている場合、SessionId または PartitionKey が設定されていなければ、MessageId プロパティがパーティション キーとして使用されます。これにより、同一メッセージのコピーはすべて同一のメッセージ ブローカーによって処理されます。さらに、サービス バスが重複するメッセージを検出し、削除することができます。

パーティション キーを使用しない場合

パーティション キーが存在しない場合、サービス バスはパーティション分割されたキューまたはトピックのすべてのフラグメントに、メッセージをラウンド ロビン方式で配信します。選択されたフラグメントが使用できない場合、サービス バスはメッセージを他のフラグメントに割り当てます。このため、メッセージ ストアが一時的に使用不能となったときにも、送信処理は正常に完了します。

これまでご説明したとおり、パーティション キーは、メッセージを特定のフラグメントに固定する役割を果たします。このフラグメントを保持しているメッセージ ストアが使用不能な場合、サービス バスはエラーを返します。パーティション キーがない場合、サービス バスは他のフラグメントをピックし、処理を正常に完了させることができます。このため、特に必要でない限り、パーティション キーは指定しないことを推奨します。

パーティション分割されたエンティティを利用したトランザクション メッセージの送信

トランザクションの一部として送信されるメッセージは、パーティション キーを指定する必要があります。このキーには、SessionId、PartitionKey、MessageId のいずれかを使用できます。同一トランザクションの一部として送信されるすべてのメッセージでは、必ず同一のパーティション キーを指定してください。

トランザクション メッセージをパーティション分割されたキューに送信する場合、以下のコードを使用できます。

セッション対応型のトピックやキューにトランザクション メッセージを送信する場合、メッセージに SessionId プロパティが設定されている必要があります。既にご説明したとおり、SessionId はパーティション キーとして機能します。PartitionKey プロパティも同時に設定されている場合、SessionId プロパティと同じになっている必要があります。

ただし、通常のキューやトピックとは違い、単一のトランザクションを使用して複数のメッセージを異なるセッションに送信することはできません。

詳細情報

パーティション化されたキューおよびトピックについての詳細情報は、http://msdn.microsoft.com/en-us/library/dn520246.aspx (英語) の記事およびサービス バスのパーティション分割されたキューのサンプル (英語) を参照してください。

Comments (0)

Skip to main content