Azure Event Hubs용 Kafka Streams
이 문서에서는 Azure Event Hubs를 사용하여 Kafka Streams 클라이언트 라이브러리를 사용하는 방법에 대한 세부 정보를 제공합니다.
참고 항목
Kafka Streams 기능은 Event Hubs Premium 및 전용 계층에 대한 공개 미리 보기에서만 사용할 수 있습니다.
개요
Apache Kafka Streams는 Kafka 토픽에 저장된 데이터에 대해 스트리밍 데이터를 처리하고 실시간 애플리케이션을 빌드하기 위한 프레임워크를 제공하는 Java 전용 클라이언트 라이브러리입니다. 출력이 대상 토픽에 기록되기 전에 Kafka 토픽은 중간 데이터의 데이터 저장소 역할을 하는 반면 모든 처리 범위는 클라이언트로 지정됩니다.
Event Hubs는 사용자 고유의 Kafka 클러스터를 실행하는 대신 기존 Kafka 클라이언트 애플리케이션과 함께 사용할 Kafka 엔드포인트를 제공합니다. Event Hubs는 대부분의 기존 Kafka 애플리케이션에서 작동합니다. 자세한 내용은 Apache Kafka용 Event Hubs를 참조하세요.
Azure Event Hubs에서 Kafka Streams 사용
Azure Event Hubs는 기본적으로 AMQP 및 Kafka 프로토콜을 모두 지원합니다. 그러나 호환되는 Kafka Streams 동작을 보장하려면 Kafka 클라이언트에 대해 일부 기본 구성 매개 변수를 업데이트해야 합니다.
속성 | Event Hubs의 기본 동작 | Kafka 스트림에 대한 수정된 동작 | 설명 |
---|---|---|---|
messageTimestampType |
다음으로 설정 AppendTime |
로 설정해야 합니다. CreateTime |
Kafka Streams는 타임스탬프를 추가하지 않고 생성 타임스탬프에 의존합니다. |
message.timestamp.difference.max.ms |
허용되는 최대 값은 90일입니다. | 속성은 과거 타임스탬프만 제어하는 데 사용됩니다. 이후 시간은 1시간으로 설정되며 변경할 수 없습니다. | 이는 Kafka 프로토콜 사양에 부합합니다. |
min.compaction.lag.ms |
허용되는 최대 값은 2일입니다. | ||
무한 보존 항목 | 각 토픽 파티션에 대해 250GB의 크기 기반 잘림 | ||
무한 보존 토픽에 대한 레코드 API 삭제 | 구현되지 않았습니다. 해결 방법으로 토픽을 업데이트하고 유한 보존 시간을 설정할 수 있습니다. | 이 작업은 GA에서 수행됩니다. |
기타 고려 사항
다음은 유의해야 할 몇 가지 다른 고려 사항입니다.
- Kafka 스트림 클라이언트 애플리케이션은 스트림 처리를 위한 임시 토픽을 만들 수 있도록 전체 네임스페이스에 대한 관리, 읽기 및 쓰기 권한을 부여해야 합니다.
- 임시 토픽 및 파티션은 지정된 네임스페이스의 할당량에 포함됩니다. 네임스페이스 또는 클러스터를 프로비전할 때는 이러한 사항을 고려해야 합니다.
- "오프셋" 저장소에 대한 무한 보존 시간은 SKU의 최대 메시지 보존 시간으로 제한됩니다. 이러한 계층별 값에 대한 Event Hubs 할당량을 확인합니다.
여기에는 토픽 구성 messageTimestampType
을 업데이트하여 (즉, 로그 추가 시간) 대신 이벤트 생성 시간)을 AppendTime
사용하는 CreateTime
것이 포함됩니다.
기본 동작(필수)을 재정의하려면 ARM(Azure Resource Manager)에서 아래 설정을 설정해야 합니다.
참고 항목
ARM 템플릿의 특정 부분만 업데이트해야 하는 구성을 강조 표시하는 것으로 표시됩니다.
{
"parameters": {
"namespaceName": "contoso-test-namespace",
"resourceGroupName": "contoso-resource-group",
"eventHubName": "contoso-event-hub-kafka-streams-test",
...
"parameters": {
"properties": {
...
"messageTimestampType": "CreateTime",
"retentionDescription": {
"cleanupPolicy": "Delete",
"retentionTimeInHours": -1,
"tombstoneRetentionTimeInHours": 1
}
}
}
}
}
Kafka Streams 개념
Kafka 스트림은 개발자가 실시간 스트리밍 시나리오를 더 빠르게 시작할 수 있도록 Kafka 생산자 및 소비자 API를 통해 간단한 추상화 계층을 제공합니다. 경량 라이브러리는 내부 메시징 계층에 대한 Apache Kafka 호환 브로커 (예: Azure Event Hubs)에 따라 달라지고 내결함성이 있는 로컬 상태 저장소를 관리합니다. 트랜잭션 API를 사용하여 Kafka 스트림 라이브러리는 정확히 한 번만 처리하고 한 번에 하나의 레코드를 처리하는 등 다양한 처리 기능을 지원합니다.
순서가 잘못된 레코드는 이벤트 시간 기반 기간 작업에서 이점을 얻을 수 있습니다.
참고 항목
Kafka Streams 설명서 및 Kafka Streams 핵심 개념을 숙지하는 것이 좋습니다.
스트림
스트림은 Kafka 토픽의 추상화된 표현입니다. 각 데이터 레코드가 키-값 쌍인 변경할 수 없는 데이터 레코드의 바인딩되지 않고 지속적으로 업데이트되는 데이터 집합으로 구성됩니다.
스트림 처리 토폴로지
Kafka 스트림 애플리케이션은 프로세서 토폴로지로 표시되는 DAG(방향성 순환 그래프)를 통해 계산 논리를 정의합니다. 프로세서 토폴로지는 스트림(토폴로지의 에지)에 의해 연결된 처리 단계를 나타내는 스트림 프로세서(토폴로지의 노드)로 구성됩니다.
스트림 프로세서는 특정 특수한 경우를 제외하고 업스트림 프로세서 또는 다운스트림 프로세서에 연결할 수 있습니다.
- 원본 프로세서 - 이러한 프로세서에는 업스트림 프로세서가 없으며 하나 이상의 스트림에서 직접 읽습니다. 그런 다음 다운스트림 프로세서에 연결할 수 있습니다.
- 싱크 프로세서 - 이러한 프로세서에는 다운스트림 프로세서가 없으며 스트림에 직접 작성해야 합니다.
스트림 처리 토폴로지는 Kafka Streams DSL 또는 하위 수준 프로세서 API를 사용하여 정의할 수 있습니다.
스트림 및 테이블 이중성
스트림과 테이블은 Kafka Streams DSL에서 제공하는 2개의 서로 다르지만 유용한 추상화로, 스트림 처리 사용 사례에 공존해야 하는 시계열 및 관계형 데이터 형식을 모두 모델링합니다.
Kafka는 이를 더 확장하고 스트림과 테이블 간의 이중성을 도입합니다. 여기서
- 스트림은 테이블의 변경 로그로 간주될 수 있으며,
- 테이블은 스트림에서 각 키의 최신 값에 대한 스냅샷으로 간주될 수 있습니다.
이 이중성을 사용하면 테이블 및 스트림을 사용 사례에 필요한 대로 서로 바꿔 사용할 수 있습니다.
예를 들어
- 동적 트랜잭션(스트림으로 모델링됨)을 사용하여 정적 고객 데이터(테이블로 모델링됨) 조인 및
- 최신 시장 데이터 피드(스트림으로 모델링됨)를 사용하여 하루 트레이더 포트폴리오(스트림으로 모델링됨)에서 변화하는 포트폴리오 포지션을 조인합니다.
Time
Kafka Streams를 사용하면 창 및 유예 함수를 사용하여 순서가 다른 데이터 레코드를 수집하여 처리에 계속 포함할 수 있습니다. 이 동작이 결정적인지 확인하기 위해 Kafka 스트림에 시간의 추가 개념이 있습니다. 여기에는 다음이 포함됩니다.
- 생성 시간('이벤트 시간'이라고도 함) - 이벤트가 발생하고 데이터 레코드가 만들어진 시간입니다.
- 처리 시간 - 스트림 처리 애플리케이션에서 데이터 레코드를 처리하거나 소비하는 시간입니다.
- 추가 시간('생성 시간'이라고도 함) - 데이터가 저장되고 Kafka broker의 스토리지에 커밋되는 시간입니다. 이는 이벤트 생성과 broker의 실제 수집 간의 시간 차이로 인해 생성 시간과 다릅니다.
상태 저장 작업
상태 관리를 사용하면 다양한 스트림의 데이터 조인 및 집계와 같은 정교한 스트림 처리 애플리케이션을 사용할 수 있습니다. 이는 Kafka Streams에서 제공하고 Kafka Streams DSL의 상태 저장 연산자를 사용하여 액세스하는 상태 저장소를 통해 수행됩니다.
DSL의 상태 저장 변환에는 다음이 포함됩니다.
창 및 유예
Kafka Streams DSL의 기간 이동 작업을 통해 개발자는 집계 및 조인과 같은 상태 저장 작업에 대해 지정된 키에 대한 레코드를 그룹화하는 방법을 제어할 수 있습니다.
또한 기간 지정 작업을 사용하면 유예 기간을 지정하여 지정된 기간의 순서가 벗어난 레코드에 대한 유연성을 제공할 수 있습니다. 지정된 창에 대한 레코드이며 지정된 기간 이후에 도착하지만 유예 기간 내에 도착하는 레코드입니다. 유예 기간이 끝난 후 도착하는 레코드는 삭제됩니다.
애플리케이션은 순서가 잘못된 레코드에 대한 내결함성을 개선하기 위해 기간 및 유예 기간 컨트롤을 활용해야 합니다. 적절한 값은 워크로드에 따라 다르며 경험적으로 식별되어야 합니다.
처리 보장
비즈니스 및 기술 사용자는 높은 트랜잭션 보장 요구 사항으로 변환되는 스트림 처리 워크로드의 출력에서 주요 비즈니스 인사이트를 추출하려고 합니다. Kafka 스트림은 Kafka 트랜잭션과 함께 작동하여 Kafka 호환 브로커(예: Azure Event Hubs) 기본 스토리지 시스템과 통합하여 트랜잭션 처리 보장을 보장하여 오프셋 커밋 및 상태 저장소 업데이트가 원자성으로 기록되도록 합니다.
트랜잭션 처리가 보장 processing.guarantee
되도록 하려면 Kafka Streams 구성의 at_least_once
exactly_once_v2
설정을 기본값에서 업데이트해야 합니다(Apache Kafka 2.5 이후의 클라이언트 버전) 또는 exactly_once
(Apache Kafka 2.5.x 이전의 클라이언트 버전).
다음 단계
이 문서는 Kafka용 Event Hubs에 대한 소개를 제공합니다. 자세한 내용은 Azure Event Hubs용 Apache Kafka 개발자 가이드를 참조하세요.
이벤트 허브를 만들고 SAS 또는 OAuth를 사용하여 액세스하는 단계별 지침이 포함된 자습서는 빠른 시작: Kafka 프로토콜을 사용하여 Event Hubs로 데이터 스트리밍을 참조하세요.
또한 GitHub의 OAuth 샘플을 참조하세요.