Spring/Spring 이야기

Spring Batch와 StreamBridge 그리고 Send Message의 유실

seungdols 2025. 5. 22. 19:11

Spring Batch로 카프카 메시지를 송신 하는데, 송신 한 값의 유무를 보고 다른 작업을 하는 Step이 있는데 이상하게 

일부 메시지만 유실이 되었다.

살펴보니, 카프카의 linger.ms 설정은 일정 시간동안 버퍼에 모았다가 메시지를 보내는 옵션이다.

하지만, 이 옵션을 적게 변경 하면 성능이 떨어진다. 

https://docs.confluent.io/platform/current/installation/configuration/producer-configs.html#linger-ms

 

Kafka producer configuration reference | Confluent Documentation

Enter a string to search and filter by configuration property name. bootstrap.servers A list of host/port pairs used to establish the initial connection to the Kafka cluster. Clients use this list to bootstrap and discover the full set of Kafka brokers. Wh

docs.confluent.io

프로듀서는 요청 전송 사이에 도착하는 모든 레코드를 하나의 일괄 요청으로 그룹화합니다. 일반적으로 이 작업은 레코드가 전송할 수 있는 속도보다 빨리 도착하는 부하 상황에서만 발생합니다. 그러나 일부 상황에서는 클라이언트가 적당한 부하 상태에서도 요청 수를 줄이기를 원할 수 있습니다. 이 설정은 약간의 인위적인 지연을 추가하여 이를 달성합니다. 즉, 제작자는 레코드를 즉시 전송하는 대신 다른 레코드가 전송될 때까지 주어진 지연 시간까지 기다렸다가 전송을 일괄 처리할 수 있도록 합니다. 이는 TCP의 Nagle 알고리즘과 유사하다고 생각할 수 있습니다. 이 설정은 일괄 처리를 위한 지연의 상한선을 제공합니다. 파티션에 대해 batch.size 상당의 레코드가 확보되면 이 설정에 관계없이 즉시 전송되지만, 이 파티션에 누적된 바이트 수가 이보다 적으면 지정된 시간 동안 더 많은 레코드가 표시될 때까지 '대기'하게 됩니다. 이 설정의 기본값은 0입니다(즉, 지연 없음). 예를 들어 linger.ms=5로 설정하면 전송되는 요청 수가 줄어드는 효과는 있지만 로드가 없는 상태에서 전송되는 레코드에 최대 5ms의 지연 시간이 추가됩니다.

해결 방안 

사실, 해결 방안을 못찾고 있다가 팀내의 다른 파트 리드님께 조언을 구했었는데, 동일한 이슈를 경험 해보신 덕분에 바로 답변 해주셨다.

1. KafkaTemplate 으로 변경 (Sync) 

2. Batch의 Graceful 추가 (배치가 종료 시, 바로 종료 시키지 않고 유후시간을 둠)

3. linger.ms를 조절한다.

나는 일단 2번으로 변경 했고, 송신의 유실 이슈가 처리 되는 것을 확인 할 수 있었다.

 

반응형