我在Storm中实现了一个从RabbitMQ spout(https://github.com/ppat/storm-rabbitmq)接收消息的螺栓。
我必须在Storm中处理的每个事件都是来自Rabbit的两条消息,所以我在bolt上有一个fieldsGrouping,这样两条消息就会在同一个螺栓中到达。
我的第一个方法是:
这样可行,但如果一名工人死亡,我可能会丢失消息,因为我会在获得第二个元组之前获取第一个元组并进行处理。
我将其更改为:
内存缓存是一个时间到期的Guava缓存,当一个元组由于超时而被驱逐时,我将在拓扑中失败(),以便后者重新处理。
这似乎有效,但是当我做了一些测试时,我遇到了系统停止从Rabbit Queue获取消息的情况。
队列上的预取设置为5,并且setMaxSpoutPending为7的spout。在Rabbit界面中,我看到5个未分组的消息。
在风暴日志中,我看到同样的元组一遍又一遍地从缓存中逐出。
据我所知,问题是spout只会获取5条消息,这些消息都是一对的第一部分。我可以增加预取,但这并不保证在生产中不会发生这种情况。
所以我的问题是:如何在Storm中处理这些问题时实现连接?
答案 0 :(得分:1)
Storm无法为此提供良好的解决方案......您需要的是一个缓冲第一个元组的可靠存储(即有状态运算符)。因此,您可以立即确认第一个元组,并在失败后恢复状态。