web-dev-qa-db-ja.com

Azureイベントハブと複数のコンシューマーグループ

次のシナリオでのAzureイベントハブの使用に関するヘルプが必要です。このシナリオでは消費者グループが適切なオプションになると思いますが、オンラインで具体的な例を見つけることができませんでした。

これは、問題の大まかな説明と、イベントハブを使用した解決策の提案です(これが最適な解決策かどうかはわかりません。フィードバックをお寄せください

enter image description here

データベースに保存する必要のある大量のイベントデータ(センサーからのテレメトリデータ)を生成する複数のイベントソースがあり、実行平均、min-maxなどの分析はparallelで実行する必要があります。

送信者は単一のエンドポイントにのみデータを送信できますが、イベントハブはこのデータを両方のデータハンドラーで使用できるようにする必要があります。

2つのコンシューマーグループを使用することを考えています。1つ目は、データをキーバリューストアに保存するワーカーロールインスタンスのクラスターで、2つ目は分析エンジンです(Azure Stream Analysisを使用する可能性が高い)。 )。

まず、コンシューマグループを設定するにはどうすればよいですか。また、イベントのコピーがすべてのコンシューマグループに表示されるように、送信側/受信側で行う必要があることはありますか?

オンラインで多くの例を読みましたが、それらはclient.GetDefaultConsumerGroup();を使用するか、すべてのパーティションを同じワーカーロールの複数のインスタンスで処理しました。

私のシナリオでは、イベントがトリガーされたときに、2つの異なるワーカーロールで並行して処理する必要があります(データを保存するものと、分析を行うもの)

ありがとうございました!

19
infinity

TLDR:見た目は妥当です。CreateConsumerGroupIfNotExistsで異なる名前を使用して2つのコンシューマーグループを作成するだけです。

コンシューマーグループは主に概念であるため、サブスクライバーがどのように実装されているかによって、どのように機能するかが決まります。ご存知のように、概念的にはこれらは一緒に作業しているサブスクライバーのグループであり、各グループがすべてのメッセージを受信し、理想的な(発生しない)状況ではおそらく各メッセージを1回消費します。つまり、各コンシューマグループwill "同じワーカーロールの複数のインスタンスによってすべてのパーティションが処理されます。"あなたはこれを求めている。

これはさまざまな方法で実装できます。マイクロソフトは、Event Hubsからメッセージを直接消費する2つの方法に加えて、おそらく2つの直接的な方法の上に構築されているStreaming Analyticsなどを使用するオプションを提供しています。最初の方法は Event Hub Receiver で、2番目の方法は Event Processor Host です。

私は Event Hub Receiver を直接使用していないため、この特定のコメントは、これらの種類のシステムがどのように機能するかの理論とドキュメントからの推測に基づいています:それらは created from EventHubConsumerGroups これらのレシーバーは相互に調整しないため、これはほとんど目的を果たしません。これらを使用する場合は、すべての調整とオフセットのコミットを自分で行う必要があります(できる!)。これは、計算された集計と同じトランザクションでトランザクションDBにオフセットを書き込むなど、いくつかのシナリオで利点があります。これらの 低レベルレシーバー を使用し、同じAzureコンシューマーグループを使用する異なる論理コンシューマーグループを使用することはおそらく問題になりません(規範的ではなく、実用的なアドバイスではありません)。それが問題になるか、 EventProcessorHosts に変更する場合。

次に、より有用な情報について説明します。 EventProcessorHosts は、おそらく EventHubReceivers の上に構築されています。それらはより高いレベルのものであり、複数のマシンが論理的なコンシューマグループとして一緒に機能できるようにするサポートがあります。以下に、コードから少し編集したスニペットを含め、 EventProcessorHost にいくつかの選択肢を説明するためのコメントの束を残しました。

//We need an identifier for the lease. It must be unique across concurrently 
//running instances of the program. There are three main options for this. The 
//first is a static value from a config file. The second is the machine's NETBIOS
//name ie System.Environment.MachineName. The third is a random value unique per run which
//we have chosen here, if our VMs have very weak randomness bad things may happen.

string hostName = Guid.NewGuid().ToString();

//It's not clear if we want this here long term or if we prefer that the Consumer 
//Groups be created out of band. Nor are there necessarily good tools to discover 
//existing consumer groups.
NamespaceManager namespaceManager = 
    NamespaceManager.CreateFromConnectionString(eventHubConnectionString);
EventHubDescription ehd = namespaceManager.GetEventHub(eventHubPath);
namespaceManager.CreateConsumerGroupIfNotExists(ehd.Path, consumerGroupName);

Host = new EventProcessorHost(hostName, eventHubPath, consumerGroupName, 
    eventHubConnectionString, storageConnectionString, leaseContainerName);
//Call something like this when you want it to start
Host.RegisterEventProcessorFactoryAsync(factory)

Azureに新しいコンシューマグループが存在しない場合は作成するように指示したことがわかります。存在しない場合は、素敵なエラーメッセージが表示されます。 EventProcessorHostの調整(およびおそらくコミット)が機能するために、インスタンス間で同じであるneedsであるストレージ接続文字列が含まれていないため、これの目的が正直にわかりません正しく。

ここでは、 Azure Storage Explorer からのリースの写真を提供しました。リースと、おそらく11月に実験していたコンシューマーグループからのオフセットです。 testhubとtesthub-testcgコンテナーはありますが、これは手動で名前を付けているためです。それらが同じコンテナにある場合、「$ Default/0」と「testcg/0」のようなものになります。 Event Hub Leases

ご覧のとおり、パーティションごとに1つのblobがあります。私の仮定では、これらのblobは2つの目的で使用されます。これらの最初は、インスタンス間でパーティションを分散するためのBlobリースです こちら を参照してください。2番目は、コミットされたパーティション内のオフセットを格納しています。

データがコンシューマグループにプッシュされるのではなく、消費するインスタンスは、ストレージシステムに1つのパーティションのあるオフセットでデータを要求します。 EventProcessorHostsは、各パーティションが一度に1つのコンシューマーによってのみ読み取られ、各パーティションで論理コンシューマーグループが行った進行が忘れられない論理コンシューマーグループを作成する、高レベルの方法です。

パーティションごとのスループットが測定されるため、上りを最大限に活用している場合、2つの論理コンシューマーのみが速度を上げることができることを覚えておいてください。そのため、次のことができる十分なパーティションとスループットユニットがあることを確認する必要があります。

  1. 送信するすべてのデータを読み取ります。
  2. 問題が原因で数時間遅れる場合は、24時間の保持期間内に追いつきます。

結論として、消費者グループはあなたが必要とするものです。特定のコンシューマグループを使用する例は適切です。各論理コンシューマグループ内では、Azureコンシューマグループに同じ名前を使用し、異なる論理コンシューマグループで異なるものを使用しています。

私はまだAzure Stream Analyticsを使用していませんが、少なくともプレビューリリース中は デフォルトのコンシューマーグループ に制限されます。したがって、既定のコンシューマーグループを他のグループに使用しないでください。AzureStream Analyticsが2つ必要な場合は、厄介なことを行う必要があります。しかし、設定は簡単です!

32
cacsar