2

今天,使用 JPA、Guice、JSR 303 bean 验证构建平台非常快。掀起一些东西是相当容易的。

假设我正在使用 Guice,并且我有一个轮询进程作为 JVM 机器集群中的单例。我怎么能轻易做到

  1. 当集群启动(3台机器)时,只有一台启动了单例
  2. 当运行单例的机器出现故障时,另一台机器启动了单例

对于今天的图书馆来说,这不会太难,对吧?我看的越多,我认为 jgroups 就是答案,但想听听其他人的意见(Jboss 使用我迄今为止看到的 jgroups)。

4

4 回答 4

1

如果您的应用程序中有一个可用的中央数据库,则可以在数据库表行上使用悲观锁。特定服务器节点上的每个单例都试图在特定表行上获得一个悲观锁(在 Oracle 中由“SELECT FOR UPDATE”获取)。如果单例获得锁,它可以做任何需要的事情。否则它只是等待锁。如果正在工作的单例实例出现故障,另一个等待的单例将获得锁,从而开始工作。您必须注意不要通过提交或回滚来结束事务,以确保只要实例处于活动状态就保持行级锁。

或者,工作单例可以定期保存时间戳,其他等待的单例检查该时间戳是否在特定时间间隔内更新。如果它不再更新,另一个单例可以获得该时间戳的“所有者”并开始自己工作。这种方法不需要专门的数据库连接来持有锁,但是接管到另一个集群成员会更慢,因为必须等待超时。

——罗伯特

于 2012-04-10T13:15:44.010 回答
1

我会选择和分布式锁定,看看Hazelcast 和 Singleton

可能也可以做到这一点。

于 2012-04-05T18:35:42.407 回答
1

正如许多人所建议的那样,您可以使用 JGroups(没有任何 App 服务器)来完成此任务。示例实现可以在http://speakingjava.blogspot.in/2014/10/how-to-execute-singleton-task-in-cluster.html找到

于 2014-10-16T16:17:31.497 回答
0

我正在研究更多。JBoss 看起来他们使用看起来很简单的 jgroups,这也可能是一种方法。

于 2012-04-10T12:46:00.903 回答