elasticsearch源码分析-架构设计之action

author author     2023-05-05     742

关键词:

参考技术A 如果我们发送如下的http请求,elasticsearch是如何匹配对应Action的呢?

在org.elasticsearch.rest.action包下面,存放了处理各种请求的rest action类
在每个action的构造方法中,会将当前action对象注册到指定的url上

在registerHandler()方法中,会将url path和对应handler添加到http method对象上

elasticsearch使用HttpRequestHandler接收http请求消息,最终会在executeHandler()方法中调用getHandler()方法获取path对应的handler

在getHandler()方法中,主要是根据method和path获取在RestXxxAction中添加的handler

elasticsearch在path对应获取Handler后,就执行该handler的handleRequest()方法,作为rest逻辑入口

在ActionModule中,会将Action和对应的TransportAction注册到actions对象中

在RestXxxAction中,最终会调用AbstractClient的xxx方法,并传入Action参数为XxxAction.INSTANCE,即为在ActionModule中注册的Action类

在NodeClient中会根据传入的Action参数从actions获取在ActionModule中注册的TransportAction,并执行其execute()方法

在TransportAction类图个execute()方法中可以看出:
① TransportXxxAction都继承自TransportAction类
② TransportAction的execute()方法仅调用了doExecute()方法
④ TransportXxxAction重写了TransportAction的doExecute()方法
因此,在最终的对应关系为在ActionModule中注册的Action调用的为TransportXxxAction的doExecute()方法

TransportAction的execute()方法仅调用了需要子类重写的抽象方法doExecute()

如果elasticsearch要请求的节点不是当前节点,则需要将请求发送到对应的节点上执行
在TransportXxxAction中会将ACTION和对应的Handler注册到对应的serverHandlers对象中,在使用transportService发送请求后,MessageChannelHandler.messageReceived()会接受到信息,然后在handleRequest()方法中获取注册的Handler,执行其messageReceived()方法或者交给线程池处理

在transportServiceAdapter.handler()方法中,即根据注册的action获取对应的TransportHandler,如果executor是same则执行handler的messageReceived()方法,否则交给线程池执行

下面讲另外一种情况,在ActionModule中注册的Action也都会注册到handler中

在TransportAction类中同样使用transportService.registerHandler()方法注册handler

因此在InternalTransportClient中,主要是回调proxy.execute()

transportService.sendRequest()中的action.name()即为Action的Name参数,已被注册到对应的handler中了

elasticsearch源码分析之search模块(client端)

elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过restapi来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们可以简单地概括为将的数据请求发送到node,然后在对返回的... 查看详情

elasticsearch之client源码简要分析

问题让我们带着问题去学习,效率会更高1 es集群只配置一个节点,client是否能够自动发现集群中的所有节点?是如何发现的?2 esclient如何做到负载均衡?3 一个esnode挂掉之后,esclient如何摘掉该节点?4 esclientnode... 查看详情

android图形架构之七——choreographer源码分析(代码片段)

前言Android图形架构之一——概述Android图形架构之二——SurfaceFlinger启动和连接Android图形架构之三——创建Layer、Surface、SurfaceControlAndroid图形架构之四——图形缓冲区的申请和消费流程及核心类Android图形架构之五——深入分析add... 查看详情

elasticstack系列之十六&elasticsearch5.xindex/create和update源码分析

开篇  在ElasticSearch系列十四中提到的问题即ElasticStack系列之十四&ElasticSearch5.xbulkupdate中重复id性能骤降,继续这个问题再继续查看更加多的源代码,看看底层在执行index、create和update操作到底有什么不同,有什么可以使得我... 查看详情

elasticsearch线程池类型分析之sizeblockingqueue(代码片段)

ElasticSearch线程池类型分析之SizeBlockingQueue尽管前面写好几篇ES线程池分析的文章(见文末参考链接),但都不太满意。但从ES的线程池中了解到了不少JAVA线程池的使用技巧,于是忍不住再写一篇(ES6.3.2版本的源码)。文中给出的... 查看详情

架构分析-《卓越架构师修炼之道》

