Disponibilidade e consistência em Hubs de Eventos
Este artigo fornece informações sobre a disponibilidade e consistência suportadas pelo Hubs de Eventos do Azure.
Disponibilidade
Hubs de Eventos do Azure propaga o risco de falhas catastróficas de máquinas individuais ou mesmo de racks completos em clusters que abrangem vários domínios de falha num datacenter. Implementa mecanismos transparentes de deteção de falhas e ativação pós-falha de forma a que o serviço continue a funcionar dentro dos níveis de serviço garantidos e, normalmente, sem interrupções visíveis quando tais falhas ocorrem.
Se um espaço de nomes dos Hubs de Eventos for criado numa região com zonas de disponibilidade, o risco de indisponibilidade será distribuído por três instalações fisicamente separadas e o serviço tem reservas de capacidade suficientes para lidar instantaneamente com a perda total e catastrófica de toda a instalação. Para obter mais informações, veja Hubs de Eventos do Azure – Recuperação após desastre geográfico.
Quando uma aplicação cliente envia eventos para um hub de eventos sem especificar uma partição, os eventos são distribuídos automaticamente entre partições no hub de eventos. Se uma partição não estiver disponível por algum motivo, os eventos são distribuídos entre as restantes partições. Este comportamento permite a maior quantidade de tempo de espera. Para casos de utilização que requerem o tempo máximo de utilização, este modelo é preferido em vez de enviar eventos para uma partição específica.
Consistência
Em alguns cenários, a ordenação de eventos pode ser importante. Por exemplo, poderá querer que o seu sistema de back-end processe um comando de atualização antes de um comando eliminar. Neste cenário, uma aplicação cliente envia eventos para uma partição específica para que a ordenação seja preservada. Quando uma aplicação de consumidor consome estes eventos da partição, estes são lidos por ordem.
Com esta configuração, tenha em atenção que, se a partição específica para a qual está a enviar estiver indisponível, receberá uma resposta de erro. Como ponto de comparação, se não tiver uma afinidade com uma única partição, o serviço Hubs de Eventos envia o evento para a partição disponível seguinte.
Por conseguinte, se a elevada disponibilidade for mais importante, não direcione uma partição específica (utilizando o ID/chave da partição). A utilização do ID de partição/chave reduz a disponibilidade de um hub de eventos para o nível de partição. Neste cenário, está a fazer uma escolha explícita entre a disponibilidade (sem ID/chave de partição) e a consistência (afixar eventos a uma partição específica). Para obter informações detalhadas sobre as partições nos Hubs de Eventos, veja Partições.
Apêndice
Enviar eventos sem especificar uma partição
Recomendamos o envio de eventos para um hub de eventos sem definir informações de partição para permitir que o serviço dos Hubs de Eventos balancee a carga entre partições. Veja os seguintes guias de introdução para saber como fazê-lo em diferentes linguagens de programação.
- Enviar eventos com .NET
- Enviar eventos com Java
- Enviar eventos com JavaScript
- Enviar eventos com o Python
Enviar eventos para uma partição específica
Nesta secção, vai aprender a enviar eventos para uma partição específica através de diferentes linguagens de programação.
Para enviar eventos para uma partição específica, crie o lote com o método EventHubProducerClient.CreateBatchAsync ao especificar o PartitionId
ou o PartitionKey
em CreateBatchOptions. O código seguinte envia um lote de eventos para uma partição específica ao especificar uma chave de partição. Os Hubs de Eventos garantem que todos os eventos que partilham um valor de chave de partição são armazenados em conjunto e entregues por ordem de chegada.
var batchOptions = new CreateBatchOptions { PartitionKey = "cities" };
using var eventBatch = await producer.CreateBatchAsync(batchOptions);
Também pode utilizar o método EventHubProducerClient.SendAsync ao especificar PartitionId ou PartitionKey em SendEventOptions.
var sendEventOptions = new SendEventOptions { PartitionKey = "cities" };
// create the events array
producer.SendAsync(events, sendOptions)
Passos seguintes
Pode saber mais sobre os Hubs de Eventos ao aceder às seguintes ligações: