我正在开发一项服务,需要每五分钟为不同的用户分析来自社交媒体网络的数据。我正在node.js中开发它,我将在Heroku上实现它。
根据Heroku网站上的this article,最好的方法是将调度程序的逻辑与工作者的逻辑分开。实际上,我们的想法是让一个dyno致力于安排任务以避免重复。这个dyno指示一个工人农场(根据需要n dynos)来完成任务。
这是该架构的proc文件:
web: node web.js
worker: node worker.js
clock: node clock.js
问题是如何在node.js中实现它。我用Google搜索,建议使用消息队列系统(如IronMQ,RabbitMQ或CloudAMQP)。但我正在尝试设置我的代码和应用程序简单,并且需要附加组件。
问题是:有没有办法直接从我的调度程序(时钟)与工作人员dynos进行通信?
感谢您的回答。
答案 0 :(得分:4)
Heroku dynos do not have fixed IP addresses, so there is no way to open a direct connection between them. That's why you need to create a separate server instance with a static IP or other fixed endpoint that acts as a go-between.
You have at least two viable options: a RabbitMQ-type message queue, or a stripped down version using a pub-sub redis feed. I generally use the latter because it's quick, simple, and sufficiently robust for all my needs (e.g. if a message gets lost every once in a blue moon, it's no big deal). If, however, it is essential that you never lose a message, you should use a full-blown message queue like RabbitMQ.
Setting up the redis implementation is very straightforward. There are several redis add-ons (I use RedisCloud) with free and inexpensive plans. When you provision them, you get an endpoint to connect to and a password. Then you just connect your web dyno(s) and worker dyno(s) to your redis instance such that your web app publishes tasks to a channel and the worker subscribes to that channel.
If you need the web app to communicate with the client after task completion, you just create another channel for the worker to publish task completion messages and the web app to listen for them.
You'll never get duplication of tasks, as each time a worker receives a message it pops off the queue.
答案 1 :(得分:1)
如果我理解正确,你想把时钟作为一个应用程序旋转,然后将工作人员作为单独的应用程序旋转?当然,有一种直接的方式。您打开从时钟应用程序到工作者应用程序的连接。
例如,让每个工作人员打开与时钟的客户端套接字连接。然后时钟可以与他们通信并转发订单。
或使用WebRTC。通过这种方式,工人们可以与时间交谈,但他们也可以互相交谈。
或者在将接收任务的工作者上创建(经过身份验证的)HTTP(s)REST端点。就像,POST /tasks
将在工人身上创建一个任务。如果任务很短,它可以立即回复,以便时钟知道作业已完成。或者如果它是一个较长的任务,它可以确认它,但后来在时钟上调用一个端点来说它已完成,类似于PUT /tasks/32
。
甚至更直接地,打开与时钟的直接网络连接,例如在工作人员启动时(以及相反的方式)。使用dgram
并在worker和clock之间发送UDP消息。
无论如何,我也相信人们建议使用像RabbitMQ这样的MQ会更好地推动工作/任务。然后它可以根据需要分配任务,并根据作业队列上的unacked
计数,它可以在需要时启动更多的工作。
但是您的问题非常广泛,因此要获得更多详细信息,您可以提供更多详细信息。
答案 2 :(得分:0)
答案 3 :(得分:0)