3.9. 대용량 메시지 크기 처리

메시지의 기본 배치 크기는 1MB이며 대부분의 사용 사례에서 최대 처리량에 최적입니다. Kafka는 적절한 디스크 용량을 가정하여 감소된 처리량으로 더 큰 배치를 수용할 수 있습니다.

큰 메시지 크기는 다음 네 가지 방법으로 처리됩니다.

  1. 생산자 측 메시지 압축 은 압축된 메시지를 로그에 씁니다.
  2. 참조 기반 메시징은 메시지의 값에서 다른 시스템에 저장된 데이터로 참조만 보냅니다.
  3. 인라인 메시징은 동일한 키를 사용하는 청크로 메시지를 분할한 다음 Kafka Streams와 같은 스트림 프로세서를 사용하여 출력에서 결합됩니다.
  4. 브로커 및 생산자/소유자 클라이언트 애플리케이션 구성이 대규모 메시지 크기를 처리하도록 구축되었습니다.

참조 기반 메시징 및 메시지 압축 옵션이 권장되며 대부분의 상황을 다룹니다. 이러한 옵션을 사용하면 성능 문제가 발생하지 않도록 주의해야 합니다.

생산자 측 압축

생산자 구성의 경우 Gzip과 같은 compression.type 을 지정합니다. 그러면 프로듀서에서 생성한 데이터 일괄 처리에 적용됩니다. 브로커 구성 compression.type=producer 를 사용하면 브로커는 생산자가 사용한 모든 압축을 유지합니다. 생산자와 주제 압축이 일치하지 않을 때마다 브로커는 로그에 추가하기 전에 일괄 처리를 다시 압축해야 하므로 브로커 성능에 영향을 미칩니다.

압축은 또한 소비자의 생산자 및 압축 해제 오버헤드에 추가 처리 오버헤드를 추가하지만 일괄 처리에 더 많은 데이터를 포함하므로 메시지 데이터를 잘 압축할 때 처리량에 유용합니다.

프로듀서 측 압축과 배치 크기의 미세 조정을 결합하여 처리량 개선이 용이해집니다. 지표를 사용하면 필요한 평균 배치 크기를 측정하는 데 도움이 됩니다.

참조 기반 메시지

참조 기반 메시징은 메시지가 얼마나 큰지 모를 때 데이터 복제에 유용합니다. 외부 데이터 저장소는 이 구성이 작동하려면 빠르고, 오래되고, 가용성이 높아야 합니다. 데이터는 데이터 저장소에 기록되고 데이터에 대한 참조가 반환됩니다.Data is written to the data store and a reference to the data is returned. 생산자는 Kafka에 대한 참조가 포함된 메시지를 보냅니다. 소비자는 메시지에서 참조를 가져와서 데이터 저장소에서 데이터를 가져오는 데 사용합니다.

그림 3.4. 참조 기반 메시징 흐름

참조 기반 메시징 흐름의 이미지

메시지를 전달하려면 더 많은 트립이 필요하므로 엔드 투 엔드 대기 시간이 증가합니다. 이 접근 방식의 또 다른 중요한 단점은 Kafka 메시지가 정리될 때 외부 시스템의 데이터를 자동으로 정리하지 않는다는 것입니다. 하이브리드 접근 방식은 대용량 메시지를 데이터 저장소에 전송하고 표준 크기 메시지를 직접 처리하는 것입니다.

인라인 메시징

인라인 메시징은 복잡하지만 참조 기반 메시징과 같은 외부 시스템에 따라 오버헤드는 없습니다.

생성 클라이언트 애플리케이션은 직렬화한 다음 메시지가 너무 크면 데이터를 청크해야 합니다. 그런 다음 생산자는 Kafka>-< ArraySerializer 를 사용하거나 전송하기 전에 각 청크를 다시 직렬화하는 것과 유사합니다. 소비자는 완전한 메시지가 있을 때까지 메시지 및 버퍼 청크를 추적합니다. 소비 클라이언트 애플리케이션은 deserialization 전에 어셈블된 청크를 수신합니다. 전체 메시지는 청크 메시지 세트마다 첫 번째 또는 마지막 청크 오프셋에 따라 소비되는 애플리케이션의 나머지 부분으로 전달됩니다. 전체 메시지를 성공적으로 전달하면 오프셋 메타데이터와 비교하여 재조정하는 동안 중복이 발생하지 않도록 합니다.

그림 3.5. 인라인 메시징 흐름

인라인 메시징 흐름의 이미지

인라인 메시징은 특히 일련의 대규모 메시지를 병렬로 처리할 때 버퍼링이 필요하기 때문에 소비자 측에서 성능 오버헤드가 발생합니다. 대규모 메시지 청크는 인터리빙될 수 있으므로 버퍼의 다른 대규모 메시지 청크가 불완전하면 메시지의 모든 청크가 사용되었을 때 커밋할 수 없습니다. 이러한 이유로 버퍼링은 일반적으로 메시지 청크를 유지하거나 커밋 논리를 구현하여 지원됩니다.

더 큰 메시지를 처리하기 위한 구성

더 큰 메시지를 피할 수 없고 메시지 흐름의 어느 시점에서든 블록을 피하기 위해 메시지 제한을 늘릴 수 있습니다. 이렇게 하려면 항목 수준에서 message.max.bytes 를 구성하여 개별 항목에 대한 최대 레코드 배치 크기를 설정합니다. 브로커 수준에서 message.max.bytes 를 설정하면 모든 항목에 대해 더 큰 메시지가 허용됩니다.

브로커는 message.max.bytes 로 설정된 제한보다 큰 모든 메시지를 거부합니다. 생산자(max.request.size) 및 소비자(message.max.bytes)의 버퍼 크기는 더 큰 메시지를 수용할 수 있어야 합니다.