2016-06-09 232 views
2

我正在将一个cron上运行的一些资源密集型功能移到RabbitMQ队列中。我厌倦了长时间运行PHP使用者脚本,因此我正在考虑执行以下操作:RabbitMQ basic_get与多个消费者

  1. 作业在一天的开始时添加到队列中。
  2. cron运行启动使用者的命令。
  3. 消费者使用basic_get得到一份工作,处理作业,确认工作,然后退出。
  4. cron再次运行并处理下一个作业。

我身边有多么好,这将工作几个问题。

如果我决定通过cron启动两名工作人员(运行命令两次),并且第一份工作仍在处理中,但尚未得到确认,RabbitMQ是否会将相同的工作发送给第二名工作人员?

我注意到basic_consume将是更好的性能,因为接收到每个作业时,没有往返。是否有可能使用basic_consume而不是basic_get,而不必担心工作人员跑了太久?

回答

2

第一部分: 不,不会。这只会在第一位消费者没有确认消息而死亡的情况下发生,然后该消息被重新排序并且下一位消费者获得该消息。

第二部分: 您应该使用basic_consume,因为它更快,异步并且通常更好。使用任何消息检索方法与消费者运行多长时间无关。

+2

我同意W代表第一部分/ cantSleepNow和他对basic_consume是更好的性能,当你离开一个用户活着,让它处理多条消息是正确的。尽管如此,我不确定我会在你的情况下建议basic_consume。由于您想要处理单个消息并退出该过程,因此basic_get可能是正确的选择。 –

+0

谢谢你们。该计划最终将有一个Go应用程序作为长时间运行的工作人员,每当将作业添加到队列时都会触发命令。单一的工作执行只是一个停止的差距,而我们使用PHP作为监听器,因为我不相信长时间运行的PHP脚本的可靠性。所以我猜basic_get会做。如果我们有积压,我仍然可以激发多个消费者。 @DerickBailey我几天前注册了您的RMQPatterns电子邮件,迄今为止非常有帮助。谢谢! – James