이벤트 기반 아키텍처 스타일

Azure IoT
Azure Stream Analytics

이벤트 기반 아키텍처는 이벤트 스트림을 생성하는 이벤트 생산자와 이벤트를 수신 대기하는 이벤트 소비자로 구성됩니다.

Diagram of an event-driven architecture style

이벤트는 거의 실시간으로 전달되므로 이벤트가 발생하는 즉시 소비자가 이벤트에 응답할 수 있습니다. 생산자와 소비자가 분리되므로 생산자는 수신 대기 중인 소비자를 알 수 없습니다. 소비자도 서로 분리되며 각 소비자에게 모든 이벤트가 표시됩니다. 이는 소비자가 큐에서 메시지를 끌어오고 오류가 없다고 가정할 경우 메시지가 한 번만 처리되는 경쟁 소비자 패턴과 다릅니다. IoT와 같은 일부 시스템에서는 매우 높은 볼륨으로 이벤트를 수집해야 합니다.

이벤트 기반 아키텍처는 게시/구독(pub/sub라고도 함) 모델 또는 이벤트 스트림 모델을 사용할 수 있습니다.

  • 게시자/구독자: 메시징 인프라에서 구독을 추적합니다. 이벤트가 게시되면 각 구독자에게 이벤트를 보냅니다. 이벤트를 받은 후에는 재생할 수 없으며 새 구독자는 이벤트를 볼 수 없습니다.

  • 이벤트 스트리밍: 이벤트가 로그에 기록됩니다. 이벤트가 파티션 내에 엄격하게 정렬되며 지속 가능합니다. 클라이언트는 스트림을 구독하지 않고, 대신 스트림의 일부에서 읽을 수 있습니다. 클라이언트가 스트림에서 해당 위치를 진행해야 합니다. 즉, 클라이언트가 언제든지 연결하고 이벤트를 재생할 수 있습니다.

소비자 측면에서 다음과 같은 몇 가지 일반적인 변형이 있습니다.

  • 단순 이벤트 처리. 이벤트가 즉시 소비자에서 작업을 트리거합니다. 예를 들어 서비스 버스 토픽에 메시지를 게시할 때마다 함수가 실행되도록 서비스 버스 트리거와 함께 Azure Functions를 사용할 수 있습니다.

  • 기본 이벤트 상관 관계입니다. 소비자는 일반적으로 일부 식별자와 상관 관계가 있는 소수의 개별 비즈니스 이벤트를 처리하여 이후 이벤트를 처리할 때 사용할 이전 이벤트의 일부 정보를 유지해야 합니다. 이 패턴은 NServiceBus 및 MassTransit같은 라이브러리에서 지원됩니다.

  • 복합 이벤트 처리. 소비자는 Azure Stream Analytics와 같은 기술을 사용하여 이벤트 데이터에서 패턴을 찾는 일련의 이벤트를 처리합니다. 예를 들어 포함된 디바이스에서 일정 기간 동안 읽은 값을 집계하고 이동 평균이 특정 임계값을 초과하면 알림을 생성할 수 있습니다.

  • 이벤트 스트림 처리. Azure IoT Hub 또는 Apache Kafka와 같은 데이터 스트리밍 플랫폼을 파이프라인으로 사용하여 이벤트를 수집하고 스트림 프로세서에 공급합니다. 스트림 프로세서는 스트림을 처리하거나 변환합니다. 애플리케이션의 각 하위 시스템에 사용되는 여러 스트림 프로세서가 있을 수 있습니다. 이 접근 방법은 IoT 워크로드에 적합합니다.

이벤트의 소스가 IoT 솔루션의 물리적 디바이스와 같이 시스템 외부에 있을 수도 있습니다. 이 경우 시스템이 데이터 원본에 필요한 볼륨 및 처리량으로 데이터를 수집할 수 있어야 합니다.

위의 논리 다이어그램에서 각 소비자 유형은 단일 상자로 표시됩니다. 실제로는 소비자가 시스템의 단일 실패 지점이 되지 않도록 한 소비자의 여러 인스턴스가 있는 것이 일반적입니다. 이벤트의 볼륨 및 빈도를 처리하기 위해 여러 인스턴스가 필요할 수도 있습니다. 또한 단일 소비자가 여러 스레드의 이벤트를 처리할 수 있습니다. 이벤트가 순서대로 처리되어야 하거나 정확히 한 번 처리되어야 하는 경우 이것이 문제가 될 수 있습니다. 조정 최소화를 참조하세요.

이 아키텍처를 사용하는 경우

  • 여러 하위 시스템이 동일한 이벤트를 처리해야 하는 경우.
  • 최소 시간 지연의 실시간 처리.
  • 패턴 일치 또는 일정 기간의 집계와 같은 복합 이벤트 처리.
  • 높은 볼륨 및 높은 데이터 개발속도(예: IoT).

이점

  • 생산자와 소비자가 분리됩니다.
  • 지점 간 통합이 없습니다. 시스템에 새 소비자를 쉽게 추가할 수 있습니다.
  • 이벤트가 도착하는 즉시 소비자가 이벤트에 응답할 수 있습니다.
  • 확장성이 있고 배포 가능합니다.
  • 하위 시스템에서 이벤트 스트림을 독립적으로 확인할 수 있습니다.

과제

  • 배달 보장. 일부 시스템, 특히 IoT 시나리오에서는 이벤트가 배달되도록 보장하는 것이 중요합니다.
  • 이벤트를 순서대로 또는 한 번만 처리. 복원 및 확장성을 위해 일반적으로 각 소비자 유형이 여러 인스턴스에서 실행됩니다. 이렇게 하면 이벤트를 순서대로 처리해야 하거나(소비자 유형 내에서) idempotent 메시지 처리 논리가 구현되지 않은 경우 문제가 발생할 수 있습니다.
  • 서비스 간에 메시지 조정 비즈니스 프로세스에는 전체 워크로드에서 일관된 결과를 얻기 위해 메시지를 게시하고 구독하는 여러 서비스가 포함되는 경우가 많습니다. 안무 패턴 및 사가 오케스트레이션같은 워크플로 패턴을 사용하여 다양한 서비스에서 메시지 흐름을 안정적으로 관리할 수 있습니다.

기타 고려 사항

  • 이벤트에 포함할 데이터의 양은 성능과 비용 모두에 영향을 주는 중요한 고려 사항일 수 있습니다. 이벤트 자체에서 처리하는 데 필요한 모든 관련 정보를 배치하면 처리 코드를 간소화하고 추가 조회를 저장할 수 있습니다. 몇 개의 식별자와 같은 최소한의 정보를 이벤트에 배치하면 전송 시간과 비용이 줄어들지만 필요한 추가 정보를 조회하려면 처리 코드가 필요합니다. 이에 대한 자세한 내용은 이 블로그 게시물을 참조하세요.
  • 요청은 요청 처리 구성 요소에만 표시되지만 해당 구성 요소가 사용하지 않거나 사용하지 않는 경우에도 워크로드의 여러 구성 요소에 이벤트가 표시되는 경우가 많습니다. "위반 가정" 사고방식을 사용하여 운영하려면 의도하지 않은 정보 노출을 방지하기 위해 이벤트에 포함되는 정보를 염두에 두어야 합니다.