2016-06-29 11 views
0

私は、Azureサービスバスのトピックとサブスクリプションのシナリオを持っています。このWebサイトはトピックの購読を作成します。ウェブサイトの別のインスタンスが作成されているとき、同じトピックに対する一意の名前で新しいサブスクリプションを作成したいと考えています。何が最善の方法だろう。ウェブサイトは青空のWebアプリケーションとしてホストされています。Azureサービスバス一意のサブスクリプション名(スケーリング時)

+0

ユースケースとは何ですか?私はあなたがウェブサイトのインスタンスが死ぬにつれてきれいにされる必要があるサブスクリプションを持っているので、それをすることをお勧めしません。 – JTaub

+0

Sean FeldmanとJTaubありがとうございます。シナリオは、メッセージがトピックに公開されているときに、Webアプリケーションがサブスクリプションからメッセージを読み取り、signalRを使用してクライアントにプッシュします。これは、インスタンスごとにサブスクリプションを作成すると考えた理由です。インスタンスごとに独自のクライアントセットがあるためです。 – Suhumar

答えて

1

Azureサービスバスはブローカーであり、アプリケーションは競合するコンシューマ(つまり、同じWebアプリケーションのインスタンスと同じキューの複数インスタンスフィード)にする必要があります。そうだとしたら、コールバックのようなメカニズムを実装する必要があります。コールバックのようなメカニズムを実装する必要がある場合があります。そのためには、インスタンスごとではなく、Webアプリケーションごとにサブスクリプションを作成するのではなく、ユニークなサブスクリプションIDとしてWEBSITE_INSTANCE_IDを使用して行うことができます。 Johnのコメントと同様、インスタンスごとのサブスクリプションの問題は、スケールインすると、プロビジョニング解除されたWebアプリケーションインスタンスのサブスクリプションに関連付けられたメッセージは、処理されていないブローカに残ります。言うまでもなく、一定のスケールアウト/インは、孤立してクリーンアップされないサブスクリプションを生成します。

ウェブアプリケーションごとにサブスクリプションを作成し、その目的のために特別に設計されたSignalR with a backplaneのようなものを使用して、特定のインスタンスにイベントを配信することもできます。 SignalRにはいくつかのバックプレーン実装(Redis、Azure ServiceBus、SQL Server)があります。

+0

Sean FeldmanとJTaubありがとうございます。シナリオは、メッセージがトピックに公開されたときに、Webアプリケーションがサブスクリプションからメッセージを読み取り、signalRを使用してクライアントにプッシュします。これは、インスタンスごとにサブスクリプションを作成すると考えた理由です。インスタンスごとに独自のクライアントセットがあるためです。しかし、Seanが提案していることから、このトピックへのサブスクリプションは1つだけで、スケールアウトのシナリオを処理するためにSignalRバックプレーンを使用できます。 – Suhumar

+0

私がこのルートをたどると、メッセージは購読から何度も読めるようにする必要があります。したがって、複数のインスタンスはメッセージを読み取り、それをクライアントに送信できます。だから私はそれのためのカウントを設定し、いつメッセージを完了マークするのですか? – Suhumar

+0

メッセージを一度だけ読み取って、バックプレーンを使用してsignalRでブロードキャストします。成功した場合は、完了したASBメッセージをマークします。 –

関連する問題