Miscellaneous

Kafka (카프카) 메시지 송수신

후아빠·2020년 5월 10일·조회 4,604

1. 개요

카프카의 메시지 송수신을 소개한다.

기타 카프카 관련 Tech Note는 다음과 같다.


2. 메시지 송수신

카프카에서 반드시 각 메시지 단위로 송수신하진 않는다. 송수신 처리량을 늘리기 위해 어느 정도 메시지를 축적하여 배치로 처리하는 기능도 제공한다.

프로듀서가 토픽의 파티션의 메시지를 송신할 때 버퍼와 같이 프로듀서의 메모리를 이용하여 일정량 보관 후 송신할 수 있다. 메시지 송신 트리거는 지정된 크기까지 메시지가 저장되거나 지정된 대기 시간을 사용할 수 있다.

기본 설정이라면 하나의 메시지는 1회 송신되나, 수 바이트~수십 바이트의 작은 메시지를 대량으로 브로커에 송신한다면 비효율적일 수 있기 때문에 이를 배치로 송신하면 처리량이 올라간다. 큰 텍스트 파일이나 로그 파일을 한줄 한줄 송신할 때도 여러 줄을 모아서 송신하면 처리량을 향상시킬 수 있다.

2.1. 컨슈머의 메시지 취득

컨슈머는 취득 대상의 토픽과 파티션에 대해 Current Offset으로 나타나는 위치에서 마지막으로 취득한 메시지부터 브로커에서 보관하는 최신 메시지까지 모아서 요청 및 취득을 실시한다. 그리고 그것을 반복하여 계속 메시지를 취득한다. 메시지 유입빈도가 동일하다면 컨슈머의 브로커 요청 간격이 길수록 수집된 메시지가 많아진다.

2.1.1. 작은 범위로 요청

요청으로 하나의 메시지를 취득하는 경우 각 메시지마다 Current Offset을 업데이트한다.

2.1.2. 일정 간격으로 요청

한 요청으로 여러 메시지를 취득하는 경우 메시지 수 만큼 Current Offset을 업데이트한다.

2.2. 컨슈머의 롤백

컨슈머는 오프셋을 진행하면서 지속적으로 메시지를 취득하나, Offset Commit 구조를 이용하여 컨슈머 처리 실패, 고장 시 롤백 메시지 재취득을 수행한다.

주의할 점은 Commit Offset까지 되돌아온 오프셋 간 메시지에 대한 대처는 후속 애플리케이션에 맡긴다라는 점이다.

메시지를 처리 완료 상태에서 Commit Offset 업데이트 직전에 문제가 생긴다면 동일 메시지가 재전송되고 메시지 중복 처리(or 중복 허용)이 필요하다. 이 재시도는 Exactly Once가 아니라 At Least Once로 송신하는 구조이다. 또 문제를 감지하고, 복구하는 것도 카프가가 제공하는 것이 아니기 때문에 컨슈머 API를 통해 애플리케이션에서 구현해야 한다. Spark Streaming 등 카프가 연계 기능을 제공하는 대부분의 분산 처리 솔루션은 컨슈머 문제나 장애를 감지하여 재실행하는 기능을 제공한다.

2.3. 메시지 전송 시 파티셔닝

프로듀서에서 송신하는 메시지를 어떻게 파티션으로 보낼지 결정하는 파티셔닝 기능이 있다.

송신 메시지에 포함된 Key, Value 중 Key의 명시적인 지정 여부에 따라 다음 두가지 패턴 로직으로 송신된다.

  • Key의 해시 값을 사용한 송신 : 메시지의 Key를 명시적으로 지정함으로써 Key에 따라 송신처 파티션을 결정하는 로직. 동일한 Key를 가진 메시지라면 동일한 ID의 파티션에 송신됨
  • 라운드 로빈에 의한 송신 : 메시지 Key를 지정하지 않고 Null인 경우 여러 파티션으로의 메시지 송신을 라운드 로빈 방식으로 실행

예를 들어보자. 웹 access log를 송신한다면 Client IP에 따라 파티션별로 나누는 경우, Client IP를 Key로 설정하여 전송할 수 있다.

해시에 의한 파티셔닝을 이용하면 동일 Key 메시지를 동일 컨슈머에서 취득하여 처리하는 식으로 제어할 수 있다. 하지만 파티셔닝을 이용하는 경우는 데이터 편차에 따른 편향이 발생할 수 있다. 극단적으로는 파티션 수에 대해 Key 종류가 충분치 않을 때 파티션에 편향이 발생하여 리소스를 부분적으로 사용할 수 없게 된다.

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.