elasticsearch源码分析之Transport(五)

来源:互联网 发布:淘宝网天猫女装冬装 编辑:程序博客网 时间:2024/05/16 01:15

一、基本介绍

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源码分析之服务端(四)

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老公用老婆的钱怎么办 想注册个公司要怎么办 域名续费不知道找谁怎么办 代收快递弄丢了怎么办 货到付款的快递人不在怎么办 快递送货上门人不在怎么办 ems快递签收人不在怎么办 快递被别人取了怎么办 怎么办快递宗和收发点 快递电话写错了怎么办 网上买沙发想退货怎么办 买的电脑想退货怎么办 买了衣服想退货怎么办 天猫买药审核通过后不要了怎么办 京东维修无发票怎么办 京东维修没有发票怎么办 苹果6s外音没了怎么办 苹果6splus开不了机怎么办 顺丰快递寄件填错收件人地址怎么办 收快递电话换了怎么办 顺丰快递没人收怎么办 网购东西没收到怎么办 中通快递没收到怎么办 快递员不给验货怎么办 顺丰验货不要了怎么办 闲鱼买家掉包了怎么办 闲鱼正在退款中怎么办 拒收货物卖家拒绝退款怎么办 货物没问题淘宝卖家拒收怎么办 头发稀少长的慢怎么办 没满16岁怎么办银行卡 网上买东西手机号填错了怎么办 买东西电话号码填错了怎么办 淘宝联盟扣54分怎么办 联盟被扣54分怎么办 ofo押金退了余额怎么办 网购还没收货就已签收怎么办 理财公司倒闭分公司法人怎么办 公司让离职不想走怎么办 公司让离职自己不想走怎么办 小孩子有购物狂病怎么办