使用应用程序级别范围聚类/复制计数器状态

时间:2009-07-31 20:34:50

标签: java java-ee weblogic cluster-computing

我需要在八节点集群中复制一个序列/计数器。这意味着每个http请求通过调用类似getNextIntAndIncrement()的方式接收序列中的下一个值,其中序列状态在所有服务器之间同步。为了澄清,这必须存在于应用程序/全局范围,而不是会话。我知道这听起来像一个可怕的想法,无疑会导致瓶颈,但这是要求。

我的问题是什么是最好的解决方案?我查看了有状态会话bean,但它们似乎只针对一个客户端。我考虑过数据库序列。我也看过兵马俑聚集;他们有一个序列演示http://www.terracotta.org/web/display/orgsite/Recipe?recipe=sequencer但是,如果存在J2EE解决方案,我想避免使用第三方解决方案。我正在使用Weblogic 8.1。

3 个答案:

答案 0 :(得分:2)

一些Java EE供应商已经发布了缓存解决方案(例如WebSphere的Object Grid),并且您已经识别了第三方产品,但我认为不存在便携式标准。

数据库解决方案有什么问题?显然需要锁定,所以为什么不留给DB。我的猜测是,如果你真的需要真正的增量值,没有遗漏的值等,那么与其他数据库值的事务关系将很重要,所以使用数据库。

如果您可以放松对绝对后续值的需求(即允许间隙),那么您可以分组数字,从而大大减少争用。如果你真的需要顺序值,没有间隙,那么你需要在实例之间进行某种程度的锁定 - 你不能允许第二个“线程”获得一个新的序列号,直到你“提交”使用现在的。如果你能承受丢失奇数序列号,那么你做得更好。或者,如果您可以在实例之间使用独立的编号方案,那么您处于更好的位置。例如,你服务器a,b,c ...的名称有ids a001,a002,b001,c001,c002等。

答案 1 :(得分:1)

我认为数据库序列可能会给您最确定的结果,特别是如果您使用高度序列化的事务来请求它。

但是,我会严肃质疑做这样的事情的有效性,但这只是我的2美分。

答案 2 :(得分:1)

此问题的标签中有weblogic - Weblogic允许群集单例。例如每个群集有一个具有故障转移支持的实例。

这应符合您的要求:

http://e-docs.bea.com/wls/docs100/javadocs/weblogic/cluster/singleton/SingletonService.html