澳门威利斯人_威利斯人娱乐「手机版」

来自 澳门威利斯人 2019-05-25 16:36 的文章
当前位置: 澳门威利斯人 > 澳门威利斯人 > 正文

剖析twemproxy代码正编,剖析twemproxy代码前编

正文意在支持大家斟酌出twemproxy接收流程的代码逻辑框架,有个别具体的落到实处内需我们在今后抽空去探求依旧大家自行查究。在那篇文章早先前,我们要盘活二个相当的小的心思策动,由于twemproxy代码是1份精美的c语言代码,为此,在twemproxy的代码中会大篇幅使用c指针。不过无论是常见档案的次序的指针依然函数指针,都得以让大家那一个c语言使用者大饱眼福,生出1种“原来还足以如此写!!!”的快感。

本篇将去搜求twemproxy源码的主干流程,想来对于想要开端啃那份不错源码生肉的童鞋会有非常大的帮扶。这里大家率先要找到 twemproxy准确的张开药格局——twemproxy的文本结构,接着介绍twemproxy程序代码框架,最终介绍twemproxy程序的主干流程。主干流程是本章节的最首要。本次首假设为着能将那份代码较为复杂的流程张开一些简练的模块分解和流程分解,以有利于大家前面包车型大巴翻阅。

 

twemproxy的公文结构

数据结构

道理当然是那样的接下去首先要上壹幅图,正是twemproxy的文件结构图

在研究twemproxy接收流程在此以前,大家务必对一部分我们会用到的数据结构举行求证,以便大家更加好地去切磋,那边在授课结构时,仅仅讲明与twemproxy接收流程相关的代码,其余代码一时半刻不开始展览辨析。

澳门威斯尼人平台登陆 1

 

图1 文件结构图

mbuf

如图1所示,src下的是大家最珍视的政工代码,这里有多少个至关心尊崇要的文件夹,壹文本夹里的是互联网编制程序模型,里面包罗epoll,kqueue以及evport多少个常用的模型。贰文书夹里的是哈希算法,其首要来哈希redis磋商可能memcache协议的key,包涵crc1陆,crc3贰,MD五等哈希算法。三是相比较根本的文书,它是在此间不唯有做到理解析redis协议或然memcache协议,还形成了那三个商讨的分片职业。

在nc_mbuf.h里

这边还应该有多少个非常重要的文件组,四是先后的进口,如图所示,main函数就在内部,5是管制与客户端的接连,6是用来深入分析配置文件的,7是落成了晶莹剔透连接池的,八是足以看出重要的程序流程,九是兑现了内部存款和储蓄器处理的内部存款和储蓄器池,10是数额收发的主干流程,1一是多少请求和响应,是多少收发流程10的切切实实贯彻,1二是用来管理与服务器的总是。

1 struct mbuf {
2     uint32_t           magic;   /* mbuf magic (const) 这个值不是很理解是什么意思,一般是0xdeadbeef*/
3     STAILQ_ENTRY(mbuf) next;    /* next mbuf 下一块mbuf,代码里所有的mbuf几乎都是以单向链表的形式存储的*/
4     uint8_t            *pos;    /* read marker 表示这块mbuf已经读到那个字节了*/
5     uint8_t            *last;   /* write marker 表示这块mbuf已经写到哪个字节*/
6     uint8_t            *start;  /* start of buffer (const) 表示这块mbuf的起始位置*/
7     uint8_t            *end;    /* end of buffer (const) 表示这块mbuf的结束位置*/
8 };
9 STAILQ_HEAD(mhdr, mbuf);    /*mhdr是mbuf单向队列的队列头部*/

这里可以起来窥视到twemproxy精致的代码结交涉高可读性,通过翻看文件的名字,大家以致能够大概YY出那么些文件下的代码的效益,而且是89不离十。

此地要对mbuf解释几句,这里涉及到nc_mbuf.c里的代码:

 

1.mbuf的每1块可以经过安顿规定其大小 ,能够说每1块mbuf的轻重缓急都以二个固定值,为此在转换时mbuf会去报名三个永久大小的内存,倘若这一个分寸是mbuf_chunk_size,那么end = start  mbuf_chunk_size - sizeof(struct mbuf),为此start,end,以及magic都是定值。

由此这一个咱们获取了读书代码的完整思路(大家此番阅读代码的主要是redis服务器集群下的twemproxy)

2.mbuf在提请后一般不会被放出,在行使完后会被放入static struct mhdr free_mbufq那些行列中,壹旦要利用mbuf时首先从free_mbufq中收取未利用的mbuf,要是这些队列为空时,它才会去向系统报名新的mbuf。

一.率先以10,1壹为主线来察看整个程序的收发流程,因为我们领悟作为一个缓存中间件代理,最注重的唯有是与客户端以及服务器的并行流程。

 

二.再在主干流程上日渐实行,通过探求三文本夹里的辨析分片功用,来谈下redis协议的细节和它能展开分片的由来。

msg

3.随着通过上述标红的各职能点陆,柒,玖去调查整个程序,那样对于程序的完结细节有分明的问询。

在nc_message.h里

