我有hazelcast群集,其中包含4个节点。设置如下:
<hazelcast>
...
<map name="default">
<backup-count>1</backup-count>
<async-backup-count>0</async-backup-count>
<time-to-live-seconds>0</time-to-live-seconds>
<eviction-policy>LRU</eviction-policy>
<max-size policy="cluster_wide_map_size">5000</max-size>
</map>
</hazelcast>
最重要的部分是同步备份。
我正在这样使用hazelcast iMap:
IMap<String, Object> map = getClient().getMap("default");
map.putAsync("key1", "1").get(1000, TimeUnit.MILLISECONDS);
//
String firstGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);
map.putAsync("key1", firstGet + "2").get(1000, TimeUnit.MILLISECONDS);
//
String secondGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);
map.putAsync("key1", secondGet + "3").get(1000, TimeUnit.MILLISECONDS);
//
String thirdGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);
我希望 thirdGet 等于“ 123” 。但是我很少得到“ 13” 。看来,我的第二次更新在某些情况下丢失了。但我在日志中看不到任何错误。
重要的是,当系统具有最大数量的请求时,将出现此错误。
我考虑过将缓存逐出。但是在那种情况下,我会丢失整个密钥。但是我只丢失了第二次更新。
我也知道,Hazelcast是AP产品。但是我有同步复制。
答案 0 :(得分:0)
您的代码实际上是理解异步代码的一个很好的例子:),因为您经历过异步调用并不能保证它们在提交后立即返回,所以您可能会丢失订单。您当前正在执行的操作是提交异步操作,等待最多1000ms的时间完成计算,然后检索其结果(如果有)。有些可以在几毫秒内返回,而另一些则不能在1000毫秒内返回。您只是得到一个Future对象,然后等待并说您将只等待1000毫秒即可完成它。
您需要使用同步操作(map.put,map.get等)来确保它们在返回时已完成。您使用的IMap备份设置与此无关,它定义了以异步/同步模式创建备份副本。请参阅:http://docs.hazelcast.org/docs/3.10.2/manual/html-single/index.html#backing-up-maps