ES批量操作数据超时问题处理

在我们springboot项目中使用的是 elasticsearch-rest-high-level-client这个ES官方推荐的客户端

当有需求批量删除过期数据一开始使用的是deleteByQuery方法,在要删除的数据比较少的时候没问题,达到几十万条的时候会报 socket超时异常,但是命令不会中断,仍然会执行完,把我们需要delete的数据删完,就是看不到结果,
这时候我们可以

  • 不管它反正能删除成功
  • 限制每次删除的记录数,setSize就可以做到,循环分次删除,直到删完
  • socketTimeOut 将超时时间设置到足够大,等待返回结果
  • 使用异步删除API,异步获取结果

很明显最后一种最合理,作为一个有追求的程序员看不见程序运行结果怎么呢
这个时候我们可以用deleteByQueryAsync :官方文档提供异步调用方式,用listener监听返回结果

            DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(NEW_ORDER_INDEX_NAME);
            //可限制删除记录数 setSize()
            //每批次删除数量 默认即1000
            deleteByQueryRequest.setBatchSize(CommonConstants.BATCH_SIZE_OF_DEL);
            deleteByQueryRequest.setQuery(queryBuilder);
            ActionListener listener = new DelEsListener();
            esClient.deleteByQueryAsync(deleteByQueryRequest, RequestOptions.DEFAULT, listener);

监听类很简单,实现 ActionListener<BulkByScrollResponse>接口 重写两个方法一个接受成功,一个接受失败

public class DelEsListener implements ActionListener<BulkByScrollResponse> {
    private static final Logger logger = LoggerFactory.getLogger(SearchManager.class);

    @Override
    public void onResponse(BulkByScrollResponse bulkResponse) {
        logger.info("delOrder-record-info[success] bulkResponse:{} ", bulkResponse.toString());
    }

    @Override
    public void onFailure(Exception e) {
        logger.info("delOrder-record-info[fail] error:{} ", e);
    }
}

成功的结果长这个样子

[took=104ms,timed_out=false,sliceId=null,updated=0,created=0,deleted=633,batches=1,versionConflicts=0,noops=0,retries=0,throttledUntil=0s,bulk_failures=[],search_failures=[]]

重点是删除条数 和 执行批次, 批次=影响数据量/设置的批次大小+1


同理 批量select insert update 都有async异步调用的方法。

注意:发现rest-high-level-client 6.7及之后的版本才发现有批量的方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容