Cron 服务器集群:一个任务 背景

Cron 服务器集群:一个任务 背景,cron,cluster-computing,Cron,Cluster Computing,我们的客户使用他们设定每日预算的服务。这是一项预付费服务,我们每天从用户的预算中分配特定金额 表: 预算-我们每天可以花多少钱 资金-客户实际余额 分配的钱-从钱中扣除的今天可以使用的金额(基于预算) 有一个cron作业,每隔几分钟运行一次并检查: 如果用户在某一天分配了资金 如果分配了资金=预算(用户可以在白天增加预算) 在第一种情况下,我们分配每日预算的全部金额,在第二种情况下,我们分配当天预算和已分配金额之间的差额(在这种情况下,我们在当天分配的金额中创建额外记录) 分配分为两个阶

我们的客户使用他们设定每日预算的服务。这是一项预付费服务,我们每天从用户的预算中分配特定金额

表:

  • 预算-我们每天可以花多少钱
  • 资金-客户实际余额
  • 分配的钱-从中扣除的今天可以使用的金额(基于预算
有一个cron作业,每隔几分钟运行一次并检查:

  • 如果用户在某一天分配了资金
  • 如果分配了资金=预算(用户可以在白天增加预算)
在第一种情况下,我们分配每日预算的全部金额,在第二种情况下,我们分配当天预算和已分配金额之间的差额(在这种情况下,我们在当天分配的金额中创建额外记录)

分配分为两个阶段-在第一轮中,我们添加一个状态为“待定”(请求分配)的行,另一个cron检查所有“待定”分配,如果用户有足够的钱,则将钱从money移动到money\u allocated。此操作将状态更改为“已完成”

问题 我们有一个应用服务器集群(在NLB下)和在每个服务器上运行的cron作业,这意味着资金可能会被意外分配多次(如果我们实现了错误的“已分配”触发器,则根本不会分配)

我们的选择包括:

  • 仅在一台服务器上运行cron作业-无冗余、客户端投诉和故障损失
  • 分配的资金上添加一个独特的索引,类似于(客户id、日期、金额)-如果客户在一天内将预算翻倍或以相同的金额多次增加预算,则不会为给定的一天分配更多的资金
有一个选项记录预算中的每个变动,并将所有分配链接到“当天第一次分配”或“预算变更(id xxx)”(也将其添加到唯一索引)。然而,这看起来还不够性感


还有其他选择吗?任何建议都将不胜感激

好的,所以我在集群的一个实例上运行了这个。如果您使用Amazon AWS并且处于类似的情况,下面是一个选项

在每台机器上,在cron作业代码的开头,执行以下操作:

  • 调用
    description\u load\u balancers
    (AWS API),解析响应以获得所有实例的列表/数组
  • 获取
    http://169.254.169.254/latest/meta-data/instance-id
    -返回发送请求的机器的实例ID
  • 如果收到的实例ID在所有实例的列表/数组中为#1-继续,如果不是-退出

另外,请确保在短时间内自动替换此负载平衡器下的不健康实例,因为
description\u load\u balancers
会返回健康和不健康实例的列表。如果实例#1发生故障,您可能会有一段时间无法完成某项工作。

另外一个选项是获取特定服务器在NLB中的位置(它们不会更改)。如果它处于位置#1-它必须完成任务,否则-它必须跳过。但是,提供此类数据的NLB服务将返回所有已分配实例的列表,而不仅仅是那些正常的实例。因此,冗余问题依然存在。