月度归档: 2019 年 4 月

  • Elasticsearch的游标查询

    在做大批量查询的时候,比如批量导出数据的时候可以使用游标(scroll)查询,单纯的setFrom分页的方式在数据量变大以后性能下降。

    用游标可以用来对 Elasticsearch 有效地执行大批量的文档查询,而又不用付出深度分页那种代价。

    具体的时候很简单就是需要维持一个scrollId,也就是首次查询以后就会获得一个scrollId,然后后面的查询传递这个scrollId就可以查询下一批数据。

    游标查询的本质其实就是缓存了一个查询结果,然后分批返回,scrollId用base64解码可以查看,本质上对应了缓存的结果。

    既然用到了缓存那肯定存在缓存管理的问题,这里有两个点

    1. 所有游标查询都需要设置一个过期时间,超过过期时间以后的查询会报错。这里的过期时间在每次请求之后会延长,所以这里的过期时间是每批次的过期时间,而不是整个查询集合的时间
    2. 到了过期时间就会自动过期,释放空间,如果要提前释放可以主动调用ClearScrollRequest

    如果缓存有效时间设置的过长,且没有回收,容易导致整个集群出现空间,所以这个值最好精确设置。

    在当前场景(批量导出数据)下其实请求是连续的,只需要设置一个比较小的值,考虑本身的响应时间和可能的网络问题,根据具体场景1s~2s都是可以的。文档示例中是1分钟,最好根据自己的情况修改。…

  • 开源软件依赖License检测

    开源软件依赖License检测

    开源软件的License是一个很重要的声明,这代表了软件是基于何种许可证向世人开放的,对于其的使用又需要遵循何种规则。

    开源软件自身又会依赖其他的开源软件,而那些依赖又会有自己的License,所以对于依赖的License检查是非常重要的。因为有些License是不兼容的,比如一个基于Apache License的开源软件是不能包含一个依赖于GPLv3的库。

    所以检查依赖的License就变得很重要。

    如果你精通各类开源软件,看名字就知道软件对应的License和兼容性,那自然不需要其他辅助,但是大部分情况这个很难做到。

    License Maven Plugin是一个专门处理这种问题的插件。对于任何一个maven项目,简单地运行

    mvn license:add-third-party -Dlicense.useMissingFile -Dlicense.includeOptional=true

    输出如下:

    Lists of 67 third-party dependencies.
    (BSD License) AntLR Parser Generator (antlr:antlr:2.7.7 – http://www.antlr.org/)
    (Apache Software License 2.0) A Swiss Army Knife for OSGi (biz.aQute.bnd:bndlib:2.4.0 – http://www.aQute.biz/Code/Bnd/bndlib)
    (Eclipse