ElasticSearch Rpc-Server端处理流程

ES Rest/Rpc流程

  • ElasticSearch Rpc-Server端处理流程_第1张图片
    image.png

Rpc-Server端处理流程

  • 上图红色标识部分
  • ElasticSearch Rpc-Server端处理流程_第2张图片
    服务端流程.png

调试流程

  • 在RpcServer的消息处理入口的地方放置断点Netty4MessageChannelHandler
  • 启动一个TransportClient,发送一个查询请求,看断点能否命中
  • 1个查询请求后,发现断点经常命中
  • 发现有三类消息:Liveness,HandShake和真正的业务消息
  • 从客户端日志可以看到indices:data/read/get这样的消息
  • 在服务端设置条件断点action.contains("indices:data/read/get")
  • ElasticSearch Rpc-Server端处理流程_第3张图片
    image.png

调试代码

  • ES服务端 5.6
  • 客户端代码
   @Test
     public void test1(){
          try {
               Settings settings = Settings.builder().put("cluster.name", "distribution_run").build();
               TransportClient client = new PreBuiltTransportClient(settings)
                       .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
               GetResponse response = client.prepareGet("website", "blog", "AWMHVaesXwpGuvHHNcVg").execute().actionGet();
               //输出结果
               System.out.println(response.getSourceAsString());
               //关闭client
               client.close();
          } catch (UnknownHostException e) {

          }
          //QueryBuilder qb1 = QueryBuilders.matchAllQuery();
     }
  • Maven配置
        
            org.elasticsearch.client
            transport
            5.6.9
        
        
            org.appenders.log4j
            log4j2-elasticsearch-core
            1.1.1
        
  • 客户端日志配置


    
        
            
        
    
    
        
            
        
        
            
        
    

代码分析

  • ElasticSearch Rpc-Server端处理流程_第4张图片
    image.png
  • ES为不同类型的操作提供不同类型的线程池,总共有15中,调试上述代码使用的SANE,对应的线程池执行器是DIRECT_EXECUTOR_SERVICE
  • ElasticSearch Rpc-Server端处理流程_第5张图片
    image.png
  • image.png
  • 线程池所有类型的定义以及类型和执行器的对应关系都在ThreadPool类中
  • TransportClient请求和对应Transport*Action的对应关系是怎么样的
  • TransportClient发送业务请求都会带一个类似于indices:data/read/get的消息
  • Transport*Action注入的时候都会带一个ActionName的属性名
    @Inject
    public TransportGetAction(Settings settings, ClusterService clusterService, TransportService transportService,
                              IndicesService indicesService, ThreadPool threadPool, ActionFilters actionFilters,
                              IndexNameExpressionResolver indexNameExpressionResolver) {
        super(settings, GetAction.NAME, threadPool, clusterService, transportService, actionFilters, indexNameExpressionResolver,
                GetRequest::new, ThreadPool.Names.GET);
        this.indicesService = indicesService;
    }
    public static final GetAction INSTANCE = new GetAction();
    public static final String NAME = "indices:data/read/get";

你可能感兴趣的:(ElasticSearch Rpc-Server端处理流程)