3

假设我在每台服务器上都有一个本地缓存,使用 LRU 缓存或类似的东西。如果我在一个节点上使对象无效,则应注意其他节点。我已经看到用 jgroups 实现了这一点。

我想知道使用 jms(比如说 ActiveMQ)的“缓存失效队列”是否适合该应用程序。不确定响应时间等等。

4

2 回答 2

5

这取决于您的限制,即您可以承受过时的读取多长时间(即缓存返回过时的数据)。

如果这根本没有什么坏处,JMS 是通知所有成员的一种很好且干净的方式,因为它很容易确保每个成员最终都收到“刷新”消息。

如果您需要确保立即刷新过时的数据,您可以使用 JMS 通过向游戏添加事务和请求/响应周期来协调刷新。但这意味着如果您不小心,您可能会遇到死锁或饥饿进程——这就是您必须为同步付出的代价。

如果这让您感到困扰,那么问题是您可以使用哪些其他技术来实现相同的结果。您可以使用 RMI 或套接字,但随后您将不得不重新发明轮子(这意味着您将花费大量时间来了解 JMS 的现状)。但这只会用另一种传输技术取代一种传输技术——它对同步问题没有帮助。

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

于 2012-12-17T15:35:02.900 回答
3

我想知道使用 jms(比如说 ActiveMQ)的“缓存失效队列”是否适合该应用程序。

绝对地。JMS 增加了一些开销,但是如果您没有在第二次处理数千个事务,您将感觉不到它。Aaron 解释得很好,我只想补充一点,我们在几个应用程序中使用 JMS 进行缓存失效,并且它运行良好。您可能感兴趣的一些材料:

于 2012-12-18T08:05:51.207 回答