카프카 멱등성 프로듀서에 대해..

박상준·2024년 4월 29일
0

Kafka

목록 보기
3/4
post-custom-banner

멱등성 프로듀서

  • 데이터의 중복 적재 없이 메시지를 정확히 한 번만 적재하도록 보장한다.

멱등성 프로듀서의 동작

  • 기본 프로듀서와 다르게 동작한다. 데이터를 Kafka 브로커로 전송할 때, 각 메시지에서는 프로듀서의 고유 IP (PID) 와 시퀀스 번호(SID) 가 포함된다.
  • 해당 정보를 통하여 Kafka 브로커는 다음과 같이 동작
    • PID (Producer unique ID)
      • 프로듀서의 고유한 식별자이다.
    • SID (Sequence ID)
      • 메시지의 전송 순서를 나타내는 번호이다.
  • 브로커의 경우 수신된 메시지의 PID 와 SID 를 확인하고, 이미 적재된 동일한 PID 와 SID 를 가진 메시지의 적재 요청이 있는 경우, 중복 적재를 방지한다.

멱등성 프로듀서의 한계점

  • 세션의 한계
    • 동일한 세션 내에서만 보장된다.
    • 여기서 세션은 PID의 생명주기를 의미한다.
    • 프로듀서 애플리케이션이 재시작되는 경우 새로운 PID 가 생성되고, 이전 세션의 메시지와 동일한 메시지라도 새로운 PID 로 인식되어 중복 적재되는 문제가 발생한다.
  • 장애 대응의 한계
    • 멱등성 프로듀서는 애플리케이션이 장애 없이 실행될 때만 정확히 한 번 적재를 보장한다.
    • 장애 발생 시 재시작으로 인해 PID 가 변경되면, 이전에 전송된 메시지와 동일한 메시지라도 중복 적재가 가능하다. (으악..)

설정법

    public ProducerFactory<String, ChatMessageRequestDTO> producerFactory() {
        log.info("producerFactory Started ! ========");
        log.info("producerFactory.bootstrapServers : {}", bootstrapServers);
        
        Map<String, Object> configProps = new HashMap<>();
        
        configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
        configProps.put(ProducerConfig.RETRIES_CONFIG, Integer.MAX_VALUE);
        configProps.put(ProducerConfig.ACKS_CONFIG, "all");
        configProps.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "zstd");
        configProps.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
        configProps.put(ProducerConfig.LINGER_MS_CONFIG, 5);
        configProps.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
        configProps.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, 1048576);
        configProps.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 5000);
        configProps.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 3000);
        configProps.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
        
        return new DefaultKafkaProducerFactory<>(configProps);
    }
  • 에서 enable.idempotence true 로 설정
  • retries ⇒ Integer.MAX_VALUE 설정
  • acks all 설정이 필수적이다.
  • 실제로 어플리케이션에서 멱등성을 ON 하고 acks 을 all 외의 값으로 설정하는 경우 카프카가 정상적으로 동작하지 않았다.
  • 근데 reties 는 기본적으로 MAX_VALUE 가 아니라더라도 문제는 없는데 만약 네트워크 문제로 데이터가 적재되지 않는 문제가 생길 순있다.
profile
이전 블로그 : https://oth3410.tistory.com/
post-custom-banner

0개의 댓글