群集服务器上的Singleton



我有一个应用程序,它将一组复杂的规则与事务进行比较。因为规则不会经常更改,而且有很多事务,所以我将从数据库中获取规则作为一个单一项(RuleInfo)。当规则更改时,我调用updateRuleInfo。

 public static void updateRuleInfo(){
      instance = new RuleInfo();    

这在我的开发和测试环境中非常有效,因为它们都在单个服务器上,但是,我们的生产环境是WebSphere集群环境(2台服务器,每个服务器有2个节点)。因此,如果更新了人员或工具的规则,则更改会显示在一个节点上,但用户可能会尝试在另一个节点进行交易并获取旧的规则集。我试着在每次有人登录应用程序时调用updateRuleInfo,但这也不总是有效的。

有没有办法在所有节点上更新singleton?

据我所知,您正在使用您的singleton作为数据缓存。因此,当原始数据发生更改时,您必须告诉所有singleton使其数据无效,以便在下次访问时重新加载它们自己。

实现这一点的一种方法是使用JMS发布/订阅模式。部署JMS主题;所有的singleton服务都订阅了该主题,并在其数据源发生更改时得到通知。

请参阅http://www.javaspecialists.eu/archive/Issue052.html("分布式Singleton缓存"一章)。

集群环境中的单体是棘手的

检查此解决方案:

辛格尔顿服务

具有分布式锁的Hazelcast

Memcache(如果数据量适合内存)

最好是在每个节点上运行singleton,并从唯一的后端获取数据

问候

最新更新