Disponibilidade e consistência nos Hubs de Eventos
Este artigo fornece informações sobre a disponibilidade e a consistência com suporte dos 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, de racks completos em clusters que abrangem vários domínios de falha em um data center. Eles implementam mecanismos de failover e de detecção de falha transparente, de modo que o serviço continuará a operar dentro dos níveis de serviço garantidos e, normalmente, sem interrupções perceptíveis quando da ocorrência de tais falhas.
Se um namespace dos Hubs de Eventos for criado em uma região com zonas de disponibilidade, o risco de interrupção será distribuído em três instalações separadas fisicamente e o serviço terá reserva de capacidade suficiente para lidar instantaneamente com a perda total catastrófica de toda a instalação. Para saber mais, consulte Hubs de Eventos do Azure - Recuperação de desastre geográfico.
Quando um aplicativo cliente envia eventos para um hub de eventos sem especificar uma partição, os eventos são automaticamente distribuídos entre partições no 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 possível de tempo de atividade. Para casos de uso que exigem o tempo de atividade máximo, esse modelo é preferencial 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, você pode desejar que seu sistema de back-end processe um comando update antes de processar 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 de 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, caso não tenha afinidade com uma única partição, o serviço de Hubs de Eventos enviará seu evento para a próxima partição disponível.
Portanto, se alta disponibilidade for mais importante, não destine uma partição específica (usando uma chave/ID de partição). Usar uma chave/ID de partição faz o downgrade da disponibilidade de um hub de eventos para o nível de partição. Nesse cenário, você está fazendo uma opção explícita entre disponibilidade (sem chave/ID de partição) e consistência (fixando eventos a uma partição específica). Para obter informações detalhadas sobre partições em Hubs de Eventos, consulte Partições.
Apêndice
Enviar eventos sem especificar uma partição
É recomendável enviar eventos para um hub de eventos sem definir informações de partição a fim de permitir que o serviço de Hubs de Eventos equilibre a carga entre partições. Consulte os inícios rápidos a seguir para saber como fazer isso em diferentes linguagens de programação.
- Enviar eventos usando .NET
- Enviar eventos usando o Java
- Enviar eventos usando o JavaScript
- Enviar eventos usando o Python
Enviar eventos para uma partição específica
Nesta seção, você aprenderá a enviar eventos para uma partição específica usando linguagens de programação diferentes.
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);
Também é possível 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óximas etapas
Você pode saber mais sobre Hubs de Eventos visitando os links abaixo: