어떻게 카프카 소비자는 여러 할당 된 파티션에서 소비 않습니다

DVS :

TL; DR; 나는 도달 파티션에 대한 기록을 소비하는 여러 파티션 핸들을 할당하는 방법을 하나의 소비자를 이해하려고 노력하고 있습니다.

예를 들면 :

  • 완전히 다음으로 이동하기 전에 하나의 파티션을 처리합니다.
  • 각 파티션마다에서 사용할 레코드 덩어리를 처리합니다.
  • 사용 가능한 첫 번째 파티션에서 N 기록의 배치를 처리
  • 라운드 로빈 회전 파티션에서 N 레코드의 배치 처리

나는 발견 partition.assignment.strategy에 대한 구성을 Ranged하거나 RoundRobinAssignors하지만 이것은 단지 소비자가가 할당 된 파티션에서 소비되지 방법 파티션을 할당하는 방법을 결정합니다.

나는 KafkaConsumer 소스와 파고 시작 () #poll 받는 나를 인도 (#pollForFetches) #pollForFetches () 다음에 저를 이끌어 가져 오기 #의 fetchedRecords ()(가져 오기 #의 sendFetches)

이것은 단지 전체를 따라하려고 저를 이끌어 가져 오기 클래스 모두 함께 어쩌면 그것은 단지 늦은 아니면 그냥 지금까지 한 정도로 파고하지 않았다하지만 소비자가 여러 할당 된 파티션을 처리 할 방법을 정확하게 형상화하는 데 문제가 있어요.

배경

카프카 스트림에 의해 백업 데이터 파이프 라인에서 작업.

레코드는 다른 카프카 스트림 애플리케이션에 의해 처리 될 때,이 파이프 라인의 여러 단계에서 스트림은 공정의 다음 단계로 진행하기 전에 기록에서 증강 될 필요한 데이터를 제공하는 외부 데이터 소스들에 의해 공급 압축 항목에 결합한다.

길을 따라 레코드가 기록을 증강 것입니다 외부 데이터 소스에 일치 할 수없는 몇 가지 죽은 편지 내용이있다. 데이터가 아직 바로 사용할 수 없기 때문에이 될 수있다 (이벤트 나 캠페인은 아직 라이브 없음) 또는 나쁜 데이터과 일치하지 않습니다.

지금까지 새로운 증강 데이터는 우리가 그들을 업데이트하고 추가 처리를 위해 다운 스트림을 보내기 위해 죽은 편지 쓰기 항목에서 이전에 타의 추종을 불허하는 기록과 일치 할 수 있도록 게시 할 때 목표는 죽은 편지 쓰기 항목에서 재 게시 기록이다.

기록은 잠재적으로 여러 번 시도에 일치하지 못한 우리는 재 처리 기존 레코드하려는, 그래서 죽은 편지 쓰기 항목의 복사본을 여러 개 가질 수 죽은 편지 쓰기 주제에 보내졌다 (최신 시간 오프셋하기 전에 응용 프로그램이 시작)뿐만 아니라 기록 마지막으로 (이전에 저장 한 소비자 그룹 오프셋 후) 응용 프로그램으로 실행입니다.

그것은 내 소비자 응용 프로그램이 시작된 이후에 도착하는 모든 레코드를 필터링, 내 생산자가 게시 트랜잭션의 일부로 오프셋을 투입하여 내 소비자 그룹의 오프셋 (offset)를 관리로 잘 작동합니다.

하지만 내가 unmatached 기록은 소비자에 의해 필터링하려면 죽은 편지 쓰기 항목에서 이전과 동일한 파티션에 재 처리 및 토지 취득 홀수 가장자리 경우에 실행 된이 나는 결국 모든 파티션에서 소비됩니다 있는지 확인하려면. 그리고이 과정 기록의 새로운 배치를 받고 아니지만 아직 중 재 처리되지 않은 파티션이 있습니다.

단일 소비자가 다중 할당 된 파티션을 처리하는 방법을 어떤 도움 이해 주시면 감사하겠습니다.

미카엘 하우스 :

당신은보고 올바른 트랙에 있던 Fetcher대부분의 논리가있다.

첫째로 소비자의 Javadoc는 언급 :

소비자가에서 데이터를 가져 오기 위해 여러 파티션을 지정하는 경우, 효과적으로 소비를 위해 이러한 파티션에 동일한 우선 순위를주고, 동시에 그들 모두에서 소비하려고합니다.

당신이 상상할 수 있듯이, 실제로 고려해야 할 몇 가지가있다.

  • 소비자가 새 레코드를 가져 오기 위해 시도 할 때마다, 그것은 이미 기록 (가져 오기 이전부터) 기다리고 갖고있는 파티션을 제외됩니다. 이미 기내 페치 요청이 파티션은 제외됩니다.

  • 기록을 가져 오는 경우, 소비자의 지정 fetch.max.bytesmax.partition.fetch.bytes에 요청을 가져옵니다. 이들은 각각 총 및 파티션 당 반환하는 데이터 양을 결정하기 위해 브로커에 의해 사용됩니다. 이것은 동일하게 모든 파티션에 적용됩니다.

기본적으로이 두 방법을 사용하여, 소비자는 매우 모든 파티션에서 소비하려고합니다. 그런 경우가 아니라면, 변경 fetch.max.bytes또는 max.partition.fetch.bytes보통하는 데 도움이됩니다.

경우에, 당신은 다른 사람을 통해 일부 파티션의 우선 순위를하려면, 당신은 사용해야 pause()하고 resume()수동으로 소비 흐름을 제어 할 수 있습니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=168812&siteId=1