多个消费者和生产者连接到消息队列,这在AMQP中可能吗?

5 投票
2 回答
3557 浏览
提问于 2025-04-15 18:38

我想创建一个可以识别文本的进程农场。我的想法是使用一个消息队列,让多个OCR进程来读取这些消息。

我希望确保以下几点:

  • 队列中的每条消息最终都会被处理
  • 工作量大致均匀分配
  • 一张图片只会被一个OCR进程解析
  • 一个OCR进程不会同时接收到多条消息(这样其他空闲的OCR进程就可以处理这些消息)。

使用AMQP来实现这些目标可能吗?

我打算使用Python和RabbitMQ。

2 个回答

5

是的,正如@nailxx所说,AMQP的编程模型和JMS有点不同。在AMQP中,你只有队列,这些队列可以被多个工作者共享,或者由一个工作者私有使用。你还可以很方便地设置RabbitMQ来处理发布/订阅的场景,这在JMS中被称为主题。如果你想了解更多信息,可以去我们在RabbitMQ网站上的入门指南,那里有很多有用的资料。

现在,针对你的具体需求,已经有很多现成的工具可以使用。其中一个被广泛使用且支持良好的工具是Celery。这里有一篇博客文章,我觉得这会对你入门有所帮助:

如果你有任何问题,请给我们发邮件或者在rabbitmq-discuss邮件列表上发帖。

3

是的,这是可能的。我正在开发的一个实时大型多人在线游戏的服务器集群就是这样运作的。我们使用的是ActiveMQ,但我觉得用RabbitMQ也可以做到这一点。

你提到的所有功能,除了最后一个,基本上都是现成的。

  • 队列中的每条消息最终都会被处理 - 这是消息代理的主要职责之一。
  • 工作会大致均匀分配 - 这是另一个职责 :)
  • 一张图片只会被一个OCR处理 - 这是为了区分/topic和/queue。主题像广播信号,而队列则像任务。在你的场景中,你需要使用/queue。

为了让最后一个功能按预期工作,消费者在订阅队列时需要发送AMQ特定的参数:

activemq.prefetchSize: 1

这个设置确保消费者在处理完一条消息之前,不会再接收其他消息,直到它向AMQ发送一个ack确认。我相信RabbitMQ中也有类似的功能。

撰写回答