【问题标题】:clustering/replicating counter state with application level scope具有应用程序级范围的集群/复制计数器状态
【发布时间】:2009-07-31 20:34:49
【问题描述】:

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

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

【问题讨论】:

    标签: java jakarta-ee weblogic cluster-computing


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        这应该满足您的要求:

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

        【讨论】:

        • 我(还)不明白这有什么帮助。 1)。一台服务器中的 HttpRequest 处理器如何访问单例服务中维护的计数? 2)。如果 Singleton 实例(或其服务器)发生故障,如何维护计数?在数据库中还是通过其他机制?
        猜你喜欢
        • 2020-03-28
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 2020-08-30
        相关资源
        最近更新 更多