Event Hubs における可用性と一貫性

この記事では、Azure Event Hubs でサポートされる可用性と整合性に関する情報を提供します。

可用性

Azure Event Hubs により、データセンター内の複数の障害ドメインにまたがるクラスター間で、個々のマシン、さらにはラック全体の致命的な障害のリスクが分散されます。 透過的な障害検出およびフェールオーバー メカニズムが実装されるため、通常はそのような障害が発生したときに顕著な中断なしに、保証されたサービスレベル内でサービスが動作し続けます。

可用性ゾーンを使用するリージョン内に Event Hubs 名前空間が作成されている場合、物理的に分離された 3 つの施設間で停止リスクがさらに分散されます。また、サービスには、施設全体の致命的な損失全体に瞬時に対処するための十分な容量が確保されています。 詳細については、「Azure Event Hubs geo ディザスター リカバリー」を参照してください。

パーティションの指定なしでクライアント アプリケーションによってイベント ハブにイベントが送信されると、イベントはイベント ハブのパーティション間に自動的に分散されます。 何らかの理由でパーティションが使用できない場合、イベントは残りのパーティション間で分散されます。 この動作により、アップ タイムを最大にすることができます。 最大のアップ タイム時間を必要とするユース ケースでは、特定のパーティションにイベントを送信する代わりに、このモデルを使用することをお勧めします。

一貫性

シナリオによっては、イベントの順序付けが重要になる場合があります。 たとえば、バックエンド システムで、delete コマンドの前に update コマンドを処理したいとします。 このシナリオでは、順序が維持されるように、クライアント アプリケーションによって特定のパーティションにイベントが送信されます。 コンシューマー アプリケーションによってパーティションからこれらのイベントが使用されるときに、それらは順番どおりに読み取られます。

この構成では、送信先の特定のパーティションが使用できない場合は、エラー応答が受信される点に注意してください。 比較のポイントとして、1 つのパーティションにアフィニティがない場合は、Event Hubs サービスによって次の利用可能なパーティションにイベントが送信されます。

したがって、高可用性が最も重要である場合は、(パーティション ID またはキーを使用して) 特定のパーティションをターゲットに設定しないでください。 パーティション ID またはキーを使用すると、イベント ハブの可用性がパーティション レベルにダウングレードされます。 このシナリオでは、可用性 (パーティション ID またはキーなし) と整合性 (イベントを特定のパーティションに固定) のどちらを優先するかを明確に選択することになります。 Event Hubs のパーティションの詳細については、「パーティション」を参照してください。

付録

パーティションを指定せずにイベントを送信する

Event Hubs サービスで負荷を複数のパーティションに分散できるようにするために、パーティション情報を設定せずにイベント ハブにイベントを送信することをお勧めします。 さまざまなプログラミング言語でそれを行う方法を学習するには、次のクイック スタートを参照してください。

特定のパーティションにイベントを送信する

このセクションでは、さまざまなプログラミング言語を使用して、特定のパーティションにイベントを送信する方法について説明します。

特定のパーティションにイベントを送信するには、CreateBatchOptionsPartitionId または PartitionKey を指定して、EventHubProducerClient.CreateBatchAsync メソッドを使用してバッチを作成します。 次のコードでは、パーティション キーを指定することによって、特定のパーティションにイベントのバッチを送信します。 Event Hubs によって、1 つのパーティション キー値を共有するすべてのイベントが一緒に格納され、到着順に配信されます。

var batchOptions = new CreateBatchOptions { PartitionKey = "cities" };
using var eventBatch = await producer.CreateBatchAsync(batchOptions);

また、SendEventOptionsPartitionId または PartitionKey を指定して、EventHubProducerClient.SendAsync メソッドを使用することもできます。

var sendEventOptions  = new SendEventOptions { PartitionKey = "cities" };
// create the events array
producer.SendAsync(events, sendOptions)

次のステップ

Event Hubs の詳細については、次のリンク先を参照してください: