java - 具有应用程序级范围的集群/复制计数器状态

标签 java jakarta-ee weblogic cluster-computing

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

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

最佳答案

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

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

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

关于java - 具有应用程序级范围的集群/复制计数器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1214738/

相关文章:

java - 如何在 Java SE 项目中使用 InitialContext 数据库信息

java - 使用 Tomcat 和 cookie 进行 session 管理

java - LibGDX Vector3 Lerp 问题

java - webview 在文件资源管理器中打开 .mht 文件

java - 支持多浏览器/选项卡 session J2EE/Web 应用程序

java - Spring 2.5.1 和 Xfire 1.2.6 - NoSuchMethodError : <init>

multithreading - 解释 BEA weblogic 线程转储 - 有用的文档和/或工具?

java - 按降序对基本类型数组进行排序

Java:如何只处理 SIGTERM?

java - Weblogic 和递归 JSP 标记