用于处理数据流的消息队列

时间:2015-11-30 11:44:22

标签: rabbitmq apache-kafka mq

我有我处理的输入数据流。每个流都以数据块的形式发送。在我完成处理同一流 i 的第N个数据块之后,我只能处理流 i 的第N + 1个数据块。因此,并行化可以通过一次处理多个流来实现,但我永远不能在多个工作者上拆分一个流。

按顺序将一个流的块添加到队列中(尽管可以同时添加来自多个流的块)。

大多数消息队列(如RabbitMQ)可保证多个工作人员在一个队列上运行时的有序传递。但是,为了实现我想要的行为,我需要将每个队列的worker数量限制为1,这样下一个块总是只在前一个块完成时才被处理。为了并行化,我可以为每个流创建一个队列,或者为每个工作者创建一个队列,并让另一个进程将流重定向到工作队列。实际上,使用RabbitMQ的一致性哈希和铲子,我现在所做的就是每个工人一个队列的方法。当然,就负载平衡和工人数量的动态扩展而言,这远非理想。

我已经阅读了很多关于Kafka的内容,以及它是如何为时间序列数据(如日志)设计的。然而,我无法弄清楚如何应用Kafka - 或其他任何消息队列 - 来解决我的问题。

我非常感谢有关如何最好地使用消息队列解决问题的一些提示。

2 个答案:

答案 0 :(得分:0)

您可以使用Kafka,但是您必须使用一些流识别来在Producer端散列消息,以便来自一个流的消息始终转到同一分区。
然后,在消费者方面,您必须使用低级别消费者来生成与分区一样多的消费线程,其中每个线程将从单个分区消耗。 这意味着您始终在每个流中按顺序处理消息 我还没有看过Kafka 0.9 Producer是如何工作的,但是有一些变化,所以如果你想使用最新的版本,你应该查看它们。

答案 1 :(得分:0)

为什么不在收到前一块工作人员的送货确认后才推送下一个块?或者某种由工人处理前卡盘的标志,标志设置为真&然后推下一个块。

如果需要并行化工作,请创建具有唯一路由键的多个队列,基于路由键将块推送到相应的队列。每个路由密钥都有单独的标志。