node.js - 在 heroku 上用 node.js 开发一个时钟和 worker

标签 node.js heroku architecture scheduler worker

我正在开发一项服务,需要每五分钟为不同的用户分析一次来自社交媒体网络的数据。我在 node.js 中开发它,我将在 Heroku 上实现它。

根据 this article在 Heroku 网站上,最好的方法是将调度程序的逻辑与工作程序的逻辑分开。事实上,这个想法是让一个 dyno 专门用于安排任务以避免重复。这个 dyno 指示一群 worker (根据需要 n dynos)来完成任务。

这是这个架构的procfile:

web:    node web.js
worker: node worker.js
clock:  node clock.js

问题是如何在node.js中实现。我用谷歌搜索了一下,建议是使用消息队列系统(如 IronMQ、RabbitMQ 或 CloudAMQP)。但我正在尝试将我的代码和应用程​​序设置为简单,并且只需要很少的附加组件。

问题是:有没有办法直接从我的调度器(时钟)与工作测功机通信?

感谢您的回答。

最佳答案

Heroku dynos 没有固定的 IP 地址,因此无法打开它们之间的直接连接。这就是为什么您需要使用静态 IP 或其他充当中间人的固定端点创建一个单独的服务器实例。

您至少有两个可行的选择:RabbitMQ 类型的消息队列,或使用 pub-sub redis 提要的精简版本。我通常使用后者,因为它快速、简单且足够强大,可以满足我的所有需求(例如,如果消息每隔一次就丢失一次,这没什么大不了的)。但是,如果您永远不会丢失消息这一点很重要,那么您应该使用像 RabbitMQ 这样的成熟消息队列。

设置 redis 实现非常简单。有几个 redis 附加组件(我使用 RedisCloud)有免费和便宜的计划。当您配置它们时,您将获得一个要连接的端点和一个密码。然后,您只需将您的 web dyno 和 worker dyno 连接到您的 redis 实例,这样您的 web 应用程序就会将任务发布到一个 channel ,而 worker 会订阅该 channel 。

如果您需要网络应用在任务完成后与客户端通信,您只需创建另一个 channel 供工作人员发布任务完成消息,并让网络应用监听它们。

您永远不会重复任务,因为每次工作人员收到一条消息时,它就会从队列中弹出。

关于node.js - 在 heroku 上用 node.js 开发一个时钟和 worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28070496/

相关文章:

javascript - 如何将 100 万条记录异步保存到 mongodb?

node.js - Passport.js:记住我在 Express 应用程序中不起作用

spring-boot - Heroku SpringBoot ClassPathResource 获取 FileNotFoundException

postgresql - Heroku 中数据库的快照在哪里?

c# - 架构/设计模式问题

python - Flask 中的应用程序范围请求 Hook 。如何实现?

node.js - 异步eachLimit和同时RangeError : Maximum call stack size exceeded

node.js - 将视频文件上传到 NODEJS 中的 AZURE BLOB STORAGE

ruby-on-rails - Heroku 路线上带有 React 应用程序的 Rails 无法在刷新时工作

architecture - 如何估计支持 X 个用户/交易所需的硬件?