【发布时间】:2016-10-04 19:07:54
【问题描述】:
我有一个 Node.js 应用程序,其中包含一小部分用户,目前使用单个 Web 进程进行架构。我正在考虑添加一个保存后触发器,当将记录添加到我的一个表时将调用该触发器。执行保存触发器后,我想对外部 API 执行大量 IO 操作。 IO 操作的数量取决于记录上的数组列中的元素数量。因此,在将每条记录保存到此特定表中后,我可能会执行大量异步操作。
我考虑过按照Worker Dynos, Background Jobs and Queueing 中的建议将这项工作转移到后台工作中。文章根据经验给出了将耗时超过 500 毫秒的任务移至后台作业。但是,在使用 RabbitMQ (Asynchronous Web-Worker Model Using RabbitMQ in Node) 完成示例后,我不认为值得花时间设置所有内容。
所以,我的问题是:
- 对于并发用户数量有限的应用,是否可以将长时间运行的函数留在 Web 进程中?
- 如果我最终决定将这项工作发送到后台作业,那么更改我的保存后触发器似乎并不难。我错过了什么吗?
- 有没有比实现消息队列更容易的方法?
【问题讨论】:
-
运行多长时间? Heroku 的路由器将终止一个耗时超过 30 秒的请求。 devcenter.heroku.com/articles/request-timeout
-
不,肯定不会花那么长时间。我想应该不会超过 10 秒。
-
那么只要遇到那个长请求的用户不介意,你可以推迟到以后。
-
明白了。所以 500 毫秒的经验法则更像是创建响应式应用的最佳实践?
-
是的。这不是技术限制或 Heroku 强制执行的任何操作(与 30 秒限制不同)。这只是一个最佳实践。
标签: node.js heroku rabbitmq message-queue