使用spring保存数据后立即查询elasticsearch可能不是最新的?

时间:2015-09-17 14:48:40

标签: java multithreading spring elasticsearch real-time

我有以下代码: (线程一次只能访问一个特定obj的synchronized(someObj)。)

@Async
public void funcA() {
 synchronized (someObj) {
      //query (using spring) for **some_data_in_ES**
      //check if **some_data_in_ES** is not 'nothing'
      //update **some_data_in_ES** to be 'A' using spring 
 }
}

@Async
public void funcB() {
 synchronized (someObj) {
      //query (using spring) for **some_data_in_ES**
      //check if **some_data_in_ES** is not 'nothing'
      //update **some_data_in_ES** to be 'B' using spring
 }
}

如果funcA控制了synchronized(someObj)并将 some_data_in_ES 更新为' A'当synchronized(someObj)上的锁定空闲时,funcB会自动加入synchronized(someObj),并检查 some_data_in_ES 是否“没有”#39; 是否有可能B会得到什么'或者弹性搜索只会在更新为' A'?

后返回 some_data_in_ES

1 个答案:

答案 0 :(得分:0)

  

B是否有可能获得'没有'或者弹性搜索只会在更新为'A'之后返回some_data_in_ES?

是B可以看到“没有”或“A”。 ES的更新不是原子的。您将看到更新的速度取决于ES和Lucene的配置方式。所以这都是时间和配置问题。我过去处理问题的一种方法是使用我在ES中索引的数据库中的ID。这样我可以肯定它是独一无二的,并且使用它来编写upsert和更新是微不足道的。

签出update API,例如,upsert可能是合适的。

阅读near real-time search,了解有关文档何时可见的更多信息。特别要注意刷新间隔和刷新API。