카프카 프로듀서·컨슈머 자주 묻는 질문 정리

카프카 프로듀서·컨슈머 자주 묻는 질문 정리

카프카 프로듀서, 컨슈머 질문사항으로 많이 나오는 항목에 대한 답변 정리를 하겠습니다. 해당 내용을 바탕으로 실무에서 카프카가 어떻게 활용되고 있는지를 보다 명확히 알 수 있는 계기가 되었으면 합니다.

프로듀서 관련

  • 프로듀서 언어로 어떤 것이 좋은가?

→ 확답할 수 없음. 서비스 환경에 맞춰 사용하면 됨.

Build Client Applications for Confluent Platform | Confluent Documentation

→ 자바 Java

Kafka Java Client | Confluent Documentation

https://github.com/apache/kafka

→ 파이썬 Python

Kafka Python Client | Confluent Documentation

https://github.com/dpkp/kafka-python

→ 고 Go

Kafka Go Client | Confluent Documentation

https://github.com/Shopify/sarama

→ 닷넷 .Net

Kafka .NET Client | Confluent Documentation

  • 메시지 순서를 보장하는 방법은?

→ 키를 이용해 전송하는 방법도 있지만, 파티션 수를 1로 설정해서 신규 토픽을 생성해서 사용하는 방법 추천

  • 메시지 순서 중요한데 토픽의 파티션을 1로 하지 않고 여러 개의 파티션을 사용해서 순서를 보장하는 방법은?

→ 없음. 메시지의 키값을 이용해 각 파티션에 한해 메시지 순서를 보장할 수는 있지만 여러 개의 파티션 전체에 대한 메시지 순서는 보장할 수 없음.

  • 배치 전송의 옵션은 어떻게 사용하는가?

→ 프로듀서의 batch.size, linger.ms 조정해서 사용 가능함. 두 옵션의 값은 정담이 없어 linger.ms : 10~100 정도 사이의 값으로 사용. linger.ms 경우 기본값이 0이므로 배치 전송을 하고자 한다면 반드시 설정해야 함.

  • 카프카에서 지원하는 압축포맷 중 무엇을 사용해야 하는가?

→ gzip, zstd, zanppy, lz4가 있음. 낮은 지연시간이 중요하다면 sanppy, lz4 사용 권장, 높은 압출률은 gzip, zstd 사용 권장. 가장 추천하는 건 lz4 권장.

  • 프로듀서 메시지 전송 시 키를 사용하는 것이 맞는가?

→ 프로듀서에서 키를 이용한 전송은 필숫값이 아닌 선택사항임. 필요한 경우가 아닌 경우 사용하지 않는 것을 권장.

  • 프로듀서 메시지 전송 시 특정 파티션으로 전송할 수 있는가?

→ 프로듀서에서 키를 기반으로 전송하는 경우 커스텀 파티셔너를 이용해 특정 파티션으로 메시지를 전송할 수 있음.

→ 예제

kafka-definitive-guide/kafka-definitive-guide-chapter3/src/java/com/kafkadefinitiveguide/producer/partitioner/custompartitioner/BananaPartitioner.java at master · wuyichen24/kafka-definitive-guide

컨슈머 질문사항

  • 메시지가 중복으로 확인되는 경우

→ 콘솔 컨슈머를 이용해 메시지가 중복인지 확인하고 여기서 중복이 확인되면 프로듀서에서 중복으로 전송했는지 확인해야 함.

  • 메시지 손실 없이 정확하게 한 번 가져올 수 있는 방법

→ 컨슈머서 중복에 대한 처리 로직을 따로 구현할 것을 추천. 카프카 커넥트 등은 싱크 저장소에 따라 정확히 한 번 기능을 제공하는 것이 있음.

  • 컨슈머의 옵션 중 자동 커밋을 사용해도 되는가?

→ 컨슈머의 자동 커밋의 기본값은 enable.auto.commit=true. 자동 커밋을 설정해두면 편리하고 오프셋을 따로 관리하지 않아도 됨. 컨슈머가 자주 다운되거나 컨슈머 점검 등이 빈번하여 정확한 처리를 목적으로 한다면 enable.auto.commit=false로 설정하여 수동으로 관리

  • 메시지가 중복되더라도 반드시 손실 없이 처리돼야 하는 경우 옵션 설정은?

→ 컨슈머에서 메시지를 꺼내오는 동작은 poll(), 오프셋을 커밋하는 동작은 commitSync()임. 컨슈머 프로그래밍 시 poll()동작 이후에 가져온 메시지를 처리하는 로직을 추가하고 메시지 처리가 완료된 후 commitSync()를 실행하면 손실 없이 메시지 처리가 가능함. commitSync() 방식은 성능이 다소 떨어지므로 참고.

  • 컨슈머 LAG 모니터링은 어떻게 하는가.

→ Burrow 버로우라는 애플리케이션을 이용하는 LAG 모니터링이 대표적임. 다른 대안으로 그라파나+프로메테우스+익스포터 조합으로 모니터링을 많이 사용함. 알림은 프로메테우스+알림매니저 나 그라파나 대시보드 알림을 이용. 알림매니저 사용을 추천.

  • 특정 시점을 기준으로 토픽의 메시지를 다시 가져와야 하는 경우

→ 카프카 CLI(kafka-consumer-groups.sh)를 이용해 해당 컨슈머 그룹의 오프셋을 리셋할 수 있음. 리셋하는 기준은 특정 날짜, 특정 오프셋, 가장 최근, 가장 오래전 등으로 리셋함.

  • 하나의 컨슈머 그룹으로 여러 개의 토픽을 컨슘해도 되나요?

→ 가능함. 단, 특정 토픽의 정상 컨슘 여부를 확인하거나 특정 토픽에 대한 컨슈머의 메트릭을 확인하고 싶은 경우는 정확한 정보를 파악하기 어려움. 가능하다면 하나의 컨슈머 그룹으로 하나의 토픽을 컨슘하는 것을 추천.

  • 컨슈머 그룹의 이름을 변경할 수 있는가?

→ 변경 불가. 하지만 오프셋 정보를 변경하여 이름 변경은 가능함. 가령, A 컨슈머를 중지시키고 B 컨슈머를 A컨슈머의 오프셋으로 리셋시키면 A가 B로 변경한 효과가 됨.

  • 컨슈머 그룹을 삭제하고 싶습니다. 어떻게 해야 하나요?

→ CLI(kafka-consumer-group.sh)를 이용해 원하는 컨슈머 그룹을 삭제할 수 있음.

카프카 도입 사례에 대한 설명이 필요하신 분은 여기 링크를 참고바랍니다.

좀더 자세한 설명을 원하시는 분은 실전 카프카 개발부터 운영까지 도서를 참고바립니다.


Back to top