Offset이란?
- 각 파티션마다 메시지가 저장되는 위치를 오프셋이라고 한다. 그 위치는 해당 파티션 내에서 유니크하고 순차적인 숫자 형태로 표시된다.(토픽 기준으로는 유니크하지 않다. 파티션이 여러 개이기 때문)
-
이 오프셋을 이용해 메시지의 순서가 보장되며, 절대 오프셋 순서가 바뀐 상태로 컨슈머가 데이터를 가져갈 수는 없다.
- 단, 토픽은 여러 파티션으로 이루어져있기 때문에 토픽 차원에서는 기본적으로 메시지 순서가 보장되지 않는다.
Consumer Group이란?
-
여러 컨슈머를 하나의 그룹으로 묶어서 group을 지정할 수 있는데, 이렇게 그룹으로 묶인 컨슈머끼리는 동일한 데이터를 중복으로 컨슘하지 않도록 설게되어있다.
- 즉, 서로 다른 그룹의 컨슈머라면 동일한 데이터를 각각 컨슘하게 될 수 있다.
- [응용] 만일 여러 애플리케이션을 운영한다고 가정할 때, 각 애플리케이션에서 하나 이상의 토픽에 저장된 모든 메시지를 읽어야 할 때는 애플리케이션마다 컨슈머 그룹을 지정해주면 되겠다.
Partition Rebalancing
- 한 컨슈머로부터 다른 컨슈머로 파티션 소유권을 이전하는 것을 의미한다.
- 리밸런싱이 자주 일어나면 성능상 이슈가 발생한다. 그 과정에서 컨슈머들이 토픽의 데이터를 읽지 못하기 때문이다.
리밸런싱은 언제 일어나나?
- 컨슈머가 늘어나거나 컨슈머가 줄어드는 등 변화가 생길 때 group coordinator가 그걸 감지하여 리밸런싱한다.(배포할 때 주의해야겠다.)
- 각 컨슈머는 그룹 코디네이터에게 자신이 살아있다는 걸 알리기 위해
heartbeat.interval.ms주기로 heartbeat를 보낸다. 그런데session.timeout.ms에 해당하는 시간이 지나도록 heartbeat가 오지 않으면 해당 컨슈머가 종료되거나 문제가 있는 걸로 간주하여 리밸런싱이 일어난다. max.poll.interval.ms내에poll()을 호출하지 않으면 해당 컨슈머에 문제가 생겼다고 간주하여 리밸런싱이 일어난다.
Lag이란?
아래 명령어를 실행하면 각 컨슈머그룹의 파티션별 lag을 확인 가능하다.
kafka-consumer-groups --bootstrap-server <host:port> --group <group.id> --describe실행 결과:
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
example.topic 0 6392623366 6392623859 493 consumer-1-f6f6ffb0-1054-46b9-af13-0b254bc14da0 /10.64.69.95 consumer-1
example.topic 1 6394637143 6394637383 240 consumer-10-6c57b320-7742-4418-8e15-b7d735da346e /10.64.69.95 consumer-2
example.topic 2 6397170269 6397170495 226 consumer-19-dbed41a1-42bb-4ecb-bc8f-84e47c74dbe8 /10.64.69.95 consumer-3
example.topic 3 6397170269 6397170495 226 consumer-19-dbed41a1-42bb-4ecb-bc8f-84e47c74dbe8 /10.64.69.95 consumer-4-
Current offset이란, 각 Consumer Group 에서 각 파티션의 어느 오프셋까지 컨슘했는지를 나타내는(정확히는, 어느 오프셋까지 commit했는지를 나타내는) 값이다.
- [참고] Kafka 클러스터의 Internal topic인
__consumer_offsets를 통해 관리하며, consumer에서 commit이 일어나면 변경된다.
- [참고] Kafka 클러스터의 Internal topic인
- Log end offset이란, 각 파티션의 실제 마지막 offset 값이다.
- Lag이란, 이 두 값의 차이이다. Lag이 늘어난다면 메시지의 생산 속도를 컨슘 속도가 못따라가고 있다는 의미다.
[참고자료]
고승범 외(2018), 카프카: 데이터 플랫폼의 최강자, 책만.
https://steemit.com/kr/@yjiq150/kafka-consumer-offset-reset
https://jyeonth.tistory.com/30