Event Hubs의 가용성 및 일관성Availability and consistency in Event Hubs

이 문서에서는 Azure Event Hubs에서 지 원하는 가용성 및 일관성에 대 한 정보를 제공 합니다.This article provides information about availability and consistency supported by Azure Event Hubs.

가용성Availability

Azure Event Hubs는 개별 컴퓨터의 치명적인 오류에 대 한 위험을 분산 하거나 데이터 센터 내의 여러 장애 도메인에 걸쳐 있는 클러스터 전체에 걸쳐 전체 랙을 분산 합니다.Azure Event Hubs spreads the risk of catastrophic failures of individual machines or even complete racks across clusters that span multiple failure domains within a datacenter. 이러한 오류는 투명 한 오류 감지 및 장애 조치 (failover) 메커니즘을 구현 하 여 서비스가 서비스 수준에서 계속 작동 하 고, 일반적으로 이러한 오류가 발생 하는 경우 눈에 띄게 중단 되지 않도록 합니다.It implements transparent failure detection and failover mechanisms such that the service will continue to operate within the assured service-levels and typically without noticeable interruptions when such failures occur. 가용성 영역에 대해 enabled 옵션을 사용 하 여 Event Hubs 네임 스페이스를 만든 경우 중단 위험은 실제로 분리 된 세 가지 기능에 추가로 분산 되며 서비스에는 전체 기능의 완전 한 치명적인 손실을 신속 하 게 처리할 수 있는 충분 한 용량 예약이 있습니다.If an Event Hubs namespace has been created with the enabled option for availability zones, the outage risk is further spread across three physically separated facilities, and the service has enough capacity reserves to instantly cope with the complete, catastrophic loss of the entire facility. 자세한 내용은 Azure Event Hubs-지역 재해 복구를 참조 하세요.For more information, see Azure Event Hubs - Geo-disaster recovery.

클라이언트 응용 프로그램에서 이벤트 허브로 이벤트를 보낼 때 이벤트는 이벤트 허브의 파티션 사이에 자동으로 분산 됩니다.When a client application sends events to an event hub, events are automatically distributed among partitions in your event hub. 어떤 이유로 파티션을 사용할 수 없는 경우 이벤트는 나머지 파티션에 분산 됩니다.If a partition isn't available for some reason, events are distributed among the remaining partitions. 이 동작을 사용하면 가동 시간을 최대화할 수 있습니다.This behavior allows for the greatest amount of up time. 최대 가동 시간을 필요로 하는 사용 사례의 경우이 모델을 사용 하 여 특정 파티션에 이벤트를 전송 하는 대신이 모델을 사용 하는 것이 좋습니다.For use cases that require the maximum up time, this model is preferred instead of sending events to a specific partition. 자세한 내용은 파티션을 참조하세요.For more information, see Partitions.

일관성Consistency

일부 시나리오에서는 이벤트의 순서가 중요합니다.In some scenarios, the ordering of events can be important. 예를 들어, 백 엔드 시스템에서 삭제 명령 전에 업데이트 명령을 처리하려고 할 수 있습니다.For example, you may want your back-end system to process an update command before a delete command. 이 시나리오에서 클라이언트 응용 프로그램은 순서가 유지 되도록 이벤트를 특정 파티션으로 보냅니다.In this scenario, a client application sends events to a specific partition so that the ordering is preserved. 소비자 응용 프로그램은 파티션에서 이러한 이벤트를 사용 하 여 순서 대로 읽습니다.When a consumer application consumes these events 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. 비교 시점으로 단일 파티션에 대 한 선호도가 없는 경우 Event Hubs 서비스는 사용 가능한 다음 파티션으로 이벤트를 보냅니다.As a point of comparison, if you don't have an affinity to a single partition, the Event Hubs service sends your event to the next available partition.

가동 시간을 극대화하는 동시에 순서도 지정할 수 있는 한 가지 솔루션은 이벤트 처리 애플리케이션의 일부로 이벤트를 집계하는 것입니다.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 it is to stamp your event with a custom sequence number property.

이 시나리오에서 생산자 클라이언트는 이벤트 허브에서 사용 가능한 파티션 중 하나에 이벤트를 보내고 응용 프로그램에서 해당 시퀀스 번호를 설정 합니다.In this scenario, producer client sends events 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.

부록Appendix

.NET 예제.NET examples

특정 파티션으로 이벤트 전송Send events to a specific partition

이벤트에 파티션 키를 설정 하거나 PartitionSender 개체 (이전 Microsoft. Azure. Messaging 라이브러리를 사용 하는 경우)를 사용 하 여 특정 파티션에만 이벤트를 전송 합니다.Either set the partition key on an event, or use a PartitionSender object (if you are using the old Microsoft.Azure.Messaging library) 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.

최신 EventHubs 라이브러리를 사용 하는 경우 파티션에 이벤트를 게시 하기 위해 분할 된 발신자에서 EventHubProducerClient로 코드 마이그레이션을 참조 하세요.If you are using the newer Azure.Messaging.EventHubs library, see Migrating code from PartitionSender to EventHubProducerClient for publishing events to a partition.

var connectionString = "<< CONNECTION STRING FOR THE EVENT HUBS NAMESPACE >>";
var eventHubName = "<< NAME OF THE EVENT HUB >>";

await using (var producerClient = new EventHubProducerClient(connectionString, eventHubName))
{
    var batchOptions = new CreateBatchOptions() { PartitionId = "my-partition-id" };
    using EventDataBatch eventBatch = await producerClient.CreateBatchAsync(batchOptions);
    eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("First")));
    eventBatch.TryAdd(new EventData(Encoding.UTF8.GetBytes("Second")));
    
    await producerClient.SendAsync(eventBatch);
}

시퀀스 번호 설정Set a sequence number

다음 예제에서는 사용자 지정 시퀀스 번호 속성을 사용 하 여 이벤트를 스탬프 처리 합니다.The following example stamps your event with a custom sequence number property.

// create a producer client that you can use to send events to an event hub
await using (var producerClient = new EventHubProducerClient(connectionString, eventHubName))
{
    // get the latest sequence number from your application
    var sequenceNumber = GetNextSequenceNumber();

    // create a batch of events 
    using EventDataBatch eventBatch = await producerClient.CreateBatchAsync();

    // 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);

    // add events to the batch. An event is a represented by a collection of bytes and metadata. 
    eventBatch.TryAdd(data);

    // use the producer client to send the batch of events to the event hub
    await producerClient.SendAsync(eventBatch);
}

이 예에서는 이벤트 허브에서 사용 가능한 파티션 중 하나에 이벤트를 보내고 애플리케이션에서 해당 시퀀스 번호를 설정합니다.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: