将Singleton对象重构为集群环境的最佳策略是什么?
我们使用Singleton从数据库缓存一些自定义信息。它的主要是只读,但在某些特定事件发生时会刷新。
现在我们的应用程序需要部署在Clustered环境中。根据定义,每个JVM都有自己的Singleton实例。因此,当单个节点上发生刷新事件并刷新其缓存时,缓存可能在JVM之间不同步。
保持缓存同步的最佳方法是什么?
感谢。
编辑:缓存主要用于向UI提供自动完成列表(性能原因),我们使用Websphere。所以任何与Websphere相关的技巧都欢迎。
答案 0 :(得分:16)
用分布式缓存替换单例缓存。
一个这样的缓存可能是JBoss Infinispan,但我确信存在其他分布式缓存和网格技术,包括此时可能更成熟的商业技术。
对于一般的单身对象,我不确定。我想我一开始就试着没有单身人士。
答案 1 :(得分:9)
最简单的方法是:
为您的单例缓存添加一个到期计时器,以便每隔一段时间缓存一次被清除,并且次要调用从源(例如数据库)获取更新的数据
使用类似JMS主题/ tibRV的内容实现缓存的通知机制。获取每个缓存实例以订阅并响应在此主题上广播的任何更改消息。
答案 2 :(得分:8)
您可以使用内置于WAS中的DistributedMap。
-Rick
答案 3 :(得分:4)
或类似memcached
http://www.danga.com/memcached/
什么是memcached? memcached是一个 高性能,分布式内存 对象缓存系统,泛型 性质,但打算用于 加速动态Web应用程序 通过减轻数据库负载。
Danga Interactive开发了memcached 提高速度 LiveJournal.com,这是一个网站 已经做了2000万+动态页面 100万用户每天的观看次数 一堆网络服务器和一堆 数据库服务器memcached掉线了 数据库加载到几乎没有, 产生更快的页面加载时间 用户,更好的资源利用率, 并且可以更快地访问数据库 记得小姐。
答案 4 :(得分:1)
如果可能,请尽可能使用您的应用服务器支持(有些人有,有些人没有)。例如,我们使用JBoss对“HA Singleton”的支持,这是一种仅在集群主节点上运行的服务。它并不完美(你必须处理偶尔脑屁的情况),但这已经足够了。
如果做不到这一点,你可以使用JGroups来设计一些东西,它提供集群节点自动发现和协商,但这并不重要。
作为最后的手段,您可以使用数据库锁定来管理群集单例,但严重脆弱。不推荐。
作为群集单例的替代方法,您可以使用分布式缓存。我建议JBossCache(不需要运行JBoss app服务器)或EhCache(现在提供分发机制)。你必须重新设计缓存才能以分布式方式工作(它不会神奇地工作),但它可能是一个比集群单例更好的解决方案。
答案 5 :(得分:1)
我和Vest Hansen先生在这一方面,尽可能远离单身人士。在遭遇SAAJ和JAXP的噩梦以及在JBoss上运行的兼容版本之后,我完成了单身人士和工厂。 SOAP消息不需要工厂来实例化它。
好吧,咆哮,memcache或类似的东西怎么样?您的缓存需要什么样的亲和力?如果它过时了,或者数据可以过时的灵活性是不是很糟糕?
答案 6 :(得分:1)
有几种方法可以解决这个问题,具体取决于1)数据的数据输出方式,以及2)每个实例的所有时间都需要具有相同的值。
如果您只需要合理的数据数据,但每个JVM都不需要具有匹配的数据,您可以让每个jvm以相同的时间表刷新其数据(例如,每30秒)。
如果刷新需要在大约相同的时间发生,你可以让一个jvm发送一条消息给其他人说“现在要刷新的时间”
如果每个jvm总是需要相同的信息,你需要进行同步,主人说“立即刷新”,所有缓存都会阻止任何新的查询,刷新,并告诉主人他们已完成。当主服务器从群集的每个成员获得回复时,它会发送另一条消息,表示要继续。
答案 7 :(得分:1)
我面临着类似的情况,但我正在使用Oracle的 WebLogic 和 Coherence 。
我正在使用 hashmap 的Web应用程序,其中包含从数据库中读取的缓存数据(文本显示在 webform 的标签上)。为实现此目的,开发人员使用单例实例存储所有这些信息。这在单一服务器环境中运行良好,但现在我们想要进入集群解决方案,我正面临着这个单例实例的问题。
从我现在所读到的this is the best solution to accomplish what I want开始。我希望这也可以帮助你解决问题。
答案 8 :(得分:0)
有些产品可以在这种情况下提供分布式内存缓存(例如memcache)。
如果可能的话,一个更好的解决方案可能是让单例不是单一的,但让应用程序容忍具有单独的实例(比如说所有实例都需要刷新时识别)而不是它们必须同步跨越JVM,可以将缓存变成瓶颈。