2013-04-30 3 views
2

Java에서 간단한 제작자 -> Kafka -> 소비자 응용 프로그램을 구현하려고합니다. 나는 메시지를 성공적으로 소비 할 수있을뿐만 아니라 생산할 수 있지만, 소비자를 다시 시작할 때 문제가 발생합니다. 이미 소비 된 메시지 중 일부는 다시 Kafka (모든 메시지는 아니지만 마지막 메시지의 일부)에서 소비자에 의해 선택됩니다. 소비 된 메시지).Simple-Kafka- 소비자 메시지 전달 중복

내 소비자에 autooffset.reset=largest을 설정했으며 autocommit.interval.ms 속성을 1000 밀리 초로 설정했습니다.

'이미 사용 된 일부 메시지의 재 배달'에 대해 알려진 문제가 있습니까? 아니면 여기에 누락 된 다른 설정이 있습니까?

기본적으로 이전에 소비 한 메시지가 소비자에 의해 선택/소비되지 않도록하는 방법이 있습니까?

답변

3

카프카는 사육사를 사용하여 소비자 오프셋을 저장합니다. 사육사의 작업이 꽤 느리기 때문에 모든 메시지를 소비 한 후에는 오프셋을 수행하는 것이 좋습니다.

소비자에게 종료하기 전에 수동으로 주제 오프셋을 적용하는 종료 훅을 추가 할 수 있습니다. 그러나 이는 특정 상황 (예 : jvm crash 또는 kill -9)에서 도움이되지 않습니다. 그 상황을 다시 지키기 위해 각 메시지 (파일 또는 로컬 데이터베이스)를 처리 한 후 로컬에서 오프셋을 커밋 할 커스텀 커밋 로직을 구현하고 Zookeeper가 매 1000ms마다 오프셋을 적용하도록 권장합니다. 소비자가 시작할 때이 두 위치를 모두 쿼리해야하며 최대 두 값을 소비 오프셋으로 사용해야합니다.

+0

바보 같은 소리가 들리 겠지만, 예를 들어 사용자 정의 커밋 로직을 구현한다고하면 모든 메시지에 대한 오프셋을 관리 할 수 ​​있습니다. 예를 들어 타임 스탬프 값이있는 두 개의 메시지가있는 경우 타임 스탬프를 기준으로 오프셋을 설정하고 싶습니다. 따라서 두 번째 레코드가 이전 타임 스탬프를 갖는 경우이 오프셋은 다른 타임 스탬프보다 적어야합니다. 소비하면서 나는 이미 분류 된 메시지를 받게 될 것입니다. – user2720864