storm重发机制

本文详细介绍了Storm的ACK机制,该机制通过ACK Bolt实现消息确认。当消息的tupleId成对出现时,表明消息成功传递并处理。然而,超时可能导致消息重复处理。针对这种情况,若消息处理对重发敏感,可以在Bolt中添加判断逻辑来避免订单等业务数据的重复处理。
摘要由CSDN通过智能技术生成
 原理
ACK 是storm一大亮点. 主要由ack bolt 完成.
每个spout/bolt emit一个tuple (包含此消息的rootId, tupleId, 用户发送的消息内容)出去下游bolt 的同时,也会发一个ack tuple(只包含此消息的rootId, tupleId) 给ack bolt .


 
a) spout将 <rootId, tuple1Id> 发送到ackBolt, 也将<rootId, tuple1Id, tuple1>发到bolt1.
b) bolt1 收到了spout 发过来的tuple1, 在execute方法处理完成后,对tuple1 处理后, 产生了tuple2, tuple3 发送到bolt2. bolt1 会把新产生的tuple2 和tuple3 的 <rootId , tuple2Id> , <rootId , tuple3Id> 发到ackBolt. 同时也会把收到的tuple1 的 <rootId, tuple1Id> 发到ackBolt.
注:  tuple1, tuple2, tuple3, 都有相同的rootId, 因为他们都来自spout 发射的同一条信息.(rootId 是spout 内部生成的, 对每一条消息唯一).
c) ackBolt 不停的收到<rootId,tupleId>, 会对rootId 相同的tupleId 做异或. 因为只有tupleId 成双成对出现时, 才说明消息在两个compponent 间 成功被传递被处理了.
如果每个rootId 的tupleId异或结果不为0(有timeout 限制, 不会一直等下去), ackBolt认为此消息失败. 会发送失败反馈给此rootId 对应的spout.(用户可重写spout中的failed(messageId) 来重发数据)
关于ACK 导致消息重复消费
虽然storm的亮点是消息不丢失(ACK). 但也有其弊端.
比如说消息 a1 在 bolt3 执行时消息超时没有处理完, 那么storm(ack bolt)会认为其failed, 并发送failed反馈 给spout--> spout 重发数据 (记为消息 a1')
此时, a1在bolt3 处理完成(只是超时一点点),也还是会流转到下游bolt, 然后成功结束. 而消息 a1' 也同样被各个bolt 执行. 发生消息重复处理.
解决办法: 如果是做数据分析, 少量消息重发应该无伤大雅. 如果做对重发敏感的业务逻辑(比如处理订单). 可以在每个bolt 的execute最开始 加一段判断此订单是否被处理的小逻辑(比如去query redis, 看此订单编号是否存在)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值