当前位置: 首页 > 知识库问答 >
问题:

将RabbitMQ中的消息作为“循环”分发到运行在Heroku dynos上的消费者

令狐凌
2023-03-14

我有一个RabbitMQ设置,其中作业被发送到交换,交换将它们传递到队列。使用者依次正确地执行队列中的作业。但是,这些作业都是长流程(至少几分钟)。对于可伸缩性,我需要能够让多个使用者从队列顶部选择一个作业并执行它。

使用者正在一个叫做“队列”的Heroku dyno上运行。当我缩放dyno时,它似乎为每个dyno创建了额外的消费者(我可以在RabbitMQ仪表板上看到这些)。但是,队列中的任务数量不变--额外的使用者似乎什么也不做。请看下图了解我的设置。

我是不是漏了什么?

  1. 为什么消费者表现为“闲置”?我从日志中了解到,至少有一个使用者正在积极地完成一个任务。
  2. 当至少有一个消费者确实在努力工作时,我的消费者利用率如何为0%。
  3. 如何使其他三个使用者实际从队列中拉出一些作业?

谢谢

编辑:我发现循环调度实际上是有效的,但只有当消息被发送到队列时附加的使用者已经在运行。在我看来这是违反直觉的行为。如果我看到一个很大的队列,并且想要添加更多的消费者,那么添加的消费者将什么都不做,直到更多的项目被添加到队列中。

共有1个答案

梁丘琛
2023-03-14

从另一个答案中找出关键点,这里可能的罪魁祸首是预取,如“消费者确认和发布者确认”下所述。

服务器将向使用者发送批处理,而不是一次传递一个消息并等待它被确认。如果使用者确认了一些消息但随后崩溃,则剩余的消息将发送给另一个使用者;但如果使用者仍在运行,未确认的消息将不会发送给任何新的使用者。

这解释了你看到的行为:

  1. 您可以创建队列,并将一些消息传递给它,而不运行使用者。
  2. 您运行一个使用者,它预取队列上的所有消息。
  3. 您运行第二个消费者;尽管队列不是空的,但所有消息都标记为已发送到第一个使用者,等待确认;因此第二个使用者处于空闲状态。
  4. 新消息到达队列;它以循环方式分发给第二个消费者。

解决方案是在使用者中指定basic.qos选项。如果将此设置为1,RabbitMQ将不会向使用者发送消息,直到它确认了前面的消息;具有该设置的多个使用者将以严格的循环方式接收消息

 类似资料:
  • 我对RabbitMQ很陌生,所以如果我的问题听起来很琐碎,请原谅。我想在RabbitMQ上发布消息,它将由RabbitMQ消费者处理。 我的消费者机器是一个多核机器(最好是azure上的工作者角色)。但QueueBasicConsumer一次推送一条消息。我如何编程来利用我可以同时处理多个消息的所有核心。 一种解决方案是在多个线程中打开多个通道,然后在那里处理消息。但在这种情况下,我将如何决定线程

  • 我是一个新的学习者,试图理解拉雷维尔的拉比MQ。我已找到驱动程序vyuldashev/laravel队列rabbitmq 我已经配置应用程序/queue.php,并运行驱动程序与此语法"php工匠队列:工作Rabbitmq"。控制器。我不会在我的控制器中调度作业,因为laravel只是监听消息并处理消息。谁能帮我解释一下这是怎么回事?谢啦

  • 我有一个Kafka主题,目前有3个分区。我希望我的消费者从同一个分区读取,但每条消息都应该以循环方式发送给不同的消费者。有可能实现吗?

  • 我正在尝试让 kafka 消费者获取在 Java 中生成并发布到主题的消息。我的消费者如下。 consumer.java 当我运行上面的代码时,我在控制台中什么也看不到,屏幕后面的java producer程序正在‘AATest’主题下不断地发布数据。另外,在动物园管理员控制台中,当我尝试运行上面的consumer.java时,我得到了以下行 此外,当我运行指向 AATest 主题的单独控制台使用

  • RabbitMQ在下列情况下会循环分发消息吗? RabbitMQ配置: 交换类型-主题 路由密钥-通知# 制片人正在将消息推送到上面的交流中,并遵循以下不同的主题 - notify.log.# , notify.status.#, notify.priceChange.# 有4个消费者在不同的服务器上运行。 > 3个消费者在负载均衡器下执行相同的处理并在同一应用程序的不同实例上运行。(他们想消费生

  • 前面介绍了线程间如何传递chromium自定义任务(task),那么在线程内,消息循环(messageloop)是如何处理这所有的消息和任务呢?本章节重点介绍消息循环的工作原理。 在Chromium里,需要处理三种类型的消息:chromium自定义的任务,Socket或者文件等IO操作以及用户界面(UI)的消息。这里面,chromium自定义任务是平台无关的,而后面两种类型的消息是平台相关的。回忆