分布式并发控制

我已经为此工作了几天,我已经找到了几种解决方案,但没有一个非常简单或轻量级。问题基本上是这样的:我们有一个由10台机器组成的集群,每台机器都在多线程ESB平台上运行相同的软件。我可以相当容易地处理同一台计算机上线程之间的并发问题,但是不同计算机上的相同数据上的并发性呢?

从本质上讲,该软件接收请求,通过Web服务将客户的数据从一个企业提供给另一个企业。但是,客户可能存在于其他系统上,也可能不存在。如果没有,我们通过Web服务方法创建它。因此,它需要一种测试和设置,但我需要某种信号量来锁定其他机器,以免造成竞争条件。我以前遇到过这样的情况:为单个本地客户创建了两次远程客户,这并不是真正可取的。

我从概念上玩弄的解决方案是:

  1. 使用我们的容错共享文件系统创建“锁定”文件,这些文件将由每台计算机根据客户进行检查

  2. 在我们的数据库中使用一个特殊的表,并锁定整个表,以便为锁定记录进行“测试和设置”。

  3. 使用Terracotta,这是一种开源服务器软件,有助于扩展,但使用中心辐射型模型。

  4. 使用 EHCache 同步复制我的内存中“锁”。

我无法想象我是唯一一个遇到过这种问题的人。你是怎么解决的?你是在内部做饭,还是有最喜欢的第三方产品?


答案 1

您可能需要考虑使用 Hazelcast 分布式锁。超级精简和容易。

java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor");
lock.lock ();
try {
// do your stuff
}finally {
   lock.unlock();
}

Hazelcast - 分布式队列,映射,设置,列表,锁定


答案 2

我们使用兵马俑,所以我想投票支持它。

我一直在关注Hazelcast,它看起来像另一种有前途的技术,但由于我没有使用它,因此无法投票支持它,并且知道它使用基于P2P的系统,我真的不会相信它满足了大规模的扩展需求。

但我也听说过Zookeeper,它来自雅虎,正在Hadoop的保护伞下移动。如果你喜欢冒险尝试一些新技术,这真的有很多希望,因为它非常精益和刻薄,只专注于协调。我喜欢这个愿景和承诺,尽管它可能仍然太绿色了。


推荐