在多个节点上更新操作并发性

问题描述:

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

非常感谢

+0

我会研究一种使用面向消息的解决方案的架构。恕我直言,你选择了一个容易出现困难的架构/实现。 –

+0

还是依赖数据库中的数据:事务(和隔离级别)来防止同时更新,可能还有一个存储最后更新的时间戳的列,您可以在执行更新之前检查它们? – dkoper

+0

该应用程序托管在多个节点上的云中,并作为休息服务被调用。所以只有一个节点会响应外部休息呼叫。唯一的挑战是在应用程序中执行的调度机制。有两种应用程序可以知道的方式,一种已经启动了调度过程,另一种则不应该这样做。换句话说,在两个不同节点上托管的相同应用程序之间的相互通信。 – IMahajan

几个选项来介意的Cloud Foundry:

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

    如果你有很多工作要做,你可以将它分成不同的部分并为每个部分锁定,这样你就可以将工作分散到不同的实例中。尽管这会变得更加复杂,所以你必须权衡这些额外复杂的优势,看看它是否值得用于你的用例。

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

希望帮助!