群集环境中的单身人士

将Singleton对象重构为集群环境的最佳策略是什么?

我们使用Singleton从数据库caching一些自定义信息。 它主要是只读的,但在发生某些特定事件时会刷新。

现在我们的应用程序需要部署在一个集群环境中。 根据定义,每个JVM将有它自己的Singleton实例。 因此,当单个节点上发生刷新事件并刷新其caching时,JVM之间的caching可能会不同步。

保持caching同步的最佳方法是什么?

谢谢。

编辑:caching主要用于向用户界面提供自动完成列表(性能原因),我们使用Websphere。 所以任何Websphere相关的技巧欢迎。

最简单的方法是:

  1. 添加一个到期计时器到你的单例caching,这样每隔一段时间caching清除和后续调用从源(如数据库)获取更新的数据,

  2. 使用类似JMS主题/ tibRV的方式为caching实现通知机制。 获取每个caching实例以订阅并响应在该主题上广播的任何更改消息。

用分布式cachingreplace您的单身caching。

一个这样的caching可能是JBoss Infinispan,但是我确定存在其他分布式caching和网格技术,包括商业版本,在这一点上可能更成熟。

一般来说,对于单身物体,我不确定。 我想我会尽量不要单身。

您可以使用WAS内置的DistributedMap 。

-Rick

或者像memcached的东西

http://www.danga.com/memcached/

什么是memcached? memcached是一个高性能,分布式的内存对象caching系统,通常是用于加速dynamicWeb应用程序,通过缓解数据库负载。

Danga Interactive开发了memcached以提高LiveJournal.com的速度,LiveJournal.com是一个已经为一百万用户提供了2000万次dynamic页面浏览量的网站,拥有大量的networking服务器和一堆数据库服务器。 memcached将数据库负载降到几乎没有,为用户带来更快的页面加载时间,更好的资源利用率,以及在memcache未命中时更快地访问数据库。

如果可能的话,尽可能使用你的应用服务器的支持,如果可能的话(一些有,有些则不)。 例如,我们使用JBoss对“HA Singleton”的支持,这个“HA Singleton”是一个只能在集群主节点上运行的服务。 这不是完美的(你必须处理这种情况下,偶尔脑屁),但它是够好的。

否则,您可能可以使用JGroups进行工程devise,JGroups提供了集群节点自动发现和协商,但这并不重要。

作为最后的手段,您可以使用数据库locking来pipe理集群单例,但这是非常脆弱的。 不build议。

作为群集单例的替代,您可以使用分布式caching。 我推荐JBossCache (不需要JBoss应用服务器运行)或者EhCache(它现在提供一个分配机制)。 你将不得不重新devise你的caching,以分布式的方式工作(这不会神奇地工作),但它可能是一个更好的解决scheme比一个集群单身。

我跟Vest Hansen先生在这个上,尽可能远离单身人士。 在被SAAJ和JAXP的噩梦所困扰,并且在JBoss上获得兼容版本后,我完成了单身人士和工厂。 SOAP消息不应该需要工厂来实例化它。

好的,咆哮过来,memcache或类似的东西呢? 你的caching需要什么样的亲和力? 如果它已经过时了,还是在数据如何过时方面有一些灵活性,那么这样做是不是很糟糕?

有几种方法可以解决这个问题,具体取决于:1)数据是如何丢失数据的; 2)每个实例在所有时间都需要有相同的值。

如果您只需要数据合理的数据,但每个JVM不需要有匹配的数据,则可以让每个jvm按照相同的时间表(例如,每30秒)刷新一次数据。

如果刷新需要在几乎同一时间发生,你可以让一个jvm发送一条消息给其他人说“现在刷新的时间”

如果每个jvm总是需要相同的信息,你需要做一个同步,主人说“立即刷新”,所有的caching阻塞任何新的查询,刷新,并告诉主人,他们已经完成。 当主服务器从群集的每个成员获得答案时,它会发送另一条消息说要继续。

我面临着类似的情况,但我正在使用Oracle的WebLogicCoherence

我正在处理一个Web应用程序,该应用程序使用从数据库读取的caching数据(文本显示在Webform的标签上)的散列表 。 为了做到这一点,开发人员使用了一个单例实例来存储所有这些信息。 这在单个服务器环境中运行良好,但是现在我们想要进入群集解决scheme,并且正在面对与此单例实例有关的问题。

从现在我读到的, 这是完成我想要的最好的解决scheme 。 我希望这也能帮助你解决你的问题。

在这种情况下,有产品可以在内存caching中分发(例如memcache)。

一个更好的解决scheme,如果可能的话,可能是单身人士不是真正的单身人士,但应用程序容忍有单独的实例(说,都需要刷新时才能识别),而不是必须跨JVM同步,这可能会将您的caching转化为瓶颈。