一起来学ES —— Bulk剖析
背景
- Bulk请求是ES常用的一种multi-document请求,其处理比较复杂,之前一直搞不清请求的处理逻辑,今天就从源码入手,仔细剖析一下其执行逻辑。
时序分析
- 简单而言,Bulk的时序如下图所示,Http节点只将包转为TCP,ingest节点进行些预设的前置处理,然后按shard拆分,再把按shard拆开的bulk再发到真实的data节点上,最后由data节点进行主副本同步写入。
具体流程
RestControllor
接收请求,dispatch到对应的handler上BaseRestHandler
调用RestBulkAction
进行前置处理,请求转为BulkRequest
NodeClient
根据ActionModule
注册的映射关系,找到TransportBulkAction
作为tcp的处理逻辑TransportBulkAction
检查自己是不是ingest node
,如果不是就转发Ingest Node
接收到请求,执行pipelineTransportBulkAction
调用BulkOperation
将BulkRequest
拆为BulkShardRequest
,转发到DataNodePrimary Data Node
收到请求,转为ReplicationOperation
操作,调用TransportShardBulkAction
进行主副本的依次执行TransportShardBulkAction
的具体执行过程为shardOperationOnPrimary
和shardOperationOnReplica
,执行时直接调用了Engine进行执行。具体代码就不贴了,比较长
线程池分析
- 在日常中,我们经常遇到由于线程池占满的
es_rejected_execution_exception
- 通过源码可以看到,bulk的线程池为
ThreadPool.Names.BULK
,全局查找后发现只有TransportShardBulkAction
和PipelineExecutionService
有用。 - Rest和TransportBulk居然没有用Bulk线程池,很是惊讶。不知道是不是没找到。。。
版权声明
- 自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
- 本文首发于: http://czjxy881.coding.me/
留下评论