首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器集群:一个任务

服务器集群:一个任务
EN

Stack Overflow用户
提问于 2012-11-23 16:50:23
回答 1查看 441关注 0票数 0

背景

我们的客户使用他们为之设定日常预算的服务。这是一项预付费服务,我们每天从用户预算中拨出一笔特定金额。

表:

  • 预算-允许我们每天花费多少
  • money -客户实际余额
  • money_allocated -从money中扣除的金额(根据预算计算)

有一个cron作业每隔几分钟运行一次并检查:

  • 如果用户有给定的一天的money_allocated
  • 如果money_allocated >= 预算(用户可以在白天增加预算)

在第一种情况下,我们分配了每日预算的全部金额,在后一种情况下,预算与当天已经分配的金额之间的差额(在这种情况下,我们在money_allocated中为同一天创建了额外的记录)。

分配有两个阶段--在第一轮中,我们添加一个状态为“待定”的行(请求分配),另一个cron检查所有“未决”分配,如果用户有足够的资金,则将 money 中的货币转移到。这将状态更改为“已完成”。

问题

我们有一个应用程序服务器集群(在北草坪会议大楼下)和上面的cron作业在每个服务器上运行,这意味着金钱可能会意外地被分配多次(如果我们实现错误的“已分配”触发器,则根本不会分配)。

我们的选择包括:

  • 只在一台服务器上运行cron作业-没有冗余、客户投诉和故障损失。
  • money_allocated上添加一个类似于(client_id、日期、金额)的唯一索引--如果客户在一天内将预算加倍或多次增加相同的金额,则不会为给定的一天分配更多的资金。

有一个选项可以记录预算中的每个移动,并将所有分配链接到“当天的第一次分配”或“更改预算(id xxx)”(将此添加到唯一索引中)。然而,这看起来还不够性感。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-25 00:13:16

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

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

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

此外,确保在短时间内自动替换此负载均衡器下的不健康实例,因为describe_load_balancers返回健康和不健康实例的列表。如果实例#1下降,您可能会有一段时间没有完成任务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13533082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档