我正在开发一项服务,需要每五分钟为不同的用户分析来自社交媒体网络的数据。我正在使用 node.js 开发它,并将在 Heroku 上实现它。
根据本文 https://devcenter.heroku.com/articles/scheduled-jobs-custom-clock-processes在 Heroku 网站上,最好的方法是将调度程序的逻辑与工作线程的逻辑分开。事实上,我们的想法是拥有一个专用于安排任务的测功机以避免重复。该测功机指示一组工人(根据需要有 n 个测功机)执行任务。
这是该架构的 procfile:
web: node web.js
worker: node worker.js
clock: node clock.js
问题是如何在node.js中实现。我用 google 搜索了一下,建议是使用消息队列系统(如 IronMQ、RabbitMQ 或 CloudAMQP)。但我试图将我的代码和应用程序设置得简单,并且只需要很少的附加组件。
问题是:有没有办法直接从我的调度程序(时钟)与工作测功机进行通信?
感谢您的回答。
Heroku dynos 没有固定的 IP 地址,因此无法在它们之间建立直接连接。这就是为什么您需要创建一个具有静态 IP 或其他固定端点的单独服务器实例作为中间人。
您至少有两个可行的选择:RabbitMQ 类型的消息队列,或使用 pub-sub redis feed 的精简版本。我通常使用后者,因为它快速、简单且足够强大,可以满足我的所有需求(例如,如果消息千载难逢地丢失,也没什么大不了的)。但是,如果您必须不丢失消息,则应该使用成熟的消息队列,例如 RabbitMQ。
设置 redis 实现非常简单。有几个 Redis 附加组件(我使用 RedisCloud)提供免费且廉价的计划。当您配置它们时,您将获得一个要连接的端点和一个密码。然后,您只需将 Web dyno 和 Worker dyno 连接到 Redis 实例,以便您的 Web 应用程序将任务发布到频道,并且 Worker 订阅该频道。
如果您需要 Web 应用程序在任务完成后与客户端进行通信,您只需创建另一个通道,让 Worker 发布任务完成消息,并让 Web 应用程序监听这些消息。
您永远不会遇到重复的任务,因为每次工作人员收到一条消息时,它就会从队列中弹出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)