起因
起因是一个批量根据es文档id更新指定字段的功能,经过上线后使用反馈,经常性的偶发文档无法更新的情况
处理
找到相关代码,自行写个demo代码批量跑下试下,原来的代码大概示意如下
public String len10() throws Exception{
Random random = new Random();
String[] ls = new String[500];
for (int i = 0; i < 500; i++) {
int finalI = i;
Runnable callable = new Runnable() {
@Override
public void run() {
String str = String.valueOf(random.nextInt(40)+10);
String str2 = String.valueOf(random.nextInt(40)+10);
String str3 = String.valueOf(random.nextInt(40)+10);
String action = "/XXXXXXX_index/XXXXXXX_type/_update_by_query";
String dateTime = "20"+str+"-01-12 23:"+str2+":"+str3;
String script = "{\n" +
" \"script\": {\n" +
" \"inline\": \"ctx._source.modify_time='"+dateTime+"'\"\n" +
" },\n" +
" \"query\": {\n" +
" \"bool\": {\n" +
" \"filter\": [{\n" +
" \"term\": {\n" +
" \"id\": \"2\"\n" +
" }\n" +
" }]\n" +
" }\n" +
" }\n" +
"}"
;
try {
String post = esRestClient.performRequest("POST", action, script);
System.out.println(post);
ls[finalI] = post;
} catch (IOException e) {
e.printStackTrace();
ls[finalI] = e.getMessage();
}
}
};
Thread thread = new Thread( callable);
thread.start();
}
Thread.sleep(50000);
return "";
}
大意就是起500个线程,更新索引中指定文档id为2的文档的modify_time字段,通过script来更新。
执行之后其实就可以看到大量异常信息了
Continue reading