이 문서에서는 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(Stock Keeping Unit)의 최대 메시지 보존 시간에 의해 제한됩니다. 이러한 계층별 값에 대한 Event Hubs 할당량을 확인합니다.
여기에는 (즉, 로그 추가 시간) 대신 AppendTime
(즉, 이벤트 생성 시간)을 CreateTime
사용하도록 의 messageTimestampType
주제 구성을 업데이트하는 것이 포함됩니다.
기본 동작(필수)을 재정의하려면 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는 이를 더 확장하여 스트림과 테이블 간의 이중성을 도입합니다.
- 스트림은 테이블의 변경 로그로 간주될 수 있으며,
- 테이블은 스트림에서 각 키의 최신 값에 대한 스냅샷으로 간주될 수 있습니다.
이 이중성을 사용하면 테이블 및 스트림을 사용 사례에 필요한 대로 서로 바꿔 사용할 수 있습니다.
예를 들어
- 동적 트랜잭션(스트림으로 모델링됨)을 사용하여 정적 고객 데이터(테이블로 모델링됨) 조인 및
- 최신 시장 데이터 피드(스트림으로 모델링됨)를 사용하여 하루 트레이더 포트폴리오(스트림으로 모델링됨)에서 변화하는 포트폴리오 포지션을 조인합니다.
시간
Kafka Streams를 사용하면 창 및 유예 함수를 사용하여 순서가 다른 데이터 레코드를 수집하여 처리에 계속 포함할 수 있습니다. 이 동작이 결정론적임을 보장하기 위해 Kafka 스트림에는 더 많은 시간 개념이 있습니다. 다음을 포함합니다.
- 생성 시간('이벤트 시간'이라고도 함) - 이벤트가 발생하고 데이터 레코드가 생성된 시간입니다.
- 처리 시간 - 스트림 처리 애플리케이션에서 데이터 레코드를 처리하는 시간(또는 소비되는 시간)입니다.
- 추가 시간('생성 시간'이라고도 함) - 데이터가 저장되고 Kafka 브로커의 스토리지에 커밋되는 시간입니다. 이벤트 생성과 브로커의 실제 수집 사이의 시간 차이 때문에 생성 시간과 다릅니다.
상태 저장 작업
상태 관리를 사용하면 다양한 스트림의 데이터 조인 및 집계와 같은 정교한 스트림 처리 애플리케이션을 사용할 수 있습니다. 이는 Kafka Streams에서 제공하고 Kafka Streams DSL의 상태 저장 연산자를 사용하여 액세스하는 상태 저장소를 통해 수행됩니다.
DSL의 상태 저장 변환에는 다음이 포함됩니다.
- 집계
- 加入
- 창(집계 및 조인의 일부로)
- Processor API 통합을 위해 상태 저장(Stateful)이 될 수 있는 사용자 지정 프로세서 및 변환기 적용Applying custom processors and transformers, which can be stateful, for Processor API integration
창 및 유예
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 샘플을 참조하세요.