Kafka 소비자 오프셋은 어떻게 결정됩니까?


169

저는 Kafka를 처음 접합니다. 나는 그것에 대해 약간의 실험을했지만 소비자 오프셋과 관련하여 몇 가지 분명하지 않습니다. 지금까지 내가 이해 한 바에 따르면, 소비자가 시작할 때, 소비자가 읽을 시작 오프셋은 구성 설정에 따라 결정됩니다 auto.offset.reset(잘못된 경우 수정).

예를 들어 주제에 10 개의 메시지 (오프셋 0 ~ 9)가 있고 소비자가 다운되기 전 (또는 소비자를 죽이기 전에) 5 개를 소비했다고 가정 해보십시오. 그런 다음 해당 소비자 프로세스를 다시 시작한다고 가정하십시오. 내 질문은 :

  1. 이로 auto.offset.reset설정 되면 smallest항상 오프셋 0부터 소비되기 시작합니까?

  2. 이로 auto.offset.reset설정 되면 largest오프셋 5부터 소비되기 시작합니까?

  3. 이런 종류의 시나리오에 관한 행동은 항상 결정적인가?

내 질문에 분명하지 않은 내용이 있으면 언제든지 주저하지 마십시오. 미리 감사드립니다.

답변:


260

설명했던 것보다 조금 더 복잡합니다. 당신의 소비자 그룹이 유효한 오프셋 최선을 다하고 곳이없는 경우에만에서 설정 차기 (2 개 지원 오프셋 창고는 이제 카프카와 사육사있다), 또한 일종의 소비자의 사용에 따라 달라집니다.
auto.offset.reset

고급 Java 소비자를 사용하는 경우 다음 시나리오를 상상하십시오.

  1. 소비자 그룹 group1에 5 개의 메시지를 소비하고 사망 한 소비자 가 있습니다. 다음에이 소비자를 시작하면 해당 auto.offset.reset구성을 사용하지 않으며 오프셋 저장소 (위에서 언급 한 Kafka 또는 ZK)에서 저장된 오프셋을 가져 오기 때문에 사망 한 곳에서 계속됩니다.

  2. 설명 된 것처럼 주제에 메시지가 있고 새 소비자 그룹에서 소비자를 시작합니다 group2. 아무 어디에도 저장 상쇄되지 않고 이번에는 auto.offset.reset설정은 주제 (의 처음부터 시작할지 여부를 결정합니다 earliest() 또는 주제의 끝에서 latest)

오프셋 값에 해당 earliest하고 latest구성에 영향을주는 또 다른 사항 은 로그 보존 정책입니다. 보존이 1 시간으로 구성된 주제가 있다고 가정하십시오. 5 개의 메시지를 생성 한 다음 1 시간 후에 5 개의 메시지를 더 게시합니다. latest여전히 앞의 예에서와 동일하게 유지됩니다 오프셋하지만 earliest하나가 될 수 없습니다 0카프카는 이미 수 오프셋이 메시지 때문에 초기 사용할 수를 제거하기 때문에 5.

위에서 언급 한 모든 것은 관련이 없으며 SimpleConsumer실행할 때마다 auto.offset.reset구성 사용을 시작할 위치를 결정합니다 .

당신이 0.9 이상 카프카 버전이 오래된 사용하는 경우에는 교체해야 earliest, latestsmallest, largest.


3
답변 주셔서 대단히 감사합니다. 따라서 높은 수준의 소비자는 소비자가 무언가를 저지른 auto.offset.reset후에 (ZK 또는 Kafka에서) 그 이후로 의미가 없습니까? 이 설정의 유일한 의미는 커밋 된 것이 없을 때 (그리고 이상적으로 소비자를 처음 시작할 때)?
Asif Iqbal

2
정확하게 설명
했듯이

1
@serejja 안녕하세요-그룹당 항상 1 명의 소비자가 있고 귀하의 답변 시나리오 1이 발생하면 어떻습니까? 같은가요?
ha9u63ar

1
@ ha9u63ar는 귀하의 질문을 잘 이해하지 못했습니다. 동일한 그룹에서 소비자를 다시 시작하면 예, 소비자 auto.offset.reset는 커밋 된 오프셋을 사용하지 않고 계속 사용 합니다. 소비자를 시작할 때 항상 다른 소비자 그룹을 사용하는 경우 소비자는 항상 존중합니다auto.offset.reset
serejja

@serejja 네, 저에게는 효과가 없습니다. 이것 좀 봐주세요 -이것은 내 문제입니다
ha9u63ar

82

단지 업데이트 : Kafka 0.9부터 Kafka는 새로운 Java 버전 소비자를 사용하고 있으며 auto.offset.reset 매개 변수 이름이 변경되었습니다. 매뉴얼에서 :

Kafka에 초기 오프셋이 없거나 서버에 현재 오프셋이 더 이상 존재하지 않는 경우 수행 할 작업 (예 : 해당 데이터가 삭제 되었기 때문에) :

가장 이른 : 오프셋을 가장 빠른 오프셋으로 자동 재설정

latest : 오프셋을 최신 오프셋으로 자동 재설정

none : 소비자 그룹에 대한 이전 오프셋이 없으면 소비자에게 예외를 던집니다.

다른 것 : 소비자에게 예외를 던지십시오.

허용 된 답변을 확인한 후 이것을 찾기 위해 시간을 보냈으므로 커뮤니티가 게시하는 것이 도움이 될 것이라고 생각했습니다.


9

또한 offsets.retention.minutes가 더 있습니다. 지난 이후 시간이 커밋 인 경우> offsets.retention.minutes다음 auto.offset.reset도 발 차기


1
로그 보존으로 인해 중복으로 보이지 않습니까? 보존이 로그 보존을 기반으로해야합니까?
mike01010

@ mike01010 맞습니다. 티켓에서 제안 된 솔루션 중 하나 인 로그 보존을 기반으로해야합니다. Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. issues.apache.org/jira/browse/KAFKA-3806
saheb

그 대답은 내가 확인 될 때까지 잠시 동안 나를 무서워 문서offsets.retention.minutes:. 소비자 그룹은 모든 소비자 (즉, 빈된다)의 오프셋 (offset)를 폐기하기 전에이 보존 기간 동안 보관됩니다 잃게 한 후 <b>을 </ b>를 독립형 소비자 (수동 할당 사용)의 경우, 마지막 커밋 시간에이 보존 기간을 더한 후에 오프셋이 만료됩니다. Kafka 2.3
jumping_monkey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.