今天,使用 JPA、Guice、JSR 303 bean 验证构建平台非常快。掀起一些东西是相当容易的。
假设我正在使用 Guice,并且我有一个轮询进程作为 JVM 机器集群中的单例。我怎么能轻易做到
- 当集群启动(3台机器)时,只有一台启动了单例
- 当运行单例的机器出现故障时,另一台机器启动了单例
对于今天的图书馆来说,这不会太难,对吧?我看的越多,我认为 jgroups 就是答案,但想听听其他人的意见(Jboss 使用我迄今为止看到的 jgroups)。
今天,使用 JPA、Guice、JSR 303 bean 验证构建平台非常快。掀起一些东西是相当容易的。
假设我正在使用 Guice,并且我有一个轮询进程作为 JVM 机器集群中的单例。我怎么能轻易做到
对于今天的图书馆来说,这不会太难,对吧?我看的越多,我认为 jgroups 就是答案,但想听听其他人的意见(Jboss 使用我迄今为止看到的 jgroups)。
如果您的应用程序中有一个可用的中央数据库,则可以在数据库表行上使用悲观锁。特定服务器节点上的每个单例都试图在特定表行上获得一个悲观锁(在 Oracle 中由“SELECT FOR UPDATE”获取)。如果单例获得锁,它可以做任何需要的事情。否则它只是等待锁。如果正在工作的单例实例出现故障,另一个等待的单例将获得锁,从而开始工作。您必须注意不要通过提交或回滚来结束事务,以确保只要实例处于活动状态就保持行级锁。
或者,工作单例可以定期保存时间戳,其他等待的单例检查该时间戳是否在特定时间间隔内更新。如果它不再更新,另一个单例可以获得该时间戳的“所有者”并开始自己工作。这种方法不需要专门的数据库连接来持有锁,但是接管到另一个集群成员会更慢,因为必须等待超时。
——罗伯特
我会选择hazelcast和分布式锁定,看看Hazelcast 和 Singleton。
可能赤土陶器也可以做到这一点。
正如许多人所建议的那样,您可以使用 JGroups(没有任何 App 服务器)来完成此任务。示例实现可以在http://speakingjava.blogspot.in/2014/10/how-to-execute-singleton-task-in-cluster.html找到
我正在研究更多。JBoss 看起来他们使用看起来很简单的 jgroups,这也可能是一种方法。