2016-08-29 70 views
0

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

我旁边的情况:

  1. 首先HTTP请求将S1
  2. S1无法在缓存中找到,并与国家“A”从数据库加载它的对象,并把缓存
  3. S1改变对象的状态为“B”,保存到数据库,并把缓存
  4. S1发送成功响应
  5. 下一个请求将S2
  6. S2在加利福尼亚州发现obect che与状态“A”
  7. S2发送错误响应,因为对象必须在第二个请求上具有状态“B”。

当服务器将对象放入缓存时,线程阻塞put操作只发送序列化对象到另一个服务器,并且不要等待另一个服务器反序列化并将元素缓存。 因此,如果我们幸运的话,第6点可以是状态“A”或“B”。

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

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

回答

0

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

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

Ehcache将给你适当的保证的唯一功能是Terracotta clustering。为了部署这个解决方案,您至少需要一个额外的服务器/ JVM来充当Terracotta集群。