0

我对 Terracotta 很陌生,我已经安装并使它与 EHcache 一起正常工作以进行分布式缓存,但我现在得到的并不是我真正想要的。在我的应用程序中,我希望有几个带有 ehcache 的客户端缓存(L1),并将已删除密钥的失效从客户端“传播”到所有其他客户端。我不希望我的缓存也驻留在兵马俑服务器上,所以我想简单地禁用 L2 缓存,这样我的对象就不需要可序列化(对缓存执行的唯一操作是 PUT 和 REMOVE) . 我知道这可以使用简单的 ehcache 来完成,但是我的环境(Amazon EC2)中没有多播支持,并且我的客户端将使用自动缩放功能自动创建,所以我不知道他们的 IP。所以基本上,我只需要一个 Terracotta 服务器来将失效请求传播到所有客户端。有没有办法做到这一点?非常感谢!

4

1 回答 1

0

当您使用由 Terracotta 支持的 EhCache 并在您的缓存配置中指定使用 terracotta 时,例如:

<cache name="com.xyz.MyPOJO"
  <terracotta/>
</cache>

那么你的类必须是可序列化的(因为 Terracotta 会尝试将它存储在缓存服务器实例上。

但是,在您的配置中,您可以指定不对某些缓存使用 Terracotta,例如

<cache name="com.xyz.MyPOJO"
  <terracotta/>
</cache>

<cache name="com.xyz.NotServerStoredPOJO"
</cache>

然后,上面示例中的“NotServerStoredPOJO”将不会存储在兵马俑缓存服务器上……相反,它只会存在于您的本地 EhCache 中……但是如果您这样做,您将无法将其传播到其他实例diff JVM 中的 EhCache。

所以,也许你需要在兵马俑服务器上保留一些东西(某种标志/ID)来指示什么是无效的。然后在您的应用程序代码中有一个通用的类/功能,它将在从本地 EhCache 获取值之前检查该标志......如果它发现标志/id要被删除,那么它将从本地缓存中删除它并且不会返回任何东西给请求者。

另一方面,您的用例有点违背了拥有中央缓存服务器的目的。如果你想在没有中心位置的情况下协调多个缓存实例,你可以使用 JGroups http://www.jgroups.org(而不是 Terracotta)......它也没有商业许可。但是,您需要在 JGroups 上实现自己的机制,以使本地 EhCache 实例中的某些条目无效...

于 2012-09-27T19:00:36.333 回答