0

我有一个在群集中运行的Node.js应用程序,因此,有很多应用程序同时运行并接受来自负载平衡器的请求的实例。你如何处理集群中基于时间的事件?

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

什么来处理多实例的应用,基于时间的事件的最佳实践?

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

回答

1

我重构计划作业为我们的系统之一,当我们在几年前聚集了,类似的问题,以你所描述的。

我创建了一个集群感知预定作业监控以及所使用的数据库,以确保只有一个在任何给定的时间运行。每个在启动时都会生成自己的唯一GUID,并将其用于ID。在启动时,他们都会根据指示ID,开始时间和上次运行的表,查看数据库以查看是否正在运行主服务器。如果记录的上次运行具有指定的时间,则主要运行。如果主服务器正在运行,其余的服务器将继续作为备份运行,并检查给定的时间间隔以接管主服务器是否死机。如果主要死亡人员(接管主要死亡人员的人员使用其ID标记记录并更新时间),则在其他表格中查找与您的订阅类似的作业。主要人员将继续以可配置的时间间隔查找作业,直到它死亡或重新启动。

在测试过程中,我能够旋转起来50+,所有试图不断成为主要监视器的实例。只有一个人会接管,在测试过程中,我会手动杀死小学生,并观察其他人都争夺小学生,但只有一个人会占上风。此方法依赖于数据库记录,只允许其中一个线程根据记录中的先前信息使用合格的更新更新记录。

+0

感谢您抽出时间来分享。它看起来像一个强大的解决方案,我会牢记这一点!但是,我正在考虑采用行级锁定的类似方法,但在更细化的级别上。我在想,每个工作人员都可以从数据库中提取挂起的“作业”,并锁定要处理的行,然后将每个作业标记为“完成”。我希望通过这种方式,工作将更均匀地分配到所有实例中,锁定将防止工作人员抓住已经挂起的工作。你怎么看? –

+0

如果您想利用多个节点来处理作业负载,那么这也是一种有效的方法。我选择把主要角色作为争论的焦点,这样我所需要关心的就是确保只有一个人成为首要工作并且工作。我认为,只要在每个工作记录中您都有一个空中状态,标记谁在工作,以及他们最后一次接触工作的时间,您应该能够确定工作是否失败,并在合理的超时后恢复工作。 – NinePlanFailed