我是Apache Storm的初学者,想知道流中是否保证元组的顺序。 当我正确地发布这个帖子Processing records in order in Storm时,保证了Bolt / Spout与其他Bolt之间的顺序。
所以,如果我有KaffkaSpout,它会发出根据时间戳排序的元组,并根据某些id有一些带有字段分组的螺栓。
builder.setBolt("Bolt1", bolt1).fieldsGrouping("Bolt1", new Fields("id"));
是否保证始终处理具有id x的元组以便使用Bolt。因此,如果在Bolt1中处理Tuple2之前,如果它们具有相同的ID,则必须在Bolt1(严格地)中处理Tuple1?严格来说,我的意思是不平行 即使工作节点出现故障也是如此吗?
答案 0 :(得分:0)
这取决于您的拓扑结构以及“Bolt1”在相对于KafkaSpout的拓扑中的位置。对于例如考虑以下2种拓扑案例 -
案例1 -
在这种情况下,由于bolt1在拓扑中接下来是kafkaSpout并且具有字段分组,所有具有相同“id”的元组将转到同一个bolt实例,它将按顺序严格。 但请考虑以下拓扑
案例2 -
在这种情况下,由于Bolt2中的订单丢失,因此无法保证元组按照它们被推入Kafka分区的顺序进入第1个。
一般情况下,如果您正在寻找Storm系统中严格的处理顺序,您有责任让所有组件保持正常工作并按顺序排放。但总的来说,这会限制您在许多方面通过限制代码和拓扑中的并行性来使用Storm的全部功能。