Mysql 订阅系统作业调度器的设计

Mysql 订阅系统作业调度器的设计,mysql,node.js,scheduled-tasks,jobs,Mysql,Node.js,Scheduled Tasks,Jobs,我必须在我的NodeJS项目中开发/使用一个调度器来检查是否有订阅需要续订。作业需要每天运行一次,并检查我的数据库,若任何用户订阅记录的“enddate”在那个一天。如果是,运行一段逻辑来更新它(我有自己的更新逻辑,它不依赖于任何外部服务,如支付提供商/网关) 应用程序将在云中,这意味着我的所有应用程序实例都必须是无状态的。数据库(MySQL)是系统中唯一有状态的部分,更新逻辑只需运行一次 我该怎么做 订阅的“我的数据库表”行如下所示: Id: 1, User: John Doe, Plan:

我必须在我的NodeJS项目中开发/使用一个调度器来检查是否有订阅需要续订。作业需要每天运行一次,并检查我的数据库,若任何用户订阅记录的“enddate”在那个一天。如果是,运行一段逻辑来更新它(我有自己的更新逻辑,它不依赖于任何外部服务,如支付提供商/网关)

应用程序将在云中,这意味着我的所有应用程序实例都必须是无状态的。数据库(MySQL)是系统中唯一有状态的部分,更新逻辑只需运行一次

我该怎么做

订阅的“我的数据库表”行如下所示:

Id: 1, User: John Doe, Plan: Monthly Premium, Start Date: 1-10-2015, End Date: 30-10-2014, status : "ACTIVE"
问题:

1.)每天触发作业运行逻辑-在具有setInterval或调度程序库的NodeJ中易于解决


2.)运行一个辅助程序或一段代码来检查数据库并更新它-这只需要在每个用户订阅时发生一次。当daily scheduler触发进程时,许多实例可能同时运行续订逻辑。不确定如何解决这部分问题。

一种可能的解决方案是在crontab中添加一个shell脚本,该脚本每天都会运行。 此脚本将执行以下操作:

  • 使用sql语句或存储过程,查找订阅所在的记录 截止日期是今天
  • 对于这些记录,应用您的逻辑。(发送电子邮件或其他任何信息)
  • 标记记录以指示已完成某项操作 对于该用户(并在另一个字段中输入流程日期)
  • 您可以创建一个worker并使用它来触发订阅每天到期

  • 我不确定续费流程的作用。您可以使用“锁定某物”,直到续订过程完成并将其释放。我想我会用


  • 您可以使用,但它需要MongoDb来维护其状态。如果你同意再增加一个分贝,那么你可以试一试

    我不确定这里真正的问题是什么。如果问题“很容易解决”,那你为什么要问?你读了整个问题了吗?你看到问题的第二部分了吗?的确,我看到了,事实上,在第二部分的声明中没有问题,你不知道怎么做。他使用的是mysql而不是redis。没关系,我在堆栈上使用redis进行应用级缓存,我可以使用它。我不完全理解redlock的功能。@Koder“分布式锁在许多环境中是非常有用的,在这些环境中,不同的进程必须以相互排斥的方式使用共享资源进行操作。”谢谢,我刚刚看到了议程,添加MongoDb是唯一的问题。看起来它解决了我的问题。