1

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

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

4

3 回答 3

2

一些 Java EE 供应商已经分发了缓存解决方案(例如 WebSphere 的对象网格),并且您已经确定了 3rd 方产品,但我认为不存在可移植标准。

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

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

于 2009-07-31T20:44:22.943 回答
1

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

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

于 2009-07-31T20:41:16.133 回答
1

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

这应该满足您的要求:

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

于 2009-07-31T22:23:08.297 回答