我正在设计一个新的Node.JS应用程序。我看到了获得高可用性生产环境的许多选择和可能性:负载均衡的应用程序和反向代理,Redis集群,MongoDB副本和分片部署等。
我正在计划的解决方案需要后台进程,对特定的MongoDB表和内存中的Redis数据进行一些处理。作业需要每分钟运行一次,我不能与同一作业的另一个实例并行运行。
我知道如何使用计时器在Node中构建这种工作。另一方面,我知道我可以通过一些监控过程来探究工作流程,但我可以看到如何在另一台主机中替换失败的应用程序的明确解决方案。
我发现了一些关于“HA Singleton”(Java世界中的一种模式)和基于数据库的锁来解决这种情况的博客文章。可能是我可以使用存储在Redis复制数据存储上的锁来实现锁定机制,其中几个作业汇集了锁状态,但我想很难实现一些“极端”情况(一个工作池锁定状态一些上一份工作后的毫秒数。)
关于如何解决这种情况之王,有任何最佳实践模式吗?
答案 0 :(得分:2)
我已经使用mongodb-queue了。要获得“定期单例”行为,我在启动时创建一个具有相应delay
设置的队列,检查queue.size()
,如果为零则添加作业。然后我运行setInterval
定期执行queue.get
。如果返回null,则为no-op。如果它返回一份工作,那就完成工作了queue.add
然后再做一次。