SW개발/Kafka

6. Consumer

이상한개발자 2020. 9. 20. 23:45

Consumer Summary

1. 주요기능

 특정 파티션을 관리하고 있는 파티션 리더에게 메세지 가져오기 요청을 함

 

2. 종류

2.1 Old Consumer

Consumer의 Offset 저장을 주키퍼에 함

 

2.2 New Consumer

Consumer의 Offset 저장을 토픽에 함(0.9 버전 이후)

 

3. 주요 옵션

bootstrap.servers

fetch.min.bytes - 한 번에 가져올 수 있는 최소 데이터 사이즈

group.id - consumer가 속한 consumer group 식별자

enable.auto.commit

auto.offset.reset (3개 방식 존재)

  earliest - offset이 없는 경우 가장 초기의 offset으로 설정

  latest - offset이 없는 경우 가장 마지막의 offset으로 설정

  none - offset 없으면 error

fetch.max.bytes - 한 번에 가져올 수 있는 최대 데이터 사이즈

request.timeout.ms

seesion.timeout.ms

heartbeat.interval.ms

max.poll.records - 단일 호출 poll()에 대한 최대 레코드 수 조정

max.poll.interval.ms

auto.commit.interval.ms

fetch.max.wait.ms

 

4. 파티션의 메세지 순서

4.1 토픽의 파티션 1개 - 컨슈머 1개

  메세지가 순서대로 들어옴

4.2 토픽의 파티션 n개 - 컨슈머 1개

  데이터가 리더 파티션 메세지 - 다음 순서의 파티션 메세지... 순으로 읽어오면서 출력되는 데이터의 순서가 엉킨듯이 보임

 

5. Consumer Group

5.1 기능

 

 

하나의 토픽에 여러 컨슈머 그룹이 동시에 접속해 메세지를 가져올 수 있음

컨슈머 그룹에는 n개의 컨슈머가 포함되어있음

컨슈머 그룹마다 각자의 오프셋을 별도로 관리

 

5.2 Rebalance

프로듀서가 전송하는 메시지가 많아서 처리하지 못하는 경우에 컨슈머를 추가하는거나 또는 반대의 경우 삭제하는것.

토픽의 파티션 수 만큼 최대 컨슈머 수가 연결될 수 있음. 단, 리밸런스가 발생하면 컨슈머 그룹 전체를 일시적으로 사용할 수 없다는게 단점

 

6. Commit

각 파티션에 대해 현재 위치를 업데이트 하는 동작으로, 카프카 내에 별도로 내부에서 사용하는 토픽(__consumer_offsets)을 만들고 그 토픽에 오프셋 정보를 저장함.

 

리밸런스가 일어난 후 각각의 컨슈머는 이전에 처리했던 토픽의 파티션이 아닌 다른 새로운 파티션에 할당됨. 컨슈머는 새로운 파티션에 대해 가장 최근 커밋된 오프셋을 읽고 그 이후부터 메세지들을 가져오기 시작함.

 

6.1 자동커밋

enable.auto.commit=true 옵션 사용

auto.commit.interval.ms를 통해 주기설정 가능

 

6.2 수동커밋

개발자 코드에서 커밋 시점을 지정