자기발전소/# Kafka_Confluent
[Kafka] Consumer
iamlucia
2021. 5. 19. 21:39
📌 kafka 및 Confluent 를 공부하며 정리하는 글
카프카에서 데이터를 읽어내는 방식을 알아보자.
Consumer
- topic(이름으로 식별 가능)으로부터 데이터를 읽는다.
- producer가 자동으로 어떤 broker에 write해야 할지 인식하는 것과 같이,
consumer 또한 어떤 broker로부터 데이터를 read 할지 자동으로 인식한다. - broker 장애 발생 시, producer와 마찬가지로 consumer는 복구하는 방법을 안다.
- 데이터는 각 파티션 내에서 순서대로 read된다.
- consumer가 복수의 파티션을 read하는 경우, 그 파티션은 하나의 consumer에 의해 병행적으로 read된다. 순서에 대한 보장은 없음 (하나의 파티션 내에서는 순서에 맞게 read되지만)
1) Consumer Groups
Consumer는 Consumer Group 안에서 데이터를 read 한다.
하나의 그룹 내 각 consumer는 서로 다른 파티션을 읽는다(exclusive한 관계).
파티션보다 consumer가 많다면, 유휴 consumer가 발생한다.
따라서, consumer를 많이 가지려면 partition 갯수를 늘려야 한다. (파티션의 갯수와 브로커의 갯수는 상관없다)
💡 Consumer는 Group Coordinator 와 Consumer Coordinator를 활용하여 consumer에 partition을 할당한다.
2) Consumer Offsets
카프카는 consumer group이 read하고 있는 offset을 저장해두는데, commit된 offset은 __consumer_offsets이라는 카프카 내부 토픽에 저장된다. 그래서 Consumer 하나에 장애가 났다 복구되는 경우, commit된 offset부터 다시 읽는다.
💡 컨슈머가 데이터를 처리하게 되면, 컨슈머는 offset을 commit하게 된다.
2) Delivery Semantics
컨슈머는 언제 offset을 commit할지 선정하는데, 3가지의 방식이 있다.
2-1) At most Once : 손실 가능
- 메세지를 받자마자 처리하기도 전에 offset을 commit한다.
- 만약 처리과정에 오류가 생기게 되면 메세지는 손실될 수 있다. (다시 이전으로 돌아가서 읽지 않기 때문에)
2-2) At Least Once : 중복 가능 (대체로 권장되는 방법)
- 메세지가 처리된 후에 offset이 commit된다.
- 만약 처리과정에 오류가 생기게 되면, 메세지는 다시 읽히게 되어 중복이 발생할 수 있다.
- 따라서 처리과정이 idempotent 특성을 가져야 한다 = 메세지를 한 번 더 처리하는 과정이 시스템에 영향을 주어서는 안된다.
2-3) Exactly Once : Idempotent Consume
- kafka to kafka workflow 에 해당 (Kafka Streams API를 사용한 통신 방식)
- Kafka -> External System 간 통신에서는 idempotent consumer 를 사용해야 한다.