gpt4 book ai didi

node.js - 如何处理集群中基于时间的事件?

转载 作者:太空宇宙 更新时间:2023-11-03 23:25:09 24 4
gpt4 key购买 nike

我有一个在集群中运行的 Node.js 应用程序,因此,有许多应用程序实例同时运行并接受来自负载均衡器的请求。

假设我的应用中有一个“订阅”的概念,每个订阅都存储在带有 dateStartdateEnd 字段的中央数据库中。对于每个订阅,我需要发送通知,提醒客户订阅到期(例如到期前 14 天、7 天和 3 天)。另外,我需要将订阅标记为过期,并在时机成熟时执行一些额外的逻辑。

处理多实例应用程序的此类基于时间的事件的最佳实践是什么?

我可以让我的应用程序运行过期例程,例如每五分钟一次,但随后我将不得不处理并发问题,因为每个实例都会尝试这样做,并且我们不希望通知提交两次。

最佳答案

几年前,当我们对一个系统进行集群时,我重构了它的预定作业,这与您所描述的问题类似。

我创建了一个集群感知的计划作业监视器,并使用数据库来确保在任何给定时间只有一个正在运行。每个在启动时都会生成自己唯一的 GUID,并将其用作 ID。启动时,它们都会查看数据库,根据指示 ID、启动时间和上次运行的表来查看主数据库是否正在运行。如果记录的上次运行是在指定时间,则主数据库正在运行。如果主服务器正在运行,其余的服务器将作为备份继续运行,并在给定的时间间隔内进行检查,以便在主服务器出现故障时接管。如果主表死亡,接替主表的表会用其 ID 标记记录并更新时间,然后在其他表中查找与您的订阅类似的作业。主 Node 将继续以可配置的时间间隔寻找作业,直到它死亡或重新启动。

在测试过程中,我能够启动 50 多个监视器实例,这些实例都不断尝试成为主监视器。只有一个会接管,在测试过程中我会手动杀死主 Node 并观察其他所有 Node 争夺主 Node ,但只有一个会获胜。这种方法依赖于数据库记录,仅允许其中一个线程根据记录中的先前信息使用合格的更新来更新记录。

关于node.js - 如何处理集群中基于时间的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45279048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com