使用JMS实现缓存失效是否切实可行?

3
假设我在每个服务器上都有一个本地缓存,使用LRU Cache或类似的东西。如果我在一个节点上使一个对象无效,其他节点应该注意到。我看过这种实现是使用jgroups。
我想知道是否可以使用jms(比如ActiveMQ)来创建“缓存失效队列”以适用于该应用程序。不确定响应时间等方面。
2个回答

5
这取决于您的限制,即您能忍受过时读取(即缓存返回过时数据)的时间有多长。
如果完全没有影响,JMS是通知所有成员的好方法,因为很容易确保每个成员最终都能收到“清除”消息。
如果您需要立即刷新过时数据,则可以使用JMS通过添加事务和请求/响应周期来协调刷新。但是,这意味着如果不小心,您可能会遇到死锁或饥饿进程 - 这就是您必须为同步付出的代价。
如果这让您感到困扰,那么问题是您可以使用什么其他技术来实现相同的结果。您可以使用RMI或套接字,但是那样您将不得不重新发明轮子(这意味着您将花费大量时间才能达到JMS今天已经达到的地步)。但这只会用另一种传输技术替换一种 - 它不能解决同步问题。

或者您可以使用支持集群的缓存。您可以尝试使用Terracotta的Enterprise Ehcache,但在幕后,它将使用类似的技术来保持缓存同步。最大的优点是Ehcache已经被使用(=调试)多年了,因此您只会遇到众所周知的问题。


2
只是为了增加一些选择:Apache Zookeeper在这种情况下很好。 - Jonas Adler

3
我想知道使用JMS(比如ActiveMQ)的“缓存失效队列”是否适用于该应用程序。
当然可以。JMS会增加一些开销,但如果每秒没有数千个事务,您不会感觉到它。 Aaron解释得很好,我只想补充一点,我们在几个应用程序中使用JMS进行缓存失效,它运行得非常完美。以下是一些可能对您有用的材料:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接