>

카프카 설정이 아래와 같습니다

Partition - 10
Replication - 3
fetch.max.byte at broker - 32MB
Producer
max.block.ms =- 5min
request.timeout.mm - 5min
retries - 4
Consumer
No custom config
Message size - 1kb

이 설정을 사용하면 다음과 같은 문제가 발생합니다.

<올>
  • 제작자가 엄청난 양의 메시지를 넣을 때 생산자가 시간이 지남에 따라 Batch Expired (일괄 처리 만료)라는 예외를 던집니다. 나는이 예외가 생산자가 소비자가 소비 할 수있는 것보다 빨리 넣을 때 발생한다는 것을 이해하지만,이 예외를 방지하고 소비자가 소비 할 수있을 때까지 기다리는 구성을 구성 할 수 있습니다. 스트리밍 데이터이므로 앱은 메시지를 잃을 수 없으며 순서도 중요합니다.

  • 내가 보는 다른 문제는 프로듀서가 10-15 개의 메시지를 게시 할 때 해당 메시지가 약 6 초 후에 소비자에게 도달한다는 것입니다. 메시지 수가 많으면이 지연 시간이 계속 증가합니다. 브로커 로그를 확인하고 브로커에 도달하자마자 소비자가이를 사용할 수 있음을 관찰했습니다. 그러나 5-6 초 후에 브로커에 도달합니다. 여기서 부하는 여전히 6 초가 걸리지 않습니다. 성능을 어떻게 개선해야합니까? 내 앱은 업스트림에서 데이터를 수신하여 kafka 주제 1에 게시합니다. 이 kafka topic1에서 다른 앱은 키를 기반으로 데이터를 소비하고 집계하여 다른 kafka topic 2에 게시합니다.

  • 주제 1은 주제 2의 제작자이므로 분석에 따라 주제 게시는 양호하지만 주제 1에서의 소비는 지연됩니다. 그리고 우리는 브로커 때문이라고 생각합니다.

    • 답변 # 1

      linger.ms 예외를 본 경우  시간이 초과되었습니다. 이는 메시지 배치가 linger.ms 이상 동안 송신 버퍼에 있음을 의미합니다. . linger.ms 를 설정할 수 있습니다  0으로 설정하면 생산자가 즉시 브로커에게 메시지를 보냅니다.

      설명에 따라 지연은 생산 측에서 발생합니다. linger.ms 설정 이외  다음 설정을 조정하면 생성 대기 시간을 줄이는 데 도움이 될 수 있습니다.

      acks= 1   # Leader will write the record to its local log but will
                # respond without awaiting full acknowledgement from all followers.
      batch.size # reduce the batch size so that the producer do not wait for 
                 # a larger batch size
      delivery.timeout.ms # this is available since Kafka 2.1, and allows you 
                          # specify clearly on delivery timeout
      max.in.flight.requests.per.connection # increase # of inflight request can 
                                            # help to improve throughput
      
      

    관련 자료

  • 이전 ios - 스위프트 3의 하위 문자열에서 정수로 숫자를 얻는 방법은 무엇입니까?
  • 다음 node.js - jest로 sequelizejs 단위 테스트에서 유효성 검사 오류를 확인하는 방법은 무엇입니까?