我设计一个Apache风暴拓扑结构(使用streamparse)与一个出口(阿帕奇卡夫卡口)和1个螺栓的平行度,内置> 1是读卡夫卡流出口批次消息和坚持mysql表的消息
螺栓批量读取消息。如果批顺利完成我手动提交阿帕奇卡夫卡偏移。
当MySQL的螺栓插入失败,我不承诺在卡夫卡的偏移量,但一些消息已经在于,出口已发送到螺栓上的消息队列。
那些已经在队列中的消息应该被删除,因为我不能提前卡夫卡没有松动先前失败的消息所抵消。
有没有在streamparse的方式来清洁或未能全部都已经在螺栓启动队列中的消息?
我不知道streamparse,但我得到的印象是,你要束起来的元组并把它们写一个批处理。比方说,你已经写了抵消10.现在你的螺栓接收偏移11-15,和一批未写。胶印15-20排队,你想不是现在处理它们,因为这会处理批出的顺序。
这种认识对吗?
首先,我会放弃手动犯偏移。你应该让嘴搞定。假设你正在使用storm-kafka-client
,你可以配置它,一旦相应的元组和所有元组之前已经获得确认,只承诺补偿。
什么你应该做的是跟踪在螺栓(甚至更好,在你的数据库)什么的最高偏移是失败批次。然后,当你的螺栓不能写抵消11-15,可以使螺栓失败,offset > 15
每一个元组。在某些时候,你会收到再次抵消11-15,并且可以重试写该批。既然你失败,offset > 15
所有的消息,他们也将重试,并在失败批次中的消息后,将抵达。
该解决方案假定你不这样做的嘴和你的作家螺栓之间的信息流进行重新排序,这样的消息在它们被发出的顺序螺栓到达。