1.はじめに
本記事は、毎年恒例のMicrosoft Azureアドベントカレンダーの参加記事です。 11月のCDP勉強会にてご紹介したデモのコード解説とともにお送りしてきた「Service Busメッセージングを使ってみよう」のTopicとSubscriptionのパートを今回ご紹介していきたいと思います。 前回までのQueueの取り扱いと基本的には同様ですが、TopicとSubscriptionではそれぞれ役割が分かれているため、Topicで設定すべき項目とSubscriptionで設定すべき項目に分かれます。 すなわち、ある機能をメッセージングに持たせようとした場合、Topic側の設定だけで完結する場合とSubscription側の設定で完結する場合、そして双方の設定がすべて完結していないと利用できない場合とがあります。 それぞれについて触れていきましょう。
2.Topicで設定すべきこととSubscriptionで設定すべきこと
それでは早速、TopicおよびSubscriptionの属性であるTopicDescriptionとSubscriptionDescriptionの設定項目を見てみましょう。 まずはTopicDescriptionです。主なプロパティを以下に示します。
名前 |
説明 |
AutoDeleteOnIdle | トピックが自動的に削除されるまでの TimeSpan アイドル間隔を取得または設定します。最小期間は 5 分です。 |
AvailabilityStatus | このインスタンスの可用性のステータスを取得します。 |
DefaultMessageTimeToLive | トピックに対するメッセージの既定の有効期限値を取得または設定します。これは、メッセージが Service Bus に送信されてから、メッセージの有効期限になるまでの期間です。これは、メッセージ自体で TimeToLive が設定されていない場合の既定値です。TimeToLive の値よりも古いメッセージは有効期限が切れ、メッセージ ストアに保持されなくなります。サブスクライバーは、有効期限が切れたメッセージを受信できません。 |
DuplicateDetectionHistoryTimeWindow | 重複データ検出履歴の期間を定義する TimeSpan 構造体を取得または設定します。 |
EnableBatchedOperations | サーバー側のバッチ操作が有効になっているかどうかを示す値を取得または設定します。 |
EnableExpress | エクスプレスエンティティを利用できるようにします。 |
EnableFilteringMessagesBeforePublishing | 発行前にメッセージをフィルターするかどうかを取得または設定します。 |
EnablePartitioning | トピックを複数のメッセージ ブローカーにわたってパーティション化できるようにします。 |
IsAnonymousAccessible | 匿名アクセスが許可されるかどうかを取得します。 |
MaxSizeInMegabytes | トピックの最大サイズを MB 単位で取得または設定します。これはトピックに割り当てられたメモリのサイズです。 |
MessageCountDetails | トピックについてのメッセージの詳細を取得します。 |
RequiresDuplicateDetection | トピックで重複データ検出が必要かどうかを示す値を取得または設定します。 |
SubscriptionCount | サブスクリプションの数を取得します。 |
SupportOrdering | サポートする順序設定を取得または設定します。 |
UserMetadata | 説明に関連付けられたユーザーのメタデータを取得または設定します。 |
出典:MSDNライブラリ「TopicDescription クラス」リファレンス
名前 |
説明 |
AutoDeleteOnIdle | サブスクリプションが自動的に削除されるまでの TimeSpan アイドル間隔を取得または設定します。最小期間は 5 分です。 |
AvailabilityStatus | メッセージングが利用可能かどうかの状態を取得します。 |
CreatedAt | メッセージが作成された時間を取得します。 |
DefaultMessageTimeToLive | メッセージ有効期限の既定値を取得または設定します。これは、メッセージが Service Bus に送信されてから、メッセージの有効期限になるまでの期間です。これは、メッセージ自体で TimeToLive が設定されていない場合の既定値です。TimeToLive の値よりも古いメッセージは有効期限が切れ、メッセージ ストアに保持されなくなります。サブスクライバーは、有効期限が切れたメッセージを受信できません。ここで指定した値よりも低い TimeToLive 値をメッセージに適用することは可能ですが、既定では TimeToLive は MaxValue に設定されています。したがって、このプロパティはメッセージに適用される既定の有効期限値になります。 |
EnableBatchedOperations | バッチ操作が有効になっているかどうかを示す値を取得または設定します。 |
EnableDeadLetteringOnFilterEvaluationExceptions | フィルター評価の例外でサブスクリプションが配信不能をサポートしているかどうかを示す値を取得または設定します。 |
EnableDeadLetteringOnMessageExpiration | メッセージの期限が切れたときにサブスクリプションが配信不能をサポートしているかどうかを示す値を取得または設定します。 |
ForwardDeadLetteredMessagesTo | 配信不能メッセージの転送先受信者のパスを取得または設定します。 |
ForwardTo | メッセージの転送先受信者のパスを取得または設定します。 |
LockDuration | サブスクリプションのロック期間を取得または設定します。 |
MaxDeliveryCount | 最大配信数を取得または設定します。 |
MessageCount | メッセージ数を取得します。 |
MessageCountDetails | サブスクリプションについてのメッセージの詳細を取得します。 |
RequiresSession | サブスクリプションがセッションの概念をサポートしているかどうかを示す値を取得または設定します。 |
TopicPath | サブスクリプションの説明が属しているトピックのパスを取得します。 |
出典:MSDNライブラリ「SubscriptionDescription」リファレンス
たとえば、エクスプレスエンティティを有効にする場合にはTopic側で設定が必要です。また、セッションはSubscription側で設定します。また、メッセージの有効期限を設定するDefaultMessageTimeToLiveはTopicおよびSubscriptionの双方で指定可能ですが、より短い有効期限が適用されます。ただしメッセージ自身に有効期限が設定されている場合は、メッセージの設定値が優先されます。 また、バッチ送受信サポート状態を設定するEnableBatchedOperationsはTopic側で有効すると送信時のバッチ送信が可能となり、Subscriptionで有効にすると受信時のバッチ受信が有効となります。
3.フィルタリングの実現
TopicおよびSubscriptionでは特定の条件に従ってメッセージをフィルタリングすることができます。 たとえば、特定のタグを持つメッセージのみを受信したい場合、各Subscriptionでフィルタリングルールを設定することで、メッセージの選択受信ができます。フィルタリングを実現するには、TopicのEnableFilteringMessagesBeforePublishingをTrueに設定しておき、ルールを指定することで、メッセージングフィルタリングを有効にします。ルールを設定するには、RuleDescriptionオブジェクトをSubscriptionの作成時に引数として設定します。 RuleDescriptionのFilterプロパティにフィルタリング条件を指定することで、Subscriptionはフィルタリング条件を満たすメッセージのみ受信することができます。 フィルタリングの種類には以下のものがあります。
クラス |
説明 |
CorrelationFilter | 相関フィルター式を表します。 |
FalseFilter | False のフィルター式を表します。 |
SqlFilter | 式の合成であるフィルターと、パブリッシュ/サブスクライブ パイプラインで実行されるアクションを表します。 |
TrueFilter | フィルター式に一致させます。 |
出典:MSDNライブラリ「Microsoft.ServiceBus.Messaging 名前空間」リファレンス
特定のタグ(文字列)を含むメッセージを受信したい場合、CorrelationFilterを指定します。 以下に、コードの例を掲載します。以下のコードは送信側のコード例です。
TopicClient TClient = TopicClient.CreateFromConnectionString(“接続文字列を指定”, “mytopic”);
NamespaceManager namespaceManager
= NamespaceManager.CreateFromConnectionString(“接続文字列を指定”);
TopicDescription topicDescription = new TopicDescription(“mytopic”);
//配信前のフィルタリングの有効化
topicDescription.EnableFilteringMessagesBeforePublishing
= (bool)chkEnableFilterBeforePublish.IsChecked;
//トピックの作成
namespaceManager.CreateTopic(topicDescription);
SubscriptionDescription subdesc
= new SubscriptionDescription(“mytopic”, “mysubscription”);
//ルール名を設定
rule.Name = ” Christmas”;
//ルールのフィルター条件を指定(CorrelationFilterを利用し、持つメッセージのみフィルタリング)
rule.Filter = new CorrelationFilter(“Christmas”);
//サブスクリプションの作成
namespaceManager.CreateSubscription(subdesc, rule);
BrokeredMessage message = new BrokeredMessage(body);
//メッセージにCorrelationIdを設定
message.CorrelationId = “Christmas”;
TClient.Send(message);
受信側は特別なコードを記述することなくメッセージがフィルタリングされます。
4.最後に
3回にわたって、QueueおよびTopic & Subscriptionの利用法をご紹介してきました。 ほんの一部の機能の紹介でしたが、紹介した機能以外にも様々なものがあります。 それらの機能についても、後日紹介していきたいと思います。
Comments are closed here.