참고) https://blog.rockthejvm.com/optimizing-kafka-clients-a-hands-on-guide/
1) 메시지는 지정된 Serializer 사용하여 직렬화됩니다.
2) 파티셔너는 메시지를 어떤 파티션으로 라우팅해야 하는지 결정합니다.
3) 내부적으로 Kafka는 각 파티션마다 하나의 버퍼를 유지하며, 각 버퍼는 해당 파티션에 대해 그룹화된 많은 배치를 보유할 수 있습니다.
4) I/O 스레드는 배치를 가져와 브로커로 보내게 됩니다. 브로커는 송수신 네트워크 버퍼를 보유하고 있으며, 이 버퍼를 통해 메시지를 수신하고 디스크에 유지합니다.
5) 리더 브로커에서 메시지는 디스크에 기록되고 팔로워로 복제됩니다. 여기서 중요한 점은 메시지가 먼저 페이지 캐시에 기록되고 주기적으로 디스크에 플러시 됩니다.
6) RecordMetadata 응답이 클라이언트에게 보내집니다.
7) ACK를 수신하지 못하고 실패가 발생한 경우, retry가 활성화되어 있는지 확인한 후, 다시 보냅니다.
batch.size와 linger.ms와 같은 중요한 구성은 다음과 같이 작동합니다. 생산자는 레코드를 함께 묶어 배치를 만들고, 배치가 가득 차면 메시지를 보냅니다. 그렇지 않으면 새 항목을 큐에 넣기 위해 최대 linger.ms까지 기다립니다. 그리고 해당 시간이 만료되면 (부분적으로 채워진) 배치를 보냅니다.
작은 batch.size를 가지고 linger를 0으로 설정하면 지연 시간을 줄이고 가능한 한 빨리 메시지를 처리할 수 있습니다. 그러나 처리량이 감소할 수 있습니다. 낮은 지연 시간으로 구성하는 것은 처리 속도가 느린 시나리오에서도 유용합니다.
1) linger.ms
: 프로듀서가 메시지를 전송하기 전에 대기하는 시간을 나타내는 옵션입니다. 기본값은 0이며, 이 경우 프로듀서가 메시지를 모아서 가능한 한 빨리 보냅니다. 그러나 linger.ms를 설정하면 일정 시간 동안 메시지를 모으고, 설정된 시간이 지나거나 배치 크기에 도달했을 때 한 번에 메시지를 보낼 수 있습니다. 이를 통해 메시지를 보내는 횟수를 줄이고, 네트워크 부하를 감소시킬 수 있습니다.
2) batch.size
: 프로듀서에서 배치로 메시지를 보내는 데 사용되는 최대 바이트 크기를 나타내는 옵션입니다. 기본값은 16KB이며, 설정된 크기에 도달할 때까지 메시지를 모은 다음 한 번에 보냅니다. 이를 통해 일정 크기 이상의 메시지를 보낼 때, 한 번에 여러 메시지를 보내면 네트워크 부하를 줄일 수 있습니다.
3) buffer.memory
: Kafka Producer가 보내는 메시지를 임시로 저장하는 메모리 버퍼의 크기를 설정하는 옵션입니다. 이 옵션을 통해 메모리 버퍼의 크기를 늘리면 더 많은 메시지를 보내거나 더 큰 메시지를 보낼 수 있지만, 메모리 사용량이 늘어나서 시스템에 부하를 줄 수 있습니다. 따라서 이 값을 적절히 조정하는 것이 중요합니다.
4) max.block.ms:
Kafka Producer가 메시지를 보낼 때, 버퍼에 빈 공간이 없으면 기다리는 시간을 설정하는 옵션입니다. 즉, buffer.memory에 설정된 크기보다 많은 데이터가 발생하여 더 이상 메시지를 보낼 수 없는 상황에서, 이 옵션에 설정된 시간 동안 대기하다가 timeout이 발생하면 예외가 발생합니다. 이 값을 적절히 조정하여 Producer가 메시지를 처리하는데 걸리는 시간과 대기 시간을 적절히 조절할 수 있습니다.
5) delivery.timeout.ms
: Kafka Producer가 메시지를 보낼 때, 리더 파티션으로부터 ack를 기다리는 최대 시간을 의미합니다. 즉, Producer가 메시지를 보낸 후 해당 메시지가 리더 파티션에서 성공적으로 저장되고 복제되었는지 확인하는데 소요되는 시간을 지정합니다.
만약 delivery.timeout.ms가 지정된 시간 내에 ack를 받지 못하면, 해당 메시지는 실패(failed)로 처리되며, 실패 핸들링을 위해 리트라이 등의 추가적인 작업을 수행해야 할 수 있습니다.
기본값은 120000ms(2분)이며, 이 값을 조정하여 Producer가 ack를 대기하는 최대 시간을 조정할 수 있습니다. 이 값을 낮추면 더 빠른 실패 핸들링이 가능하지만, ack 처리가 늦어질 가능성도 있습니다.
6) enable.idempotence
: Kafka producer의 설정 옵션 중 하나입니다. 이 옵션을 true로 설정하면, 동일한 메시지를 중복해서 보내는 것을 방지하여 메시지의 유실 또는 중복을 방지할 수 있습니다.
이 옵션을 활성화하면, Kafka producer는 다음과 같은 일을 합니다.
이 기능은 acks 옵션을 all로 설정할 때 가장 잘 작동합니다. 이 옵션은 모든 브로커에 메시지가 전달된 후에만 메시지를 보내는 것을 의미합니다. 그러나 이는 추가적인 대기 시간을 초래할 수 있으므로 유의해야 합니다.
enable.idempotence 옵션을 사용하면 Kafka에서 안정적인 메시지 전송을 보장할 수 있습니다.
7) max_in_flight_requests_per_connection
: Kafka producer의 설정 중 하나로, 하나의 연결(connection)에서 최대로 처리할 수 있는 요청(request) 수를 제한하는 값입니다.
이 옵션은 네트워크 대역폭을 적절히 활용하고 Kafka broker의 부하를 분산시키기 위해 사용됩니다. 예를 들어, max_in_flight_requests_per_connection이 5로 설정되어 있으면, 하나의 연결에서 5개 이하의 요청을 처리할 수 있습니다. 이렇게 요청을 일부로 제한함으로써, 각 요청이 빠르게 처리되고 새로운 요청이 대기열에 계속 쌓이지 않도록 하는 것입니다.
기본값은 5이며, 사용 사례에 따라 조정하여 최적의 값으로 설정할 수 있습니다. 대개의 경우에는 이 값을 더 높게 설정하면 더 높은 처리량을 달성할 수 있지만, 과도하게 높게 설정하면 Kafka broker가 처리하지 못하는 요청 수가 많아져서 오히려 성능 저하를 유발할 수 있습니다.