2015-01-20 3 views
3

우리는 하나의 머리 통증이있는 ​​상당히 간단한 폭풍 토폴로지를 가지고 있습니다.스톰 토폴로지의 선택적 스트림

볼트 중 하나는 처리 할 데이터를 찾을 수 있으며 모든 것이 정상적으로 스트림을 계속 수행하거나 유효하지 않으나 해결할 수 있습니다. 어떤 경우에는 추가 처리를 위해 보내야합니다.

이 단계를 토폴로지의 일부로 별도의 볼트 및 스트림으로 만들려고했습니다.

declarer.declareStream(NORMAL_STREAM, getStreamFields()); 
declarer.declareStream(ERROR_STREAM, getErrorStreamFields()); 

다음과 같이 실행 방법이 끝납니다.

if(errorOutput != null) { 
    collector.emit(ERROR_STREAM, input, errorOutput); 
} 
else { 
    collector.emit(NORMAL_STREAM, input, output); 
} 

collector.ack(input); 

이 작품은, 그러나 그것은 실패하고 끝없이 주둥이로 다시 보내 얻을이 오류 경로를 아래로 이동하지 않는 튜플의 모든 원인의 차단 효과가 않습니다.

오류 볼트는 수신하지 못한 메시지에 대해 acks를 보낼 수 없지만 acker는 토폴로지의 모든 볼트를 기다렸다가 ack를 다시 보내서 주둥이로 되돌려 보내기 때문입니다. 적어도 오류 처리 볼트를 꺼내면 모든 것이 스파우트로 올바르게 되돌아갑니다.

이 같은 것을 달성하는 가장 좋은 방법은 무엇입니까?

답변

3

오류 볼트가 의심되는 것보다 느려서 error_stream에 백업이 발생하여 첫 번째 볼트에 백업이 생겨 결국 튜플이 시간 초과되기 시작할 수 있습니다. 터플이 타임 아웃되면, 스파우트에 의해 재전송된다.

보십시오

  1. 은 (topology.max.spout.pending) 분출 기내에서 튜플의 수를 제한
  2. , 타임 아웃 설정 (topology.message.timeout.secs)을 증가 및/또는
  3. 당신의 볼트 오류 볼트가 전혀 일을 보내지고하지 않는 나에게 문제의 원인이되는 경우
+0

의 병렬 처리 수를 증가. 말 그대로 그 일을 할 일이 없습니다. execute 메소드는 모든 데이터가 올 바르면 오류 볼트에서 호출되지 않습니다. 그러나 스파우트는 ui에 실패한 튜플을 많이 보여줍니다. –

+0

그러나 다른 볼트가 시간이 많이 소요되는 속도가 훨씬 느립니다. 올바른 방향으로 주셔서 감사합니다. –