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



我有要处理的输入数据流。每个流以数据块的形式发送。在I完成处理同一流I的第N个数据块之后,我只能处理流的N+1个数据块。因此,并行化可以通过同时处理多个流来实现,但我永远无法在多个工作线程上分割一个流。

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

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

我读了很多关于卡夫卡的书,以及它是如何为时间序列数据(如日志)设计的。然而,我不知道如何应用Kafka或任何其他消息队列来解决我的问题。

对于如何最好地使用消息队列来解决我的问题,我将不胜感激。

您可以使用Kafka,但您必须使用一些流标识来对Producer端的消息进行散列,以便来自一个流的消息总是进入同一个分区
然后,在Consumer端,您必须使用低级别的Consumer来生成与分区一样多的消耗线程,其中每个线程将从单个分区消耗
这意味着您总是在每个流中按顺序处理消息
我还没有检查Kafka 0.9 Producer是如何工作的,但有一些更改,所以如果你想使用最新版本,你可能应该研究一下。

为什么不在收到前一个区块向工作者的送达确认后才推送下一个区块?或者由工人处理前一卡盘的某种标志,标志被设置为true和amp;然后推送下一个区块。

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

相关内容

  • 没有找到相关文章

最新更新