elasticsearch源码分析之Transport(五)

原创 2016年08月29日 19:20:24

一、基本介绍

1.1概念介绍

transport模块是es通信的基础模块,在elasticsearch中用的很广泛,比如集群node之间的通信、数据的传输、transport client方式的数据发送等等,只要数和通信、数据传输相关的都离不开transport模块的作用。

transport模块分为LocalTransport和NettyTransport两种,在TransportModule中注册中可以通过node是local还是network的来判别使用哪一种transport,可以通过配置node.mode来决定,bind逻辑如下:

 

默认而且通常我们使用的实现类是NettyTransport,描述信息如下:


NettyTransport分为四种类型的连接,分别是:

  • recovery:做数据恢复recovery,默认个数2个;
  • bulk:用于bulk请求,默认个数3个;
  • med/reg:典型的搜索和单doc索引,默认个数6个;
  • high:如集群state的发送等,默认个数1个;
  • ping:就是node之间的ping咯。默认个数1个;

其中recovery和bulk之前版本是同一个的,叫做low,表示大数据量的传输,它们可能会导致通常的请求(如search或是单数据索引)耗时加长;

1.2配置信息

1.2.1workerCount

workerCount表示transport的总共的worker数目,由transport.netty.worker_count来配置,默认值是32和Runtime.getRuntime().availableProcessors()中的最小值,也就是不能超过32,为什么会有这个限制呢?是因为在elasticsearch的github上有人提了个issues/3478,当使用core很多的机器的时候(比如48core),会创建太多的内存从而导致OOM,所以设置了32的上限来避免太多线程给系统产生压力。


创建逻辑


创建serverBootstap


创建clientBootstap


1.2.2connetion number

1.1中介绍的各种连接数初始化


1.3.2defaultReceiverPredictor

Netty是nio的,在Netty中通过ReceiveBufferSizePredictor根据上次消息的大小来决定预测本次消息所需的缓存大小。

从channel读取数据到缓存到,并向上行流通知消息接收事件。默认值计算逻辑:


JvmInfo.jvmInfo().getMem().getDirectMemoryMax(),最终调用的就是jdk中sun.misc.VM类里面的directMemory ,可以通过 -XX:MaxDirectMemorySize来配置的,默认是64M.

二、创建连接

2.1启动服务

因为NettyTransport继承了AbstractLifecycleComponent,实现了doStart()方法。在node、transportclient启动的时候调用了


最终调用了doStart()方法,在doStart中会根据配置启动一个client和一个server,分别是ClientBootstrapServerBootstrap(都是Netty中的),因为节点之间要相互通信的,所以client和sever都要启动。并分别注册各自的PipelineFactory,在PipelineFactory中创建各自的channelPipeline,其中注册了消息处理的方式。

客户端


服务端



2.2连接节点

在启动Discovery服务后,会发现新节点,发现之后开始进行连接工作。在UnicastZenPing中会调用transportService.connectToNodeLight(finalNodeToSend)进行连接。

实质就是创建Netty中的Channel,一个连接就是第一个Channel,根据之前所说的会有多个类型的连接会创建:

nodeChannels = new NodeChannels(new Channel[connectionsPerNodeRecovery], 

new Channel[connectionsPerNodeBulk], new Channel[connectionsPerNodeReg], 
new Channel[connectionsPerNodeState], new Channel[connectionsPerNodePing]);


上面连接创建完毕,供后续数据传输使用。

 

三、发送数据

3.1获取channel

sendRequest方法会传入一个参数options,是一个TransportRequestOptions的实例,包含三个属性:timeout(超时时间)、compress(是否压缩)、type(发送的类型,即上面说的五个之一)。

根据需要发送数据的节点和发送的类型(上面五大类型)获得到对应的channel



3.1数据写入

之后数据该压缩的压缩(压缩方法在CompressorFactory中实现),并写入version和action;

写入request信息,通过ChannelBuffers创建出buffer;


3.3数据发送

最后通过Netty中的targetChannel.write(buffer),将数据发送。


 

四、接收数据

4.1处理类注册

参照2.1启动服务中的channelPipeline注册,统一的handler为MessageChannelHandler,负责消息接受及处理逻辑,在其他模块中会对不同的消息(Action)注册对应的处理程序(handler)。

4.2消息处理

在对收到的内容进行解析的过程中获取到action,找到对应的handler进行处理;消息处理则需要messageReceived,里面会有对于request和response分别有相应的handler来处理:handleRequest、handleResponse。

具体使用方式可以参照elasticsearch源码分析之服务端(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

分布式搜索Elasticsearch——创建客户端(一)

注:该文及后续的几篇文章为概述,之后会将实例补充到文章中。 在elasticsearch源代码中,进入到org.elasticsearch.client,你会发现下图所示的类: 我...
  • geloin
  • geloin
  • 2012-12-28 19:41
  • 19359

elasticsearch java API------与集群交互

这是关于elasticsearch java api的第一篇教程,陆续会把es的一些心得写出来。 可以通过两种方式来连接到elasticsearch(简称es)集群,第一种是通过在你的程序中创建...
  • july_2
  • july_2
  • 2014-04-23 14:56
  • 20139

elasticsearch源码分析之启动过程(二)

最近开始广泛的使用elasticsearch,也开始写一些java代码了,为了提高java代码能力,也为了更加深入一点了解elasticsearch的内部运作机制,所以开始看一些elasticsear...

最新版的快递单号生成查询工具 测试版

这个软件是我刚开始学易语言的时候 自己开发的一个软件 个人感觉功能实现的还算可以,有需要的还请大家多多支持

elasticsearch源码分析之集群管理(一)

一、背景 Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。本文主要介绍实现分布式搜索和分析的基础–存储,好的存储设计在根本上决定了查询的性能。...

elasticsearch源码分析之discovery(七)

Discovery模块概述elasticsearch中的Discover模块,这个模块主要是发现模块负责发现集群中的节点,以及选取主节点。用作处理elasticsearch中的集群问题,是elasti...

elasticsearch源码分析之客户端(三)

与es通信有三种protocol分别是node、http和transport;其实对于其他client而言最终都是使用的http;而java是可以使用node和transport的,node方式一般很...

elasticsearch源码分析之服务端(四)

一、服务端接收 1.1接收消息1.2主要类UML图 二、服务端处理 2.1索引的处理2.2写入primary2.3refresh2.4flush 上篇博客说明了客户端的情况,现在继续分析...

elasticsearch 5.0 获取 TransportClient 操作客户端java API

elasticsearch 5.0 获取 TransportClient 操作客户端java API 跟之前的版本有点差别了,我也是找了好一会才找到,用到的拿走 private static T...

Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解

Elasticsearch JAVA操作有三种客户端: 1、TransportClient 2、JestClient 3、RestClient 还有种是2.3中有的NodeClient,在5....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)