5.5. 처리량 및 대기 시간을 위해 생산자 최적화

일반적으로 시스템의 요구 사항은 지정된 대기 시간 내에 메시지 비율에 대한 특정 처리량 대상을 충족하기 위한 것입니다. 예를 들어 초당 500,000개의 메시지를 대상으로 하며 메시지의 95%가 2초 이내에 승인됩니다.

프로듀서의 메시징 순서(message order and commitment)가 애플리케이션 요구 사항에 따라 정의될 수 있습니다. 예를 들어, 애플리케이션에서 제공하는 일부 중요한 속성이나 보안을 손상시키지 않고 acks=0 또는 acks=1 을 사용하는 옵션이 없을 수 있습니다.

브로커 재시작은 높은 백분위 통계에 큰 영향을 미칩니다. 예를 들어 장기간에 걸쳐 99번째 백분위 대기 시간은 브로커 재시작에 대한 동작으로 인해 우선합니다. 벤치마킹을 설계하거나 벤치마킹을 수행하는 성능 번호를 프로덕션에서 볼 수 있는 성능 수치와 비교할 때 고려해야 할 사항은 다음과 같습니다.

Kafka는 목표에 따라 처리량과 대기 시간을 위해 생산자 성능을 조정하는 다양한 구성 매개변수와 기술을 제공합니다.

메시지 일괄 처리 (linger.msbatch.size)
동일한 브로커로 향하는 더 많은 메시지가 전송되어 단일 생성 요청에 배치될 수 있도록 메시지 일괄 처리 지연이 발생합니다. 일괄 처리는 처리량이 증가하기 위해 대기 시간이 길수록 저하됩니다. 시간 기반 일괄 처리는 linger.ms 를 사용하여 구성되며, 크기 기반 일괄 처리는 batch.size 를 사용하여 구성됩니다.
압축(compression.type)
메시지 압축은 생산자(메시지 압축에 소비된 CPU 시간)에 대기 시간을 추가하지만 요청(및 잠재적으로 디스크 쓰기 가능)을 작게 만들어 처리량을 늘릴 수 있습니다. 압축이 있는지 여부와 가장 좋은 압축은 전송 중인 메시지에 따라 달라집니다. 압축은 KafkaProducer.send() 호출 스레드에서 수행되므로 이 방법의 대기 시간이 애플리케이션에 필요한 경우 더 많은 스레드를 사용해야 합니다.
파이프라이닝 (max.in.flight.requests.per.connection)
파이프라이닝은 이전 요청에 대한 응답이 수신되기 전에 더 많은 요청을 전송함을 의미합니다. 일반적으로 더 많은 파이프라이닝은 처리량 향상, 즉 더 심각한 일괄 처리와 같은 다른 효과의 임계값까지 증가하여 처리량에 미치는 영향을 대응하기 시작합니다.

대기 시간 단축

애플리케이션이 KafkaProducer.send() 를 호출하면 메시지는 다음과 같습니다.

  • 모든 인터셉터에서 처리
  • serialized
  • 파티션에 할당
  • compressed
  • 파티션별 큐에서 메시지 일괄 처리 추가

이 경우 send() 메서드가 반환됩니다. 따라서 send() 가 차단되는 시간은 다음에 따라 결정됩니다.

  • 인터셉터, serializers 및 partitioner에서 보낸 시간
  • 사용된 압축 알고리즘
  • 버퍼 압축을 기다리는 데 걸리는 시간

일괄 처리는 다음 중 하나가 발생할 때까지 큐에 남아 있습니다.

  • 일괄 처리( batch.size에 따라)
  • linger.ms 에서 도입한 지연이 통과되었습니다.
  • 발신자는 다른 파티션에 대한 메시지 일괄 처리를 동일한 브로커에 보내려고 하며 이 배치를 추가할 수도 있습니다.
  • 프로듀서가 플러시되거나 닫히고 있습니다.

일괄 처리 및 버퍼링에 대한 구성을 확인하여 대기 시간에 대한 send() 차단의 영향을 완화합니다.

# ...
linger.ms=100 1
batch.size=16384 2
buffer.memory=33554432 3
# ...
1
linger 속성은 더 큰 메시지 배치가 누적되어 요청에 전송되도록 지연을 밀리초 단위로 추가합니다. 기본값은 0'입니다.
2
최대 batch.size (바이트)가 사용되는 경우 최대값에 도달할 때 요청이 전송되거나 메시지가 linger.ms 보다 오래 대기되었습니다(둘 중 더 빨리 제공됨). 지연을 추가하면 일괄 처리가 배치 크기까지 메시지를 누적할 수 있습니다.
3
버퍼 크기는 배치 크기 이상이어야 하며 버퍼링, 압축 및 진행 중인 요청을 수용할 수 있어야 합니다.

처리량 증가

메시지를 전달하고 전송 요청을 완료하기 전에 대기할 최대 시간을 조정하여 메시지 요청의 처리량을 향상시킵니다.

기본값을 대체할 사용자 지정 파티션을 작성하여 지정된 파티션으로 메시지를 보낼 수도 있습니다.

# ...
delivery.timeout.ms=120000 1
partitioner.class=my-custom-partitioner 2

# ...
1
전체 전송 요청을 기다리는 최대 시간(밀리초)입니다. 이 값을 MAX_ LOECDHE로 설정하여 무제한 재시도 횟수를 Kafka에 위임할 수 있습니다. 기본값은 120000 또는 2분입니다.
2
사용자 정의 partitioner의 클래스 이름을 지정합니다.