2017-10-18 2 views
0

나는 메시지를 다시 처리 할 수있는 횟수를 설정하기 위해 SpoutConfig에 retryLimit이 있음을 알고 있습니다. retryLimit에 대해서는Kafka-Storm에서 재시도 횟수를 알아 보는 방법

이 내가 SpoutConfig.class에있는 메시지는 다음과 같습니다

지수 백 오프 설정을 다시 시도하십시오. 이들은 에 의해 사용됩니다. 이 OutputCollector.fail()을 호출 한 후 메시지를 다시 시도하기위한 ExponentialBackoffMsgRetryManager입니다.

내 코드에서 주어진 볼트에서 튜플이 처리 될 때 재 시도의 정확한 숫자를 알 수있는 방법이 있는지 알고 싶습니다.

예를 들어 retryLimit=5을 설정하고이 튜플이 이미 1 회 실패했음을 알고 싶다면 두 번째로 재 처리 할 때 처음으로 (OutputCollector.fail()을 호출하는 경우) 실패합니다.

감사합니다.

감사합니다.

답변

1

기본 제공 지원이 없습니다. https://github.com/apache/storm/blob/master/external/storm-kafka-client/src/main/java/org/apache/storm/kafka/spout/RecordTranslator.java에 의해 Kafka 레코드에서 생성 된 튜플은 재생 횟수가 아닌 Kafka 레코드에만 의존합니다.

기본 RecordTranslator는 튜플의 일부로 토픽, 파티션 및 오프셋을 방출하므로, 볼트를 사용하여 볼트가 이미 본 적이 있는지 확인하기 위해 사용할 수 있습니다 (상태 저장소가 있다고 가정) . 왜 볼트는 튜플이 실패한 횟수를 알아야합니까?

편집 :
방출 된 튜플의 옵션으로 실패 횟수를 추가하지 않은 이유 중 하나는 신뢰할 수 없다는 것입니다. 튜플의 실패 횟수는 스파우트의 메모리 내에서만 존재하기 때문에 터플이 실패하고 스파우트가 충돌하는 경우를 얻을 수 있으며 0 이상의 실패 수가있는 튜플을 볼 수 없습니다.

스파우트에 영구적 인 상태 저장소가 있으면 실패한 튜플이 그와 같이 표시되지 않는 경우가있을 수 있습니다. 스파우트가 먼저 충돌하고 이전에 방출 된 튜플이 실패하면. 재부팅 된 스파우트는 이전에 방출 된 튜플을 인식하지 못하므로 실패한 것으로 표시하지 않습니다.

스파우트가 이전에 실패했다고 생각하는지 여부보다는 스파우트가 튜플을 두 번 이상 내 보낸지 여부를 실제로 추적해야하는 것처럼 보입니다.

두 번 이상 내 보낸 오프셋을 추적하려면 https://github.com/apache/storm/blob/master/external/storm-kafka-client/src/main/java/org/apache/storm/kafka/spout/KafkaTupleListener.javaonEmit을 사용할 수 있습니다. 스파우트의 일부로 실행되기 때문에 튜플이 빠지기 때문에 상태를 정리하는 것이 매우 간단해야합니다. 스파우트가 터플을 방출 한 후에 onEmit이 실행되기 때문에 오류가 발생한 튜플을 놓칠 가능성이 여전히 있으므로 배출 후 즉시 스파우트가 충돌하면 실패 할 수 있습니다. 어쩌면이 요구 사항을 어떤 식 으로든 먼저 설계 할 수 있는지 생각해보십시오.

+0

Stig, 답장을 보내 주셔서 감사합니다. 내 경우에는 볼트가 번호를 알고 있어야합니다. 왜냐하면 비즈니스는 실패한 튜플에 특수 처리 (오류 테이블에 삽입하여 EoD를 다시 처리)를하고 싶어하기 때문입니다. – cricardo84

+0

댓글이 너무 많아서 편집 된 답변 –

+0

답장을 보내 주셔서 감사합니다. Stig, 시도해보고 어떻게 될지 알아 보겠습니다. – cricardo84

관련 문제