我已经为此工作了几天,已经找到了几种解决方案,但是都没有一个非常简单或轻巧的解决方案。问题基本上是这样的:我们有一个由10台计算机组成的群集,每台计算机都在多线程ESB平台上运行相同的软件。我可以很轻松地处理同一台计算机上线程之间的并发问题,但是不同机器上同一数据上的并发又如何呢?
本质上,该软件接收请求,以通过Web服务将客户数据从一家公司传送到另一家公司。但是,客户可能存在或可能不存在于另一个系统上。如果没有,我们将通过Web服务方法创建它。因此,它需要某种测试和设置,但是我需要某种信号量,以防止其他计算机出现竞争状况。我曾经遇到过为一个本地客户创建两次远程客户的情况,这并不是很理想。
从概念上讲,我喜欢的解决方案是:
使用我们的容错共享文件系统创建“锁定”文件,每台机器将根据客户检查这些文件
在我们的数据库中使用特殊的表,并锁定整个表,以便对锁定记录进行“测试并设置”。
使用Terracotta,这是一种开放源代码服务器软件,可帮助扩展规模,但使用中心辐射型模型。
使用EHCache同步复制内存中的“锁”。
我无法想象我是唯一遇到过此类问题的人。您是如何解决的?您是在内部做饭还是有喜欢的第三方产品?
您可能要考虑使用Hazelcast分布式锁。超级轻巧易用。
java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor"); lock.lock (); try { // do your stuff }finally { lock.unlock(); }
Hazelcast-分布式队列,地图,集合,列表,锁定