본문 바로가기
Kafka

6. Kafka - Java Kafka Clients의 Send 메소드

by #Glacier 2024. 4. 4.
반응형

카프카 클라이언트를 개발할 때 보통 자바를 쓴다.

Producer Client의 별도 Thread 가 전송을 담당한다는 점에서 기본적으로 Thread간의 비동기 전송이다.

 

즉 Main Thread가 있고, Serializer를 통해 전송하려는 데이터를 일련의 바이트로 변환한다.

즉 객체나 데이터를 바이트스트림으로 변환하여 Partitioner를 거쳐 이전에 학습했던 대로

파티션 별로 별도의 배치에 따라 담겨진 후 Sender에게 보내지는데,

Sender는 메인 쓰레드가 아닌 별도의 Send Network Thread가 전송하게 된다.

1 2 3 4 5 6
Main Thread Send
Network
Thread
DATA.send() Serializer Partitioner Topic Partition#1 batch0 Sender
batch1
Topic Partition#2 batch0
batch1

 

카프카의 메세지 전송은 동기/비동기로 나뉘어 지는데, 

기본적으로 '비동기' 방식의 전송이다.

 

먼저 동기식 전송은 아래와 같다.

 

Future <RecordMetaData> = KafkaProducer.send() 

 

Future객체의 .get() 을 호출하여 브로커로부터 메시지 Ack 응답을 받을때 까지 Main Thread를 기다리는 것이 동기 방식이며

정상적으로 메세지를 보내게 되면 해당 메타데이터를 응답으로 주게되어 받을 수 있다.

Future <RecordMetaData> future = KafkaProducer.send();
RecordMetadata recordMetadata = KafkaProducer.send().get();

 

즉 이렇게 하면, 메세지를 동기화 처리한 것이다. 메세지를 보낸 후, ACK 신호를 받아

Metadata를 리턴해준 값을 get() 했기 때문이다.

 

반면 비동기식 메시지 전송 방식은, 

Main Thread에서 -> Send Network Thread로 콜백 함수와 함께 메시지를 보내면,

Send Network Thread는 Broker의 특정 파티션으로 메시지를 보내고,

Send Network Thread는 그 메시지에 대한 ACK를 기다리지 않는다.

그렇기 때문에 비동기식이 되는 것이다.

 

ACK를 기다리지 않는 대신, new Callback함수에 따라 onCompletion 상태가 되면, 

Main Thread측의 send메소드에서 metadata와 함께 Exception을 받는다.

exception이 없으면 metadata만이 존재하여 위와 같은 정보가 나오고,

재전송이 가능하다면 acks = 1이런 식으로 retryable 한 경우에는 재전송도 시도한다.

 

다만, 위와 같은 Callback함수에서 정의된 metadata와 exception등은 sender thread를 통해 얻어진다.

 

 

 

 

 

 

반응형