假设我使用LRU Cache或类似的东西在每个服务器上都有一个本地缓存。 如果我在一个节点上使对象无效,那么应该注意其他节点。 我已经看到这是用jgroups实现的。
我想知道使用jms(比如说ActiveMQ)的'缓存失效队列'是否适合应用程序。不确定响应时间等等。
答案 0 :(得分:5)
这取决于你的约束,即你可以承受过时的读取多长时间(即缓存返回过时的数据)。
如果这根本不会造成伤害,JMS是一种通知所有成员的好方法,因为很容易确保每个成员最终获得“刷新”消息。
如果您需要确保立即刷新过时的数据,您可以使用JMS通过向游戏添加事务和请求/响应周期来协调刷新。但这意味着如果你不小心,你可能会陷入死锁或饥饿的过程 - 这是你为同步付出的代价。
如果这让您感到困扰,那么问题是您可以使用其他技术来获得相同的结果。您可以使用RMI或套接字但是,您必须重新发明轮子(这意味着您将花费大量时间来获取JMS已经存在的位置)。但这只会替换另一种传输技术 - 它对同步问题没有帮助。
或者您可以使用支持群集的缓存。您可以尝试使用Terracotta的Enterprise Ehcache,但在引擎盖下,它将使用类似的技术来保持缓存同步。最大的优点是Ehcache已经使用了多年(=已调试),所以你只会遇到众所周知的问题。
答案 1 :(得分:3)
我想知道是否使用jms'缓存失效队列'(let 说ActiveMQ)适合应用程序。
绝对。 JMS增加了一些开销,但是如果你在第二次没有成千上万的交易,你就不会感觉到。 Aaron解释得很清楚,我只是补充一点,我们在几个应用程序中使用JMS进行缓存失效,并且它运行良好。您可能感兴趣的一些材料: