Jstorm消费MQ保证每个bolt至少处理一次

Jstorm消费MQ保证每个bolt至少处理一次

我们在使用Jstorm做流计算的时候,可能会遇到一种情况:处理单元树下有某一个bolt处理失败,但是其他的子bolt处理成功了。我们还需要这个失败的bolt重新处理一边该数据,如下图所示:Jstorm消费MQ保证每个bolt至少处理一次
这里我们的Spout在fail()方法中做消息重发处理,Bolt1中我们会存储原数据到mongo表中作为防止重复消费的去重表,下面Bolt2、Bolt3、Bolt4为不同逻辑的处理单元。

**问题:**如果Bolt3处理一条消息失败,怎么办?处理失败肯定会导致Spout对该消息进行重新发送,但是进入Bolt1的时候由于该消息曾经已经处理过就会对该消息直接进行ack,对其进行过滤。既Bolt3永远也不会再对已经处理失败消息重新处理。
**解决:**我们在数据库中单独创建一个消息表,以msgId作为唯一主键,以bolt1、bolt2、bolt3、bolt4作为字段名,tinyint类型来记录该bolt是否处理成功,
1位成功,0为未处理,这样每个bolt在处理一条数据的时候就先根据msgId去查这一条消息的消费情况,如果处理过则直接ack否则正常进行处理。