如何在Heroku上的多个dynos上进行缩放时,如何避免同一个队列作业被多次处理

时间:2017-02-26 20:31:06

标签: heroku rabbitmq

我们有一个运行环回的Node.js应用程序,其主要目的是处理从客户端收到的订单。目前,整个订单处理在单个http请求期间处理,以进行订单,包括付款,插入数据库和发送确认电子邮件等。

我们发现这种方法虽然目前正在工作,但缺乏可扩展性 - 应用程序需要随着其增长而每分钟处理数千个订单。此外,我们的订单流程目前将数据写入我们自己的数据库,但是我们现在正在考虑我们无法控制速度或可用性的第三方集成(直到系统)。

此外,我们目前还有潜在的竞争条件;我们必须分配一个短代码'对于每个订单,以便客户轻松参考 - 这些需要旋转,因此如果起始编号为1且最大值为100,则必须为第101个订单分配编号1.此时我们正在查看上一个订单并且将先前的参考值递增1或将其重新设置为开始 - 显然,由于流量较低,此时此情况很好 - 但是,当我们进行缩放时,这可能会导致为多个订单分配相同的参考编号。

因此,我们希望实现一个队列来管理所有这些。我们的应用程序目前部署在Heroku上,我们已经使用工作进程来处理我们的应用程序所需的每月数量。虽然已经阅读了一些关于实现队列(https://devcenter.heroku.com/articles/asynchronous-web-worker-model-using-rabbitmq-in-nodehttps://devcenter.heroku.com/articles/background-jobs-queueing)的Heroku文章,但我们不清楚如何通过多个工作人员dynos来确保这些排队项目的处理顺序以及多个dynos不会多次处理同一个作业。处理顺序并不那么重要,但缺乏重复是非常重要的,因为如果同时处理两个订单,我们就会面临上述竞争条件的风险。

基本上我的问题是这个;当在Heroku上的多个dynos上进行缩放时,我们如何避免同一个队列作业被多次处理?

1 个答案:

答案 0 :(得分:3)

您需要的是RabbitMQ已经提供的,这是Heroku的CloudAMQP插件使用的消息代理。

您不必担心多个工人的竞争状况。放置在队列中的作业将被存储,直到消费者检索它为止。当一个工人从队列中消耗一份工作时,没有其他工人可以使用它。 RabbitMQ管理消息排队范例的所有这些方面。

一些对您的项目有用的链接: