저는 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의 두 열 패밀리에 대한 데이터를 하나로 결합하여 유지합니다.
맞습니까? 아니면 뭔가 빠졌습니까? 그리고이 튜플들을 올바르게 고칠 수있는 또 다른 가능한 해결책이 있습니까?
감사합니다.
답장을 보내 주셔서 감사합니다. 귀하의 아이디어를 좋아하지만, 오히려 스파우 (나의 경우에는 KafkaSpout)가 ExponentialBackOff 재시도 시도로 실패를 처리하게 할 것이라고 생각합니다. 대신 데이터베이스 내재 된 볼트에 해당 기능을 구현해야합니다. 토폴로지 트리를 단순화하여 데이터베이스 볼트 두 개가 동일한 '아버지'볼트를 가지고 있지 않으므로 위의 예와 같은 볼트를 두 개의 열 패밀리에 쓰는 배치 문으로 결합하십시오. – fncontroloptioncommand