群集环境中的单身人士
将Singleton对象重构为集群环境的最佳策略是什么?
我们使用Singleton从数据库caching一些自定义信息。 它主要是只读的,但在发生某些特定事件时会刷新。
现在我们的应用程序需要部署在一个集群环境中。 根据定义,每个JVM将有它自己的Singleton实例。 因此,当单个节点上发生刷新事件并刷新其caching时,JVM之间的caching可能会不同步。
保持caching同步的最佳方法是什么?
谢谢。
编辑:caching主要用于向用户界面提供自动完成列表(性能原因),我们使用Websphere。 所以任何Websphere相关的技巧欢迎。
最简单的方法是:
-
添加一个到期计时器到你的单例caching,这样每隔一段时间caching清除和后续调用从源(如数据库)获取更新的数据,
-
使用类似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的WebLogic和Coherence 。
我正在处理一个Web应用程序,该应用程序使用从数据库读取的caching数据(文本显示在Webform的标签上)的散列表 。 为了做到这一点,开发人员使用了一个单例实例来存储所有这些信息。 这在单个服务器环境中运行良好,但是现在我们想要进入群集解决scheme,并且正在面对与此单例实例有关的问题。
从现在我读到的, 这是完成我想要的最好的解决scheme 。 我希望这也能帮助你解决你的问题。
在这种情况下,有产品可以在内存caching中分发(例如memcache)。
一个更好的解决scheme,如果可能的话,可能是单身人士不是真正的单身人士,但应用程序容忍有单独的实例(说,都需要刷新时才能识别),而不是必须跨JVM同步,这可能会将您的caching转化为瓶颈。