Disponibilità e coerenza nell'Hub eventiAvailability and consistency in Event Hubs

PanoramicaOverview

Hub eventi di Azure usa un modello di partizionamento per migliorare la disponibilità e la parallelizzazione all'interno di un singolo hub eventi.Azure Event Hubs uses a partitioning model to improve availability and parallelization within a single event hub. Se ad esempio un hub eventi include quattro partizioni e una di queste partizioni viene spostata da un server a un altro in un'operazione di bilanciamento del carico, è comunque possibile inviare e ricevere dalle altre tre partizioni.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. Più partizioni consentono anche di avere più lettori simultaneamente che elaborano i dati, migliorando la velocità effettiva di aggregazione.Additionally, having more partitions enables you to have more concurrent readers processing your data, improving your aggregate throughput. Comprendere le implicazioni del partizionamento e dell'ordinamento in un sistema distribuito è un aspetto critico della progettazione di una soluzione.Understanding the implications of partitioning and ordering in a distributed system is a critical aspect of solution design.

Per spiegare il compromesso tra ordinamento e disponibilità, vedere il teorema CAP, noto anche come teorema di Brewer.To help explain the trade-off between ordering and availability, see the CAP theorem, also known as Brewer's theorem. Il teorema discute la scelta tra coerenza, disponibilità e tolleranza di partizione.This theorem discusses the choice between consistency, availability, and partition tolerance.

Il teorema di Brewer definisce coerenza e disponibilità come segue:Brewer's theorem defines consistency and availability as follows:

  • Tolleranza di partizione: la capacità di un sistema di elaborazione dei dati di continuare l'elaborazione dei dati anche se si verifica un errore della partizione.Partition tolerance: the ability of a data processing system to continue processing data even if a partition failure occurs.
  • Disponibilità: un nodo non di errore restituisce una risposta accettabile in un periodo ragionevole di tempo, senza errori o timeout.Availability: a non-failing node returns a reasonable response within a reasonable amount of time (with no errors or timeouts).
  • Coerenza: una lettura garantisce la restituzione della scrittura più recente per un determinato client.Consistency: a read is guaranteed to return the most recent write for a given client.

Tolleranza di partizionePartition tolerance

L'Hub eventi si basa su un modello di dati partizionato.Event Hubs is built on top of a partitioned data model. È possibile configurare il numero di partizioni nell'hub eventi durante l'installazione, ma non è possibile modificare questo valore in un secondo momento.You can configure the number of partitions in your event hub during setup, but you cannot change this value later. Poiché è obbligatorio usare le partizioni con l'Hub eventi, è necessario prendere una decisione relativa a disponibilità e coerenza dell'applicazione.Since you must use partitions with Event Hubs, you have to make a decision about availability and consistency for your application.

DisponibilitàAvailability

Il modo più semplice per iniziare a usare l'Hub eventi è il comportamento predefinito.The simplest way to get started with Event Hubs is to use the default behavior. Se si crea un nuovo oggetto EventHubClient e si usa il metodo Send, gli eventi vengono distribuiti automaticamente tra le partizioni nell'hub eventi.If you create a new EventHubClient object and use the Send method, your events are automatically distributed between partitions in your event hub. Questo comportamento consente la maggiore quantità di tempo di attività.This behavior allows for the greatest amount of up time.

Per i casi di uso che richiedono il massimo del tempo di attività, è preferibile usare questo modello.For use cases that require the maximum up time, this model is preferred.

CoerenzaConsistency

In alcuni scenari, l'ordinamento degli eventi può essere importante.In some scenarios, the ordering of events can be important. È ad esempio, potrebbe essere necessario che il sistema back-end elabori un comando di aggiornamento prima di un comando di eliminazione.For example, you may want your back-end system to process an update command before a delete command. In questo caso, è possibile impostare la chiave di partizione su un evento oppure usare un oggetto PartitionSender solo per inviare eventi a una determinata partizione.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. In tal modo, quando questi eventi vengono letti dalla partizione, vengono letti nell'ordine.Doing so ensures that when these events are read from the partition, they are read in order.

Con questa configurazione, tenere presente che se la partizione specifica alla quale si esegue l'invio non è disponibile, si riceverà una risposta di errore.With this configuration, keep in mind that if the particular partition to which you are sending is unavailable, you will receive an error response. Per fare un confronto, se non è presente un'affinità a una singola partizione, il servizio dell'Hub eventi invia l'evento alla partizione successiva disponibile.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.

Una possibile soluzione per garantire l'ordinamento ottimizzando allo stesso tempo i tempi di attività sarebbe l'aggregazione di eventi come parte dell'applicazione di elaborazione di eventi.One possible solution to ensure ordering, while also maximizing up time, would be to aggregate events as part of your event processing application. Il modo più semplice per eseguire questa operazione è contrassegnare l'evento con una proprietà con numero di sequenza personalizzato.The easiest way to accomplish this is to stamp your event with a custom sequence number property. Il codice seguente mostra un esempio: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);

In questo esempio l'evento viene inviato a una delle partizioni disponibili nell'hub eventi e il numero di sequenza corrispondente viene impostato dall'applicazione.This example sends your event to one of the available partitions in your event hub, and sets the corresponding sequence number from your application. Questa soluzione richiede che l'applicazione di elaborazione mantenga lo stato, ma propone ai mittenti un endpoint che ha maggiori probabilità di essere disponibile.This solution requires state to be kept by your processing application, but gives your senders an endpoint that is more likely to be available.

Passaggi successiviNext steps

Per ulteriori informazioni su Hub eventi visitare i collegamenti seguenti:You can learn more about Event Hubs by visiting the following links: