文档章节

Java客户端并发更新Elastic索引总结

zgw06629
 zgw06629
发布于 2015/07/31 18:34
字数 403
阅读 108
收藏 0

Java客户端并发更新Elastic索引总结

如开始有一个index

{"count":0}

10个并发线程对count进行加一操作,期待结果为10.代码如下:

    // create index
    client.prepareIndex(index, type, id)
        .setSource(XContentFactory.jsonBuilder().startObject().field("count", 0).endObject())
        .execute().get();

    // multi thread update
    int count = 10;
    CountDownLatch latch = new CountDownLatch(count);
    ExecutorService service = Executors.newFixedThreadPool(10);
    for (int i = 0; i < count; i++) {
      service.execute(new Runnable() {

        @Override
        public void run() {
          try {
            client.prepareUpdate(index, type, id)
                .setScript("ctx._source.count += 1", ScriptService.ScriptType.INLINE).execute();

          } catch (Exception e) {
            System.err.println(Thread.currentThread().getName());
            e.printStackTrace();
          } finally {
            latch.countDown();
          }
        }
      });
    }

    // check result
    latch.await();
    service.shutdown();
    GetResponse getResponse = client.prepareGet(index, type, id).execute().get();
    System.out.println(getResponse.getSourceAsString());

但实际结果会小于10, 不知丢失的update去哪儿了?

通过Wireshark抓包工具分析,实际也出现了更新冲突,但程序不调用get的话就不会抛出此异常,抓包截图如下所示:

若将上述update索引语句修改为:

 client.prepareUpdate(index, type, id)
                .setScript("ctx._source.count += 1", ScriptService.ScriptType.INLINE).execute()
                .get();

即在最后调用了get。这时会报错:

Caused by: org.elasticsearch.index.engine.VersionConflictEngineException: [temp-index][2] [temp-type][1]: version conflict, current [2], provided [1]
	at org.elasticsearch.index.engine.InternalEngine.innerIndex(InternalEngine.java:432)
	at org.elasticsearch.index.engine.InternalEngine.index(InternalEngine.java:375)
	......

经尝试,发现若想最后结果为10,需要满足如下两个条件,

//1. 单线程
ExecutorService service = Executors.newFixedThreadPool(1);
//2. 显式调用get
 client.prepareUpdate(index, type, id)
                .setScript("ctx._source.count += 1", ScriptService.ScriptType.INLINE).execute()
                .get();

补充:

其实连续顺序执行也会出现结果不正确的情况,

for (int i = 0; i < 10; i++) {
      client.prepareUpdate(index, type, id)
          .setScript("ctx._source.count += 1", ScriptService.ScriptType.INLINE).execute();
}

除非显式调用get. 因为通过Shell脚本并发执行update也能出现update conflict, 

for ((i=0; i<10; i++))
do
curl -XPOST 'localhost:9200/test/type/1/_update?pretty' -d '{
    "script" : "ctx._source.count += 1"
}' &
done

故可以认为是服务端的问题。


© 著作权归作者所有

共有 人打赏支持
zgw06629

zgw06629

粉丝 17
博文 54
码字总数 30471
作品 0
海淀
程序员
私信 提问
Centos6搭建elk系统,监控IIS日志

**所需程序: 服务器端:java、elasticsearch、kikbana 客 户 端:IIS、logstash** 一、服务器端(192.168.10.46)操作: 先建立一个ELK专门的目录: [root@Cent65 ~]mkdir /elk/ 上传到elk...

D杀手D
2018/04/24
0
0
ElasticSearch使用

安装之前,请参考https://github.com/richardwilly98/elasticsearch-river-mongodb根据你的MongoDB版本号决定需要的elasticsearch版本号和插件号。 1)安装ES 下载ElasticSearch_版本号.tar....

强子哥哥
2014/04/09
0
0
ElasticSearch Client详解

从本文开始,将与大家进入到Elasticsearch的精妙世界中来,基于当前最新的6.4.x版本。 本文将重点探讨ElasticSearch Client的相关知识,重点关注TransportClient与Rest Client。Elasticsear...

丁威
03/10
0
0
Spring Data Elasticsearch介绍

概述 在本文中,我们将以代码为中心,实战的方式探索Spring Data Elasticsearch的基础知识。 我们将展示如何使用Spring Data在Spring应用程序中索引,搜索和查询Elasticsearch - String Data...

无忌
2018/07/26
0
0
(一)ElasticSearch-入门

目录: 一.前言 二.安装 三.索引 四.搜索 五.聚合 六.分布式的特性 一.前言 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄...

Deng_Wu
2018/08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部