如何在Heroku上与Node.js通信Web和Worker dynos?

Ins*_*dJW 33 heroku rabbitmq redis node.js kue

Web Dynos可以处理HTTP请求

Web Dynos处理它们时,Worker Dynos可以处理它的作业.

但我不知道如何让Web DynosWorker Dynos相互沟通.

例如,我想通过Web Dynos接收HTTP请求

,发送给工人Dynos

,处理作业并将结果发送回Web Dynos

,在Web上显示结果.

在Node.js中这可能吗?(使用RabbitMQ或Kue等)?

我在Heroku文档中找不到一个例子

或者我应该在Web Dynos中实现所有代码并仅扩展Web Dynos吗?

Rya*_*gle 38

正如关于后台作业和排队的高级文章所暗示的那样,您的Web dynos需要通过中间机制(通常是队列)与您的工作人员dynos进行通信.

要完成听起来像你希望遵循这个一般方法的事情:

  • Web dyno收到Web请求
  • Web dyno在队列中添加了一个作业
  • 工作人员dyno从队列中接收工作
  • Worker dyno执行作业,将增量进度写入共享组件
  • 浏览器端轮询从Web dyno请求作业状态
    • Web dyno查询共享组件以获取后台作业的进度,并将状态发送回浏览器
  • Worker dyno完成作业的执行,并在共享组件中将其标记为完成
  • 浏览器端轮询从Web dyno请求作业状态
    • Web dyno查询共享组件以获取后台作业的进度,并将完成状态发送回浏览器

就实际实现而言,我不太熟悉Node.js中最好的库,但将这个过程粘合在一起的组件在Heroku上作为附件提供.

队列:AMQP是一个受到良好支持的队列协议,CloudAMQP加载项可以作为Web和工作人员dynos之间的消息队列.

共享状态:您可以使用其中一个Postgres加载项来共享正在处理的作业的状态或更高性能的内容,例如MemcacheRedis.

因此,总而言之,您必须使用中间附加组件在Heroku上的dynos之间进行通信.虽然这种方法涉及更多的工程,但结果是一个适当解耦和可扩展的架构.