【问题标题】:Update operation concurrency on multiple nodes多节点更新操作并发
【发布时间】:2017-12-20 11:14:02
【问题描述】:

我有一个应用程序,在云上的两个不同节点上维护。我在应用程序中有一个调度程序,它每 5 分钟触发一次,它在数据库中执行一些更新操作。如何避免这两个操作导致数据库异常。有没有一种方法可以让一个应用程序知道其他实例已经被触发,或者在云代工厂中可能发生任何类型的节点间通信。

非常感谢

【问题讨论】:

  • 我会研究一种使用面向消息的解决方案的架构。恕我直言,您选择了一个容易出现困难的架构/实现。
  • 或者依赖数据库中的数据:事务(和隔离级别)来防止同时更新,可能是一个额外的列存储了一个最后更新的时间戳,你可以在更新之前检查?
  • 应用程序托管在多个节点上的云上,并作为休息服务调用。所以只有一个节点会响应外部的休息呼叫。唯一的挑战是在应用程序中执行的调度机制。有没有一种方法可以让两个应用程序知道,一个已经开始调度过程,而另一个不应该这样做..换句话说,托管在两个不同节点上的相同应用程序之间的相互通信。

标签: oracle amazon-web-services spring-boot cloud-foundry paas


【解决方案1】:

对于 Cloud Foundry,我想到了几个选项:

  1. 用您的数据库创建一个分布式“锁”。这可以像数据库中的表或记录一样简单,调度程序在执行任何其他操作之前首先检查它。一旦获得锁定,调度程序就可以工作。如果它未能获得锁,它会重新进入睡眠状态。然后当它完成时,它会返回锁。

    如果您有很多工作要做,您可以将其划分为多个部分并为每个部分设置锁,这样您就可以将工作分散到不同的实例中。不过这会变得更加复杂,因此您必须权衡优势和额外的复杂性,看看它是否适合您的用例。

  2. 仅在第一个节点上运行调度程序。您可以通过查看应用程序实例编号来确定第一个节点。环境变量 CF_INSTANCE_INDEXVCAP_APPLICATION,其中包含 JSON 并具有 instance_index 属性。对于任一选项,第一个实例的值为 0。如果为 0,则调度程序运行。如果它大于零,则调度程序不会运行。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多