如何在分布式环境中处理单例类

Posted

技术标签:

【中文标题】如何在分布式环境中处理单例类【英文标题】:How to Handle Singleton Classes in Distributed Environment 【发布时间】:2011-09-14 04:25:11 【问题描述】:

当一个应用程序分布在多个 JVM 上时,我的单吨类将在每个 JVM 上有多个实例。为此,我必须生成一个唯一 ID,我必须使用单例模式类。在独立环境中工作正常。如何在分布式环境中创建单例模式,以便我们只能使用一个实例?

编辑:对于我的应用程序,我需要创建类似的用户 ID

如果名称类似于 Pavan Kumar,则用户 ID 应为 pavankumar,如果系统中已存在此用户 ID,则用户 ID 应类似于 pavankumar1、pavankumar2 等......

如果对同名用户的多个请求来自不同的服务器,可能会导致 id 重复。为此,我想在分布式环境中使用单例。

【问题讨论】:

“我必须为此目的生成一个唯一 ID”你是什么意思?您希望所有 signlton 类都使用相同的 id 吗? 在我的应用程序中,我需要为每个用户生成一个唯一的 id ..... 也许可以多描述一下为什么需要这个单例对象——它是什么时候创建和访问的,如果在不同的机器上有多个实例,为什么会出现问题? @Sannisetty Pavan 这是否意味着您的应用程序中有一个为每个用户创建 UUID 的类,并且您想让该类成为单例?在这种情况下,如果在所有 VM 上都创建了此类,会出现什么问题。如果可能,请发布有问题的代码。 我需要在 Tivoli Directory Server LDAP 中创建它........ 【参考方案1】:

你可以试试hazelcast [doc]。这个库允许你拥有分布式锁和数据结构,你可以使用它来编写你的单例。

【讨论】:

【参考方案2】:

很长一段时间后,我找到了这个问题的可靠答案。可以使用 AKKA 工具包在分布式环境中实现单例。关于如何实现的细节可以从这里找到http://doc.akka.io/docs/akka/2.3.1/contrib/cluster-singleton.html

【讨论】:

【参考方案3】:

您是否考虑过使用分布式缓存,例如来自 Apache Commons 的 Java Caching System 或来自 Oracle 的 Coherence Cache?这可能有点矫枉过正,但这真的取决于你到底想要做什么。

【讨论】:

【参考方案4】:

您可以使用中心位置(如数据库)来生成 ID。当然,您需要对资源进行适当的锁定,以便一次只能被一个实体修改。

【讨论】:

【参考方案5】:

如果你要将实体持久化到数据库,你可以依靠数据库序列为你生成一个id;简而言之,将解决方案从让多个 jvm 生成唯一 id 转换为单个数据库来执行此操作。除此之外,还有像@nicholas 提到的解决方案,可以根据您的需求和规模加以利用。

【讨论】:

以上是关于如何在分布式环境中处理单例类的主要内容,如果未能解决你的问题,请参考以下文章

请问java 单例类 与 静态类 有何不同?

Java单例模式详解

如何对枚举类型实现的单例模式进行mock

Python单例模式的实现方式

23种设计模式之单例模式

java设计模式之单例模式