四.最后大家再去调查一些匡助的效用点,如监控,日志记录以及哈希算法等功效的贯彻。

 1 struct msg {
 2    /*
 3     ...
 4    */
 5     struct conn          *owner;          /* message owner - client | server 服务端或客户端连接*/
 6    /*
 7     ...
 8    */
 9     struct mhdr          mhdr;            /* message mbuf header mbuf单向队列的队列头部*/
10     uint32_t             mlen;            /* message length mbuf字节长度*/
11    /*
12     ...
13    */
14     uint8_t              *pos;            /* parser position marker 现在解析到哪个个字节*/
15     msg_parse_t          parser;          /* message parser 消息解析函数指针*/
16     msg_parse_result_t   result;          /* message parsing result 消息解析结果*/
17    /*
18     ...
19    */
20 
21 };

 

msg是用来囤积每一条发送过来的redis包的剧情,一般2个msg对应叁个redis包,全数收发网络数据都存款和储蓄在mhdr中。

twemproxy的主干流程概述

 

接下去大家要查究twemproxy的主干流程,首先我们要知道twemproxy与外场怎么互相的,在上文《twemproxy架构剖析》中,大家领会了twemproxy架构的架构,为此,我们能够抽象出壹幅图片

conn

澳门威斯尼人平台登陆 2

在connection.h中

图2.twemproxy零层数据流图

 1 struct conn {
 2    /*
 3     ...
 4    */
 5    int                 sd;              /* socket descriptor 套接字描述符*/    
 6    /*
 7     ...
 8    */
 9     conn_recv_t         recv;            /* recv (read) handler 接收msg函数指针*/
10     conn_recv_next_t    recv_next;       /* recv next message handler 接收下一个msg的函数指针*/
11     conn_recv_done_t    recv_done;       /* read done handler 接收完成的函数指针*/
12    /*
13     ...
14    */
15     size_t              recv_bytes;      /* received (read) bytes 接收数据的字节数*/
16     size_t              send_bytes;      /* sent (written) bytes 发送数据的字节数*/
17    /*
18     ...
19    */
20     err_t               err;             /* connection errno 接受数据错误*/
21     unsigned            recv_active:1;   /* recv active? 是否在接收数据*/
22     unsigned            recv_ready:1;    /* recv ready? 是否准备接收数据*/
23    /*
24     ...
25    */
26     unsigned            eof:1;           /* eof? aka passive close? 数据读到尾部*/
27     unsigned            done:1;          /* done? aka close? 完成数据接收*/
28     unsigned            redis:1;         /* redis?           网络协议是不是redis*/
29    /*
30     ...
31    */
32 };

如图二,这里的conn是意味着由客户端发起的与twemproxy的连年,而s_conn是由twemproxy发起的与服务端的接连

 conn是与服务端或客户端的连天,用于管理总是上的兼具事件和互联网数据

这么大家能够将数据收发进程分成以下4步:

 

一.twemproxy首先接受客户端发起的conn请求。

吸取流程

贰.再经过哈希conn请求的key值将其切分成具备一样key哈希值的央求——s_conn请求发给服务端——redis服务集群

先是看下重要流程,很轻易的代码在nc_message.c中的msg_recv

3.随即等待接受来自服务端——redis服务集群的s_conn响应,通过这后边的映照关系将其和conn请求关联起来。

 1 rstatus_t
 2 msg_recv(struct context *ctx, struct conn *conn)
 3 {
 4     rstatus_t status;
 5     struct msg *msg;
 6 
 7     ASSERT(conn->recv_active);
 8 
 9     conn->recv_ready = 1;//表示准备接收网络数据
10     do {
11         msg = conn->recv_next(ctx, conn, true);
12         if (msg == NULL) {
13             return NC_OK;
14         }
15 
16         status = msg_recv_chain(ctx, conn, msg);//接收函数链,在这个流程中会改变conn->recv_ready的值,表示本次接收流程终止
17         if (status != NC_OK) {
18             return status;
19         }
20     } while (conn->recv_ready);//一旦不准备接收网络数据,就停止
21 
22     return NC_OK;
23 }

4.最后将每二个conn请求对应的每3个conn响应发给客户端。

 在那几个代码中我们会开掘贰个conn->recv_next,方今大家假使明白它是希图吸收接纳下叁个msg的函数,无需明白她的具体贯彻,因为她在《twemproxy代码框架概述——深入分析twemproxy代码前编》提到的客户层服务层扮作的剧中人物是见仁见智的,为此,达成也是例外的,这里根本指的是《twemproxy代码框架概述——深入分析twemproxy代码前编》提到的模块1模块3,在此间大家以至看到了c语言的代码里涌出了2个在面向对象语言中才有的特性——澳门威斯尼人平台登陆,多态,在下边几篇小说的研商中会讲到,相当大心做了广告,请无视上面的有的内容。

 

 

诸如此类大家能够将其分为五个部分,与客户端交互的一,四是客户层,与服务端交互的二,三是服务层。那样twemproxy就被分为了上边壹幅图。

本文由澳门威利斯人发布于澳门威利斯人,转载请注明出处:剖析twemproxy代码正编,剖析twemproxy代码前编

关键词: 澳门威利斯人