...,不少于3000字,使用markdown格式。目录如下。第二章架构分析第2.1节架构分析方法2.1.1分析方法定义2.1.2架构分析维度2.1.3功能分析2.1.4性能分析2.1.5时间分析第2.2节架构设计要素2.2.1架构模块2.2.2架构规范2.2.3架构控制2.2.4架构层级... 查看详情

elasticsearch源码更新性能分析(代码片段)

带着疑问学源码,第三篇:Elasticsearch更新性能代码分析基于:https://github.com/jiankunking/elasticsearchElasticsearch7.10.2+目的在看源码之前先梳理一下,自己对于更新疑惑的点:为什么Elasticsearch更新与写入的性能会... 查看详情

elasticsearch源码写入分析(代码片段)

带着疑问学源码,第一篇:Elasticsearch写入代码分析基于:https://github.com/jiankunking/elasticsearchElasticsearch7.10.2+目的在看源码之前先梳理一下,自己对于写入流程疑惑的点:Elasticsearch写入是等待所有副本都写入... 查看详情

elasticsearch探索之路初始elasticsearch:特点应用场景架构设计基本概念(代码片段)

文章目录什么是ElasticSearch?LuceneELKElasticsearch的特点应用场景架构设计基本概念文档类型索引什么是ElasticSearch?Elasticsearch是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结... 查看详情

elasticsearch源码节点关闭分析(代码片段)

带着疑问学源码,第六篇:Elasticsearch节点关闭分析代码分析基于:https://github.com/jiankunking/elasticsearchElasticsearch7.10.2+目的在看源码之前先梳理一下,自己对于节点关闭流程疑惑的点:节点关闭都做了哪些检... 查看详情

elasticsearch源码检索分析(代码片段)

带着疑问学源码,第二篇:Elasticsearch搜索代码分析基于:https://github.com/jiankunking/elasticsearchElasticsearch7.10.2+目的在看源码之前先梳理一下,自己对于检索流程疑惑的点:当索引是按照日期拆分之后,在使... 查看详情

vue2.0源码分析之理解响应式架构

...简的代码,还原vue2.0响应式架构实现 以前写的那篇vue源码分析之如何实现observer和 查看详情

elasticsearch源码更新性能分析(代码片段)

带着疑问学源码,第三篇:Elasticsearch更新性能代码分析基于:https://github.com/jiankunking/elasticsearchElasticsearch7.10.2+目的在看源码之前先梳理一下,自己对于更新疑惑的点:为什么Elasticsearch更新与写入的性能会... 查看详情

elasticsearch源码节点启动分析(代码片段)

带着疑问学源码,第五篇:Elasticsearch节点启动分析代码分析基于:https://github.com/jiankunking/elasticsearchElasticsearch7.10.2+目的在看源码之前先梳理一下,自己对于节点启动流程疑惑的点:节点启动都做了哪些检... 查看详情

android图形架构之七——choreographer源码分析(代码片段)

...分析draw()是如何工作的Android图形架构之七——Choreographer源码分析Android图形架构之八——硬件VSync、VSync-app、Vsync-sf在Android4.1之后增加了Choreographer机制,用于同Vsync机制配合,控制同步处理输入(Input)、动画(Animation)、绘制... 查看详情

linux内核源码分析之网络协议栈架构

Linux内核源码分析之网络协议栈架构专注于服务器后台开发,包括C/C++,Linux,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2 查看详情

vue源码分析之目录架构(代码片段)

compilercompiler目录包含Vue.js所有编译相关的代码。它包括把模板解析成ast语法树,ast语法树优化,代码生成等功能corecore目录包含了Vue.js的核心代码,包括内置组件、全局API封装,Vue实例化、观察者、虚拟DOM、工具函数等等。platfo... 查看详情

elasticsearch如何设计可扩展的elasticsearch数据存储的架构(代码片段)

1.概述转载:如何设计可扩展的Elasticsearch数据存储的架构Elasticsearch允许您存储、搜索和分析大量的结构化或非结构化数据。因为在速度、可扩展性和灵活性方面拥有优势,ElasticStack是适用于广泛用例的强大解决方案,... 查看详情