1. Java Producer Client API 처리 로직 개요

    Untitled

    1. Producer 환경 설정(Properties 객체 이용) → bootstrap.servers 등
    2. 환경 설정을 바탕으로 Producer 객체 생성
    3. 토픽명과 메시지 값(key, value)를 입력하여 보낼 메시지인 ProducerRecord 생성
    4. KafkaProducer 객체의 send()메서드를 통해 ProducerRecord 전송
  2. KafkaProducer의 send()메서드 호출 프로세스

    Untitled

    1. kafka Producer 전송은 Producer Client의 별도 스레드가 전송을 담당한다는 점에서 기본적으로 스레드간 비동기전송
    2. 즉, Producer Client의 메인 스레드가 send()메서드를 호출하여 메시지 전송을 시작하지만 바로 전송되지 않으며 내부 Buffer에 메시지를 저장 후에 별도의 스레드가 카프카 브로커에 실제 전송
  3. Producer와 브로커와의 메시지 동기화/비동기화 전송

    Untitled

    1. 동기 전송
      1. producer는 브로커로 부터 해당 메시지를 성공적으로 받았다는 Ack메시지를 받은 후 메시지를 전송
      2. KafkaProducer.send().get()호출하여 브로커로 부터 Ack 메시지를 받을 때까지 대기(wait)함
    2. 비동기 전송
      1. Producer는 브로커로 부터 해당 메시지를 성공적으로 받았다는 Ack메시지를 기다리지 않고 전송
      2. 브로커로 부터 Ack메시지를 비동기로 Producer에 받기 위해 Callback을 적용
      3. send()메서드 호출 시에 callback 객체를 인자로 입력하여 Ack메시지를 Producer로 전달할 수 있음
    3. Producer와 브로커와의 메시지 동기화 코드
      1. Future<RecordMetaData> = kafkaProducer.send(ProducerRecord객체) → 기본적으로 비동기 호출(RecordMetaData가 Ack를 가짐)

      2. Future 객체의 get()을 호출하여 브로커로 부터 메시지 Ack응답을 받을 때 까지 Main Thread를 대기 시키는 방식으로 동기화 구성

      3. Producer와 브로커 메시지 동기화 코드1

        Future<RecordMetaData> future = kafkaProducer.send();
        RecordMetaData recordMetaData = future.get();
        
      4. Producer와 브로커 메시지 동기화 코드2

        RecordMetaData recordMetaData = kafkaProducer.send().get();
        
  4. Callback

    예시는 비동기 전송 예제

    예시는 비동기 전송 예제

    1. Callback이란
      1. 다른 코드의 인수로서 넘겨주는 실행 가능한 코드
      2. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있음
      3. 즉, callback은 다른 함수의 인자로서 전달된 후에 특정 이벤트가 발생 시 해당 함수에서 다시 호출
      4. 자바에서의 사용
        1. Callback을 인터페이스로 구성하고 호출되어질 메소드를 선언
        2. 해당 callback을 구현하는 객체 생성, 호출 되어질 메소드를 구체적으로 구현
        3. 다른 함수의 인자로 해당 callback을 인자로 전달
        4. 해당 함수는 특정 이벤트 발생 시 Callback에 선언된 메서드를 호출
  5. Key값을 가지는 메시지 전송

    Untitled

    1. 메시지 key는 업무 로직이나 메시지 Producer/Consumer 분산 성능 영향을 고려하여 생성
    2. 특정 Key값을 가지는 메시지는 특정 파티션으로 고정되어 전송됨
    3. 특정 Key값을 가지는 메시지는 단일 파티션 내에서 전송 순서가 보장되어 Consumer에 읽혀짐
    4. faker 라이브러리 가짜 데이터를 만들어주는 라이브러리**