5.5. 처리량 및 대기 시간을 위해 생산자 최적화
일반적으로 시스템의 요구 사항은 지정된 대기 시간 내에 메시지 비율에 대한 특정 처리량 대상을 충족하기 위한 것입니다. 예를 들어 초당 500,000개의 메시지를 대상으로 하며 메시지의 95%가 2초 이내에 승인됩니다.
프로듀서의 메시징 순서(message order and commitment)가 애플리케이션 요구 사항에 따라 정의될 수 있습니다. 예를 들어, 애플리케이션에서 제공하는 일부 중요한 속성이나 보안을 손상시키지 않고 acks=0 또는 acks=1 을 사용하는 옵션이 없을 수 있습니다.
브로커 재시작은 높은 백분위 통계에 큰 영향을 미칩니다. 예를 들어 장기간에 걸쳐 99번째 백분위 대기 시간은 브로커 재시작에 대한 동작으로 인해 우선합니다. 벤치마킹을 설계하거나 벤치마킹을 수행하는 성능 번호를 프로덕션에서 볼 수 있는 성능 수치와 비교할 때 고려해야 할 사항은 다음과 같습니다.
Kafka는 목표에 따라 처리량과 대기 시간을 위해 생산자 성능을 조정하는 다양한 구성 매개변수와 기술을 제공합니다.
- 메시지 일괄 처리 (
linger.ms및batch.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 # ...
처리량 증가
메시지를 전달하고 전송 요청을 완료하기 전에 대기할 최대 시간을 조정하여 메시지 요청의 처리량을 향상시킵니다.
기본값을 대체할 사용자 지정 파티션을 작성하여 지정된 파티션으로 메시지를 보낼 수도 있습니다.
# ... delivery.timeout.ms=120000 1 partitioner.class=my-custom-partitioner 2 # ...