Disponibilidade e consistência em Hubs de Eventos
Este artigo fornece informações sobre disponibilidade e consistência suportadas pelos Hubs de Eventos do Azure.
Disponibilidade
Os Hubs de Eventos do Azure espalham o risco de falhas catastróficas de máquinas individuais ou até mesmo racks completos entre clusters que abrangem vários domínios de falha em um datacenter. Ele implementa mecanismos transparentes de deteção de falhas e failover, de modo que o serviço continue a operar dentro dos níveis de serviço garantidos e, normalmente, sem interrupções percetíveis quando tais falhas ocorrerem.
Se um namespace de Hubs de Eventos for criado em uma região com zonas de disponibilidade, o risco de interrupção será ainda mais espalhado por três instalações fisicamente separadas, e o serviço terá reservas de capacidade suficientes para lidar instantaneamente com a perda completa e catastrófica de toda a instalação. Para obter mais informações, consulte Hubs de Eventos do Azure - Recuperação de desastres geográficos.
Quando um aplicativo cliente envia eventos para um hub de eventos sem especificar uma partição, os eventos são distribuídos automaticamente entre partições em seu hub de eventos. Se uma partição não estiver disponível por algum motivo, os eventos serão distribuídos entre as partições restantes. Esse comportamento permite a maior quantidade de tempo de atividade. Para casos de uso que exigem o tempo máximo de atividade, esse modelo é preferido em vez de enviar eventos para uma partição específica.
Consistência
Em alguns cenários, a ordenação dos eventos pode ser importante. Por exemplo, você pode querer que seu sistema back-end processe um comando update antes de um comando delete. Nesse cenário, um aplicativo cliente envia eventos para uma partição específica para que a ordem seja preservada. Quando um aplicativo consumidor consome esses eventos da partição, eles são lidos em ordem.
Com essa configuração, tenha em mente que, se a partição específica para a qual você está enviando não estiver disponível, você receberá uma resposta de erro. Como ponto de comparação, se você não tiver afinidade com uma única partição, o serviço Hubs de Eventos enviará seu evento para a próxima partição disponível.
Portanto, se a alta disponibilidade for mais importante, não direcione uma partição específica (usando ID/chave de partição). O uso de ID/chave de partição reduz a disponibilidade de um hub de eventos para o nível de partição. Nesse cenário, você está fazendo uma escolha explícita entre disponibilidade (sem ID/chave de partição) e consistência (fixar eventos em uma partição específica). Para obter informações detalhadas sobre partições em Hubs de Eventos, consulte Partições.
Anexo
Enviar eventos sem especificar uma partição
Recomendamos enviar eventos para um hub de eventos sem definir informações de partição para permitir que o serviço Hubs de Eventos equilibre a carga entre partições. Veja os seguintes inícios rápidos para aprender a fazê-lo em diferentes linguagens de programação.
- Enviar eventos usando o .NET
- Enviar eventos usando Java
- Enviar eventos usando JavaScript
- Enviar eventos usando Python
Enviar eventos para uma partição específica
Nesta seção, você aprenderá a enviar eventos para uma partição específica usando diferentes linguagens de programação.
Para enviar eventos para uma partição específica, crie o lote usando o método EventHubProducerClient.CreateBatchAsync especificando o PartitionId
ou o PartitionKey
em CreateBatchOptions. O código a seguir envia um lote de eventos para uma partição específica especificando uma chave de partição. Os Hubs de Eventos garantem que todos os eventos que compartilham um valor de chave de partição sejam armazenados juntos e entregues em ordem de chegada.
var batchOptions = new CreateBatchOptions { PartitionKey = "cities" };
using var eventBatch = await producer.CreateBatchAsync(batchOptions);
Você também pode usar o método EventHubProducerClient.SendAsync especificando PartitionId ou PartitionKey em SendEventOptions.
var sendEventOptions = new SendEventOptions { PartitionKey = "cities" };
// create the events array
producer.SendAsync(events, sendOptions)
Próximos passos
Pode saber mais sobre os Hubs de Eventos ao aceder às seguintes ligações: