2014-11-05 87 views
1

我想要實現在暴雨以下拓撲:我應該使用哪種方法來實現此Storm拓撲?

a1->a2->a3->a4 
    |  | 
    -<----<-- 


b1->b2->b3->b4 
    |  | 
    -<----<-- 

需要注意的是A1,B1和A2,B2等是相同的螺栓。有兩個相同的流,但在這些螺栓之間傳遞的元組必須保留在流中。從a4→a2,b4→b2也有一個循環。

爲了實現單獨的流,我想要在streamID字段上使用fieldsGrouping或爲每個流創建單獨的streamID。後面的選項似乎更好,但我的實現似乎不夠優雅。

builder.setBolt("a2", new A2(), 1).shuffleGrouping("a1", "streamA"); 
builder.setBolt("b2", new B2(), 1).shuffleGrouping("b1", "streamB"); 

然後在同樣繼續實施第二個要求:

builder.setBolt("a2", new A2(), 1).shuffleGrouping("a4", "stream1"); 

有沒有更好的辦法?

+0

你能從A4生成一個元素,它將在A1中被檢查爲噴口元組而不是A2上的循環嗎?或者,這是A4到A2完成的完全不同的操作(不等於A1到A2)? – zenbeni 2014-11-05 21:28:23

+0

對不起,我不明白這個問題。流中發生的事情是a1,a2,a3和a4順序處理消息。 a4可能會定期從下游接收消息(未在我的圖中顯示),然後它必須將消息傳遞給a2。 – Johnny 2014-11-05 22:39:33

+0

你應該記錄這種情況,我覺得應該有更好的事情做。恕我直言,你不應該在一個博爾特「煎餅」的擔憂。如果可能的話,最好在另一個螺栓/流中分開這種情況。 – zenbeni 2014-11-06 13:57:24

回答

0

我最終這樣做directGrouping和不同的流。所以有一個流從a1-> a2-> a3-> a4,另一個流是a4-> a2。這樣我可以確保A和B組之間沒有元組通過。

0

我在實現中看到的唯一問題是您有2個A2實例,這是不必要的。你可以只是

builder.setBolt("a2", new A2(), 1) 
     .shuffleGrouping("a1", new Fields("streamA")) 
     .shuffleGrouping("a4", new Fields("stream1")); 
相關問題