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

Rabbitmq 用于处理数据流的消息队列,rabbitmq,apache-kafka,mq,Rabbitmq,Apache Kafka,Mq,我有我处理的输入数据流。每个流以数据块的形式发送。在处理完同一流I的第N个数据块后,我只能处理流I的第N+1个数据块。因此,并行化可以通过一次处理多个流来实现,但我永远不能在多个工作者上分割一个流 一个流的块按顺序添加到队列中(尽管可以同时添加多个流的块) 大多数消息队列(如RabbitMQ)在多个工作人员对一个队列进行操作时保证有序传递。然而,为了实现我想要的行为,我需要将每个队列的工作线程数限制为1,这样,下一个块总是在前一个块完成时才被处理。为了并行化,我可以为每个流创建一个队列,或者为每

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

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

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

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


如果您能给我一些关于如何最好地使用消息队列来解决我的问题的提示,我将不胜感激。

您可以使用Kafka,但您必须使用一些流标识来对生产者端的消息进行散列,以便来自一个流的消息始终到达同一分区。
然后,在使用者端,您必须使用低级使用者生成与分区数量相同的消费线程,其中每个线程将从单个分区消费。
这意味着您总是在每个流中按顺序处理消息。

我还没有检查Kafka 0.9 Producer是如何工作的,但是有一些变化,所以如果您想使用最新版本,您可能应该研究这些变化。

您可以使用Kafka,但您必须使用一些流标识在Producer端散列消息,以便来自一个流的消息总是到达同一分区。
然后,在使用者端,您必须使用低级使用者生成与分区数量相同的消费线程,其中每个线程将从单个分区消费。
这意味着您总是在每个流中按顺序处理消息。

我还没有检查Kafka 0.9 Producer是如何工作的,但是有一些变化,所以如果您想使用最新版本,您可能应该研究这些变化。

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


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

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


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

谢谢你的解释,马尔科!对我来说,这听起来与RabbitMQ方法相同,但也有相同的缺点:如果一个工作进程被卡住,其队列/分区中的所有流都将被卡住,新的流将继续添加到其队列中。嗯,不确定这是什么意思。卡夫卡的“工人”比喻是什么?工人是一个消费狂。抱歉这么含糊不清。谢谢你的解释,马尔科!对我来说,这听起来与RabbitMQ方法相同,但也有相同的缺点:如果一个工作进程被卡住,其队列/分区中的所有流都将被卡住,新的流将继续添加到其队列中。嗯,不确定这是什么意思。卡夫卡的“工人”比喻是什么?工人是一个消费狂。很抱歉,模棱两可。为什么不在收到前一个区块的交付确认后才推送下一个区块给工作人员?为什么不在收到前一个区块的交付确认后才推送下一个区块给工作人员?在交付确认后推送下一个区块意味着需要跟踪它,我想知道是否有这样一个消息队列。否则,如果我必须跟踪它,我基本上是在构建自己的队列。如果一次只有一个对象进入队列,那么拥有一个队列又有什么意义呢。你甚至可以不用排队就可以做到这一点。让我澄清一下:我有数据流,它们会排队。对于步骤i的计算,我需要步骤i-1的结果。因此,一次只能计算一个结果,并且必须严格按照顺序进行处理。但是,新的步骤仍然可以随时进入,并且必须排队。有几种可能使用队列、锁和堆栈的组合来实现这一点,但我认为这个问题有点普遍,因此我想知道是否有消息队列可供其使用。在传递确认之后推送下一个块意味着某些进程需要跟踪它,我想知道是否有这样一个消息队列。否则,如果我必须跟踪它,我基本上是在构建自己的队列。如果一次只有一个对象进入队列,那么拥有一个队列又有什么意义呢。你甚至可以不用排队就可以做到这一点。让我澄清一下:我有数据流,它们会排队。计算