缓存复制

时间:2016-08-29 09:08:57

标签: java replication ehcache

我正在使用EhCache 2.10.2。两个服务器(S1和S2)之间的同步复制(replicateAsynchronously = false)。

我有下一个情况:

  1. 第一个HTTP请求转到S1
  2. S1无法在缓存中找到对象并从状态为“A”的DB加载它并将其置于缓存
  3. S1将对象的状态更改为“B”,保存到DB并放入缓存
  4. S1发送成功回复
  5. 下一个请求转到S2
  6. S2在状态为“A”
  7. 的缓存中找到对象
  8. S2发送错误响应,因为对象在第二次请求时必须具有状态“B”。
  9. 当服务器将对象放入缓存时,线程阻塞放置操作仅将序列化对象发送到另一个服务器,而不要等待另一个服务器反序列化并将元素放入缓存。 所以在第6点可以是状态“A”或“B”,如果我们幸运的话。

    是否可以将EhCache配置为阻止操作,直到在所有节点上复制更改?

    可能我需要用其他缓存实现替换EhCache,还是改变一切?

1 个答案:

答案 0 :(得分:0)

您遇到的是缓存复制的弱点。您的方案似乎需要强烈的一致性。

请注意,除了缺乏强一致性之外,缓存复制甚至不能保证按密钥排序事件,也不会执行任何类型的冲突解决。这真的是最后的更新胜利。

Ehcache唯一能为您提供适当保证的功能是Terracotta clustering。为了部署此解决方案,您至少需要一个额外的服务器/ JVM作为Terracotta集群。