no image
kafka-spring Producer key에 따른 partition 배정
카프카 producer key CompletableFuture future = kafkaTemplate.send(MSG_TOPIC, key, msg.getMsg()); future.whenComplete((result, ex) -> { System.out.println("future : " + result.getProducerRecord().value()); }); producer에 key가 있을 수도 있고 없을 수도 있다. 있다면 그 key로 해시값을 만들어 동일한 key라면 동일한 partition에 메세지를 전송할 수 있고 없으면 메세지를 라운드로빈으로 적절히 파티션들에 분산시키는 듯 하다. Consumer partition @Bean public NewTopic messageTopic() { re..
2023.09.03
docker bitnami/kafka 주키퍼없이(KRaft)
KRaft 모드 카프카에 대해 조사를 해보면 카프카의 메타 데이터, 브로커 상태, 토픽 상태 등을 관리하기 위해 주키퍼를 사용하는 것을 볼 수 있다. 그런데 docker kafka 이미지들을 보면 zookeeper 없이 구성된 docker-compose를 볼 수 있는데 카프카의 최근 버전에서는 주키퍼 없이 카프카를 사용할 수 있는 구조를 지향한다고 한다. 그래서 주키퍼없이 자체적으로 메타데이터를 관리하기 위해 만들어진 것이 KRaft 모드이고 QUORUM 컨트롤러는 KRaft 와 관련된 키워드이다. bitnami/kafka services: kafka: image: bitnami/kafka:latest ports: - '9092:9092' environment: # KRaft settings - KAFK..
2023.09.02
spring kafka - @KafkaListener Annotation
@KafkaListener Annotation 많은 consumer의 방법 중 하나이다. @KafkaListener(id = "foo", topics = MSG_TOPIC, clientIdPrefix = "myClientId") public void listen(String data) { System.out.println(data); } 사용 방법은 다음과 같다. id는 GROUP_ID_CONFIG 와 같다. 그래서 kafkaListener에서 지정하면 consumerConfig에서 group id 설정을 빼야한다. [Consumer clientId=myClientId-0, groupId=foo] [Consumer clientId=myClientId-1, groupId=foo] [Consumer clie..
2023.09.02
Kafka의 아키텍처를 알아보자
Kafka zookeeper kafka cluster brocker topic partition producer consumer group consumer zookeeper 위와 같은 역할을 하는 요소들이 있다. 각각의 역할을 보자. 카프카 = kafka cluster 이고 카프카를 여러개 띄웠을 때 관리하는 역할이 zookeeper이다. Broker kafka cluster는 여러개의 브로커를 가질 수 있고 브로커는 topic 으로 메세지를 구분한다. 한 개의 topic은 한 개 이상의 파티션으로 구성돼있고 파티션은 기본적으로 추가만 가능한 공간이다. 파티션에 저장된 메세지의 저장 위치를 오프셋 이라고 한다. 컨슈머가 파티션을 소비해도 메세지는 삭제되지 않는다. topic의 특정 파티션에 저장하려면 키..
2023.08.11