twemproxy代码框架概述——剖析twemproxy代码前编
本篇将去探索twemproxy源码的主干流程,想来对于想要开始啃这份优秀源码生肉的童鞋会有不小的帮助。这里我们首先要找到 twemproxy正确的打开方式——twemproxy的文件结构,接着介绍twemproxy程序代码框架,最后介绍twemproxy程序的主干流程。主干流程是本章节的重中之重。这次主要是为了能将这份代码较为复杂的流程进行一些简单的模块分解和流程分解,以方便我们后面的阅读。
twemproxy的文件结构
当然接下来首先要上一幅图,就是twemproxy的文件结构图
图1 文件结构图
如图1所示,src下的是我们最重要的业务代码,这里有几个重要的文件夹,1文件夹里的是网络编程模型,里面包含epoll,kqueue以及evport几个常用的模型。2文件夹里的是哈希算法,其主要来哈希redis协议或者memcache协议的key,包括crc16,crc32,MD5等哈希算法。3是比较重要的文件,它是在这里不仅完成了解析redis协议或者memcache协议,还完成了这两个协议的分片工作。
这里还有几个重要的文件组,4是程序的入口,如图所示,main函数就在其中,5是管理与客户端的连接,6是用来解析配置文件的,7是实现了透明连接池的,8是可以看到主要的程序流程,9是实现了内存管理的内存池,10是数据收发的主干流程,11是数据请求和响应,是数据收发流程10的具体实现,12是用于管理与服务器的连接。
这里可以初步窥视到twemproxy精致的代码结构和高可读性,通过查看文件的名字,我们竟然可以大概YY出这个文件下的代码的作用,而且是八九不离十。
通过这个我们得到了阅读代码的整体思路(我们本次阅读代码的重点是redis服务器集群下的twemproxy)
1.首先以10,11为主线来观察整个程序的收发流程,因为我们知道作为一个缓存中间件代理,最重要的无非是与客户端以及服务器的交互流程。
2.再在主干流程上慢慢拓展,通过探索3文件夹里的解析分片功能,来谈下redis协议的细节和它能进行分片的原因。
3.接着通过上述标红的各功能点6,7,9去观察整个程序,这样对于程序的实现细节有一定的了解。
4.最后我们再去观察一些次要的功能点,如监控,日志记录以及哈希算法等功能的实现。
twemproxy的主干流程概述
接下来我们要探索twemproxy的主干流程,首先我们要知道twemproxy与外界如何交互的,在上文《twemproxy架构分析》中,我们知道了twemproxy架构的架构,为此,我们可以抽象出一幅图形
图2.twemproxy零层数据流图
如图2,这里的conn是表示由客户端发起的与twemproxy的连接,而s_conn是由twemproxy发起的与服务端的连接
这样我们可以将数据收发过程分成以下四步:
1.twemproxy首先接受客户端发起的conn请求。
2.再通过哈希conn请求的key值将其切分成具有相同key哈希值的请求——s_conn请求发给服务端——redis服务集群
3.接着等待接受来自服务端——redis服务集群的s_conn响应,通过这之前的映射关系将其和conn请求关联起来。
4.最后将每一个conn请求对应的每一个conn响应发给客户端。
这样我们可以将其分成两个部分,与客户端交互的1,4是客户层,与服务端交互的2,3是服务层。这样twemproxy就被分成了下面一幅图。
图3. twemproxy流程细化图
接着,我们将服务层和客户层细分成4个模块,我们可以认为1是客户层接收,2是服务层发送,3是服务层接收,4是客户层发送。这样无疑1,2步骤构成了图1中11的nc_request.c的主要内容,而3,4构成了图1中11的nc_response.c的主要内容,如图4所示。
图4. twemproxy模块图
然后,在图1中10的nc_message代码阅读中我们会发现有两个重要流程:一个是发送流程msg_send和一个接收流程msg_recv。
其实2和4是遵循同一个发送流程msg_send,而1和3是遵循同一个接收流程msg_recv。
最后在图1中的8我们看到这两个流程通过epoll模型感知程序究竟要执行哪个操作,即是执行msg_send流程还是执行msg_recv流程。
这样我们通过上述的图2,图3以及图4,将图1中10、11以及8中要完成的主要流程进行了分析,构建了他们之间的基本联系,对于阅读代码有了一个骨架,相信未来通过对于这2个流程和4个模块的关键代码分析,我们就可以“会当凌绝顶,一览众山小”。
总结
通过对源码文件结构的探索,我们知道了twemproxy的主干内容和关键点,明确了阅读twemproxy代码的流程,接着分析twemproxy的主干内容,我们归纳出了我们未来阅读代码的两个重要流程即发送流程msg_send和接收流程msg_recv,还有四个主要模块即:客户层接收、服务层发送、服务层接收以及客户层发送,明确了各个模块的功能、两个流程与各个模块的联系。下一章将首先完成两个重要流程代码的讲解。
另外,对于博文有问题的请大家在评论中留言与博主讨论,博主会及时回复的!!!!