node.js - 分布式 worker 的架构

标签 node.js redis rabbitmq

我们正在创建一个能够跨多个地理站点分配任务的网站。 该网站应该能够:

  • 创建任务,
  • 将其放入队列中,
  • 根据地理标准将其分配给 worker ,
  • 根据工作状态(步骤 1、2、3 等)更新网络界面,
  • 将最终结果保存在 mongodb 中并注意 Web 界面。

只要不在相同的地理条件下,我们就可以同时进行工作。

只要作业不在处理状态,我们就可以删除它。

我们当前的堆栈是:Angulajs - nodejs - mongodb。

我们的第一个想法是创建一个从远程工作线程到 mongodb 任务的 HTTP 池。关键是我们将有 20 多个远程工作人员,我们想要高频刷新(< 1 秒)。我们认为这种解决方案易于实现,但难以维护并且会使数据库过载。此解决方案高度依赖于网络 ping。

在网络上进行了一些研究后,我们找到了关于 rabbitMQ 和消息系统的文档。这似乎符合我们的大部分要求,但我看不出如何删除队列中处于待处理状态的特定作业以及如何轻松处理任务状态的更新。

我们还找到了关于 redis 的文档,redis 是 RAM 中的 KV 系统。这解决了能够删除队列中的特定任务并减少 mongodb 负载的问题,但我们看不到我们如何能够注意到远程工作人员正在做的工作。如果是 HTTP 池,我们将失去所有优势。

我们的情况似乎是一个常见的问题,我想知道最好的解决方案是什么?

最佳答案

Redis

Redis 很棒,因为除了作业队列之外,您还可以将它用于其他功能,例如缓存。我个人使用Kue .跨数据中心的 Kueing 作业可能不是最好的决定。虽然我不了解您的情况,但人们普遍认为您的数据模型集中在您的内容分布的地方。我运行一项在旧金山托管 API 的服务,并在旧金山和纽约市拥有 CDN Node 。我的内容是服务器端模板、图像、脚本、CSS 等。它们可以完全由我的 API 填充。

外包

如果您绝对需要此功能,我个人会推荐 iron.io .他们提供 2 项服务,或许可以解决您的问题。首先,他们通过 RESTful API 提供了一个 MQ 系统,该系统非常易于使用并且与 Node 完美配合。它们还提供 Worker 服务,允许您在其堆栈上排队、安排和运行任务。如果您需要从自己的云访问资源,这将是有限的,在这种情况下,我建议使用 ironMQ。

内源

如果您不想外包您的服务,并且想要托管 MQ,我不会推荐 rabbitMQ 用于作业队列。我会推荐类似 beanstalkd 的东西它更适合作业队列,而 RabbitMQ 更适合消息队列(谁会想到?)。

另外:

阅读了对其他一些答案的一些评论后,在我看来 beanstalkd 可能是您最好的方法。它更具体地针对作业队列,而许多其他 MQ 系统会实时发送有关更新的消息并在您的云中推送新数据,您必须在此基础上实现自己的作业队列系统。

关于node.js - 分布式 worker 的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22636439/

相关文章:

javascript - 如果测试失败,如何使 Mocha 在源文件中显示正确的行号?

node.js - Node.js中的图片上传

rabbitmq - 有和没有 x-queue-type : classic in RabbitMQ 的经典队列有什么区别

Django Celery 多个工作线程和多个队列

javascript - 努力使用 NodeJS 以所需格式获取 JSON

javascript - node.js超时重新启动api调用

symfony - 部署时清除 redis 中的学说缓存

caching - 维护 EC2 实例上的 redis 缓存之间的状态

node.js - Node JS Redis 客户端连接重试

rabbitmq - MassTransit 不发送消息 - RabbitMQ