如何使用Node.js的在Heroku通信网络和工人DYNOS?(How to communicat

2019-06-26 04:42发布

网络DYNOS可以处理HTTP请求

同时网络DYNOS处理这些工人DYNOS可以从它处理工作。

但我不知道如何使Web DYNOS工人DYNOS相互通信。

例如,我想接收网络DYNOS HTTP请求

,将其发送给工人DYNOS

,处理工作,并送回结果网页DYNOS

,网页上显示的结果。

这是可能的Node.js的? (带的RabbitMQ或苦厄或等)?

我无法找到一个例子Heroku的文档

或者我应该实现网络DYNOS所有码,只缩放网页DYNOS?

Answer 1:

作为对高级别文章后台作业和排队提示,您的网络DYNOS需要通过一个中间机构(通常是队列)与你的工人DYNOS通信。

要做到这听起来像你希望遵守这个一般方法:

  • Web请求是通过网络接收到赛道
  • 网络赛道增加了一个作业队列
  • 工人赛道接收工作从队列
  • 工人测功机执行任务,写逐步进展到一个共享组件
  • 浏览器端轮询请求从Web测功机作业的状态
    • 网络赛道查询共享组件的后台作业的进度,并将状态返回到浏览器
  • 工人赛道完成了作业的执行,标志着它的共享组件的完整的
  • 浏览器端轮询请求从Web测功机作业的状态
    • 网络赛道查询共享组件的后台作业的进度和完成发送状态恢复到浏览器

至于实际执行去我不是太熟悉Node.js的最好的图书馆,但这种粘合在一起的过程都可以在Heroku作为组件加载项 。

队列:AMQP是一个很好的支持队列协议和CloudAMQP插件可以作为您的网络和工人之间DYNOS消息队列。

共享状态:可以使用的一个Postgres的插件分享正在处理作业的状态或一些更高性能,例如内存缓存或Redis的 。

因此,要总结,你必须使用一个中间的附加组件在Heroku DYNOS之间的通信。 虽然这种方法涉及到多一点的工程,结果是正确解耦和可扩展的架构。



Answer 2:

从我可以告诉,Heroku的不提供给你沟通的方式,所以你必须构建自己。 为了沟通,通过节点的另一过程中,你可能会处理进程的标准输入/输出/手动犯错,是这样的:

var attachToProcess = function(pid) {
    return {
        stdin: fs.createWriteStream('/proc/' + pid + '/fd/0'),
        stdout: fs.createReadStream('/proc/' + pid + '/fd/1'),
        stderr: fs.createReadStream('/proc/' + pid + '/fd/2')
    };
};

var pid = fs.readFile('/path/to/worker.pid', 'utf8', function(err, pid) {
    if (err) {throw err;}
    var worker = attachToProcess(Number(pid));
    worker.stdin.write(...);
});

然后,在你的工作进程,你将不得不存储在pid文件的PID:

fs.writeFile('/path/to/worker.pid', process.pid, function(err) {
    if (err) {throw err;}
});

我没有实际测试过任何这一点,所以它可能会采取一些工作和建设就可以了,但我认为其基本思路是清晰的。

编辑

注意到你用“Redis的”标记这个为好,认为我应该补充一点,你还可以使用Redis的发布/订阅您的各种进程间通信作为解释node_redis自述 。



文章来源: How to communicate Web and Worker dynos with Node.js on Heroku?