【发布时间】:2010-09-10 16:25:13
【问题描述】:
我已经为此工作了几天,找到了几种解决方案,但没有一个非常简单或轻量级。问题基本上是这样的:我们有一个由 10 台机器组成的集群,每台机器都在多线程 ESB 平台上运行相同的软件。我可以相当容易地处理同一台机器上的线程之间的并发问题,但是不同机器上相同数据的并发呢?
本质上,该软件通过网络服务接收将客户数据从一家企业提供给另一家企业的请求。但是,客户可能存在也可能不存在于其他系统上。如果没有,我们通过 Web 服务方法创建它。所以它需要一种测试和设置,但我需要某种信号量来阻止其他机器引起竞争条件。之前我曾遇到过为一个本地客户创建两次远程客户的情况,这并不理想。
我在概念上尝试过的解决方案是:
使用我们的容错共享文件系统创建“锁定”文件,每台机器都将根据客户进行检查
在我们的数据库中使用一个特殊的表,并锁定整个表以便对锁定记录进行“测试和设置”。
使用 Terracotta,这是一种有助于扩展的开源服务器软件,但使用的是中心辐射模型。
使用 EHCache 同步复制我的内存中“锁”。
我无法想象我是唯一遇到过这种问题的人。你是怎么解决的?您是自己做的,还是有最喜欢的第 3 方产品?
【问题讨论】:
-
是否可以将确保没有任何重复的责任转移到创建新客户的服务中,而不是测试和设置?
标签: java concurrency load-balancing scaling terracotta