Event Hubs における可用性と一貫性Availability and consistency in Event Hubs

概要Overview

Azure Event Hubs はパーティション分割モデルを使用して、単一のイベント ハブで可用性と並列処理を向上させます。Azure Event Hubs uses a partitioning model to improve availability and parallelization within a single event hub. たとえば、イベント ハブに 4 つのパーティションがあり、そのうちの 1 つが、負荷分散操作によってあるサーバーから別のサーバーに移動されても、残りの 3 つのパーティションで送受信ができます。For example, if an event hub has four partitions, and one of those partitions is moved from one server to another in a load balancing operation, you can still send and receive from three other partitions. また、パーティションが増えると、より多くのリーダーがデータを同時に処理できるため、合計スループットが向上します。Additionally, having more partitions enables you to have more concurrent readers processing your data, improving your aggregate throughput. 分散システムでのパーティション分割と順序付けの意味合いを理解することは、ソリューション設計の重要な側面です。Understanding the implications of partitioning and ordering in a distributed system is a critical aspect of solution design.

順序付けと可用性のトレードオフを理解するには、CAP 定理をご覧ください。これはブリュワーの定理とも呼ばれています。To help explain the trade-off between ordering and availability, see the CAP theorem, also known as Brewer's theorem. この定理によると、一貫性、可用性、パーティション トレランスの中からの選択が考察されています。This theorem discusses the choice between consistency, availability, and partition tolerance. ネットワークごとにパーティション分割されたシステムの場合、常に一貫性と可用性のトレードオフがあることが示されています。It states that for the systems partitioned by network there is always tradeoff between consistency and availability.

ブリュワー定理によると、一貫性と可用性は次のように定義されています。Brewer's theorem defines consistency and availability as follows:

  • パーティション トレランス - パーティション障害が発生した場合でも、データ処理システムがデータ処理を継続する能力。Partition tolerance: the ability of a data processing system to continue processing data even if a partition failure occurs.
  • 可用性 - 障害の発生しないノードが適切な応答を適切な時間内に (エラーやタイムアウトなく) 返すこと。Availability: a non-failing node returns a reasonable response within a reasonable amount of time (with no errors or timeouts).
  • 一貫性 - 指定のクライアントで読み込みを実行したときに、必ず最新の書き込みデータが返ってくること。Consistency: a read is guaranteed to return the most recent write for a given client.

パーティション トレランスPartition tolerance

Event Hubs は、パーティション分割されたデータ モデルの上に構築されます。Event Hubs is built on top of a partitioned data model. Event Hub のパーティションの数はセットアップ時に構成できますが、後でこの値を変更することはできません。You can configure the number of partitions in your event hub during setup, but you cannot change this value later. Event Hubs でパーティションを使用する必要があるため、アプリケーションの可用性と一貫性について決定を行う必要があります。Since you must use partitions with Event Hubs, you have to make a decision about availability and consistency for your application.

可用性Availability

Event Hubs の使用を開始する最も簡単な方法は、既定の動作を使用することです。The simplest way to get started with Event Hubs is to use the default behavior. 新しい EventHubClient オブジェクトを作成し、 Send メソッドを使用すると、イベントはイベント ハブのパーティション間に自動的に分散されます。If you create a new EventHubClient object and use the Send method, your events are automatically distributed between partitions in your event hub. この動作により、アップ タイムを最大にすることができます。This behavior allows for the greatest amount of up time.

最大のアップ タイムを必要とするユース ケースでは、このモデルが適しています。For use cases that require the maximum up time, this model is preferred.

整合性Consistency

シナリオによっては、イベントの順序付けが重要になる場合があります。In some scenarios, the ordering of events can be important. たとえば、バックエンド システムで、delete コマンドの前に update コマンドを処理したいとします。For example, you may want your back-end system to process an update command before a delete command. この場合、イベントにパーティション キーを設定するか、PartitionSender オブジェクトを使用して特定のパーティションに対してのみイベントを送信できます。In this instance, you can either set the partition key on an event, or use a PartitionSender object to only send events to a certain partition. これにより、これらのイベントがパーティションから読み取られる際に、読み取られる順番が保証されます。Doing so ensures that when these events are read from the partition, they are read in order.

この構成では、送信先の特定のパーティションが使用できない場合は、エラー応答が受信される点に注意してください。With this configuration, keep in mind that if the particular partition to which you are sending is unavailable, you will receive an error response. 比較のポイントとして、1 つのパーティションにアフィニティがない場合、Event Hubs サービスは次の利用可能なパーティションにイベントを送信します。As a point of comparison, if you do not have an affinity to a single partition, the Event Hubs service sends your event to the next available partition.

順番を保証しつつ、アップ タイムも最大化するためのソリューションの 1 つは、イベント処理アプリケーションの一部としてイベントを集計することです。One possible solution to ensure ordering, while also maximizing up time, would be to aggregate events as part of your event processing application. これを実現する最も簡単な方法は、カスタムのシーケンス番号のプロパティをイベントにスタンプすることです。The easiest way to accomplish this is to stamp your event with a custom sequence number property. 次に例を示します。The following code shows an example:

// Get the latest sequence number from your application
var sequenceNumber = GetNextSequenceNumber();
// Create a new EventData object by encoding a string as a byte array
var data = new EventData(Encoding.UTF8.GetBytes("This is my message..."));
// Set a custom sequence number property
data.Properties.Add("SequenceNumber", sequenceNumber);
// Send single message async
await eventHubClient.SendAsync(data);

この例では、イベント ハブ内の利用可能なパーティションの 1 つにイベントを送信し、アプリケーションの対応するシーケンス番号を設定します。This example sends your event to one of the available partitions in your event hub, and sets the corresponding sequence number from your application. このソリューションでは処理アプリケーションで状態を保持する必要がありますが、送信者には、使用できる可能性の高いエンドポイントが提示されます。This solution requires state to be kept by your processing application, but gives your senders an endpoint that is more likely to be available.

次の手順Next steps

Event Hubs の詳細については、次のリンク先を参照してください:You can learn more about Event Hubs by visiting the following links: