-
[Kafka] Partition 딥다이브📖 개발 공부/kafka 2023. 1. 18. 01:10
카프카의 토픽들은 여러 파티션으로 나뉘어진다.
토픽이 카프카에서 일종의 논리적인 개념이라면, 파티션은 토픽에 속한 레코드를 실제 저장소에 저장하는 가장 작은 단위다.
각각의 파티션은 Append-Only 방식으로 기록되는 하나의 로그 파일(물리적 파일)이다.
파티션의 특징은 병렬로 처리 가능하다는 것이다. 많은 양의 메시지 처리를 위해 파티션 수를 더 늘릴 수 있다.파티션의 레코드는 각각 offset 정보를 가진다.
이는 파티션 내에서 고유한 레코드의 순서를 의미하는 식별자다. 하나의 파티션 내에서는 메시지 순서가 보장된다. (메시지 순서 보장의 단위라 할 수 있다.)
하지만 하나의 토픽이 여러 파티션으로 구성되는 경우, 토픽 단위의 메시지 순서는 보장할 수 없다.
이는 파티션 내부에서의 순서는 보장되지만, 파티션 간의 순서는 보장되지 않기 때문이다.
만약 특정 키에 대해 우선 순서가 중요한 서비스라면, 파티션 키를 이용해서 특정 파티션으로 분배되도록 지정해줄 수 있다.
Producer는 파티션 키를 이용해서 특정 파티션에 메시지를 전달할 수 있다. 기본적으로 파티션 키는 해싱 함수를 통해 전달되고 해싱 함수는 동일한 키를 갖는 모든 레코드들이 동일한 파티션에 도착하는 것을 보장한다.
Producer가 레코드를 생성할 때 파티션 키를 명시하지 않으면, 카프카는 Round-Robin 방식을 이용해서 파티션을 분배한다. 이는 레코드들의 순서를 보장하지 않는다.
파티션과 컨슈머
컨슈머 그룹도 함께 이해하면 좋다.
카프카에서는 컨슈머가 직접 파티션으로부터 메시지를 읽어간다. 컨슈머는 브로커의 파티션과 연결해서 메시지들이 쓰여진 순서대로 메시지를 읽는다.
메시지의 offset은 컨슈머에서 커서와 같이 동작한다. 컨슈머는 메시지의 offset을 추적하여 메시지를 소비한다. 메시지를 읽고나면 컨슈머는 파티션의 다음 offset으로 커서를 이동한다. 이 과정을 반복한다.
파티션은 하나 이상의 컨슈머들로부터 소비가 될 수 있고, 각각 서로 다른 offset을 가지고 메시지를 읽을 수 있다.
컨슈머 그룹
컨슈머 그룹은 특정 토픽을 소비하는 컨슈머들을 하나의 그룹으로 묶어놓은 것이다. 컨슈머 그룹 내의 서버들끼리는 서로의 정보를 공유하고 있어, 만약 하나의 서버가 다운되더라도 다른 서버가 그 서버의 역할을 할 수 있게 된다.
동일한 컨슈머 그룹에 있는 컨슈머들은 동일한 group-id를 부여받고, 파티션 내의 메시지는 컨슈머 그룹 내의 컨슈머 중 하나에 의해서만 소비되는 것을 보장한다.
또한 컨슈머 그룹들은 자신의 그룹에 대한 Offset을 관리한다.
카프카에서는 하나의 파티션에 대해 컨슈머 그룹내 하나의 컨슈머 인스턴스만 접근할 수 있다.
그룹의 Maximum Parallelism 은 토픽의 파티션 개수와 동일하다. N개의 파티션이 존재하는 토픽에 N + 1개의 Consumer 가 있는 경우, N개의 Consumer 들은 파티션을 각각 배정받지만 남은 Consumer 는 다른 Consumer 가 장애가 발생하지 않는 한, idle 상태로 파티션에 배정되기를 기다리게 된다.
🔗 참고 링크
반응형'📖 개발 공부 > kafka' 카테고리의 다른 글
[Kafka] Spring Kafka JSON Batch (0) 2023.03.26 [Kafka] Commit (0) 2023.03.26 [Kafka] reset offset (0) 2023.02.25 [Kafka] Rebalancing (리밸런싱) (0) 2023.01.31 [Kafka] Kafka Architecture (0) 2023.01.14