2017-02-11 6 views
1

저는 Storm을 처음 사용했으며 최근에 BaseBasicBolt 대신 IRichBolt 을 상속하도록 볼트를 변경했습니다. 이제는 acking 및 failing을 담당하고 있습니다. 내 논리에 따른 튜플.스톰 토폴로지 : 두 개의 볼트에 동일한 소스 볼트가있는 경우 올바른 방법

My topology looks like this: 볼트 A는 볼트 B와 C에 동일한 튜플을 내보내고 각각은 카산드라에게 데이터를 보관합니다. 이러한 연산은 멱등수가 아니며 두 개의 다른 카운터 열 패밀리에 대한 업데이트를 포함합니다. Cassandra의 특정 예외 (읽기/쓰기 시간 제한, QueryConsistency 또는 유효성 검사 예외 만)에서 튜플을 실패하고 재생하는 데 관심이 있습니다. 문제는 볼트 B가 실패 할 경우 동일한 튜플이 스파우트에서 재생되고 볼트 C에 다시 방출되어 이미 데이터를 유지하는 데 성공했으며 잘못된 데이터를 생성한다는 것입니다.

내가 정확히 어떻게 acking이 (읽은에서 : http://www.slideshare.net/andreaiacono/storm-44638254) 이루어 졌는지 이해하려고 시도했지만 내가 위에서 설명한 상황에서 어떻게되는지 이해하지 못했습니다.

이 문제를 올바르게 해결할 수있는 유일한 방법은 동일한 입력 소스를 가진 다른 스파우트를 만드는 것입니다. 스파우트 1 -> 볼트 A -> 볼트 B 및 스파우트 1 '-> 볼트 A'-> 볼트 C ' , 또는 B와 C로 이루어진 동일한 Batch Statement의 두 열 패밀리에 대한 데이터를 하나로 결합하여 유지합니다.

맞습니까? 아니면 뭔가 빠졌습니까? 그리고이 튜플들을 올바르게 고칠 수있는 또 다른 가능한 해결책이 있습니까?

감사합니다.

답변

0

볼트 B 또는 C에서 실패한 업데이트를 다시 시도하기를 얼마나 기다리지는 않았지만 볼트 B의 튜플을 완전히 실패하지 않고 더 많은 스트림을 추가 할 수 있습니다. 볼트 B에서 전갈 꼬리 출력 스트림을 다시 같은 볼트 B에 추가합니다. 볼트 B의 업데이트가 실패하면 전갈 꼬리 출력 스트림에 터플을 작성하여 볼트 B에 다시 입력해야합니다. 제 2 스트림. 새 스트림에 대한 B 볼트의 처리 논리가 마지막 시도 시간을 볼 수 있도록 충분한 시간이 지나면 전갈 꼬리 스트림에 다시 쓸 수 있습니다. 물론 볼트 C에 대해서도 똑같은 일을 할 것입니다.

튜플을 다시 시도하기를 기다리려면 (폭풍이 길다), 전갈 꼬리 흐름을 카프카 주제로 바꿀 수 있습니다. 필수 스파우트.

+0

답장을 보내 주셔서 감사합니다. 귀하의 아이디어를 좋아하지만, 오히려 스파우 (나의 경우에는 KafkaSpout)가 ExponentialBackOff 재시도 시도로 실패를 처리하게 할 것이라고 생각합니다. 대신 데이터베이스 내재 된 볼트에 해당 기능을 구현해야합니다. 토폴로지 트리를 단순화하여 데이터베이스 볼트 두 개가 동일한 '아버지'볼트를 가지고 있지 않으므로 위의 예와 같은 볼트를 두 개의 열 패밀리에 쓰는 배치 문으로 결합하십시오. – fncontroloptioncommand