本篇将去探索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发起的twemproxy的连接

这样我们可以将数据收发过程分成以下四步:

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

2.再通过哈希conn请求的key值将其切分成具有相同key哈希值的请求——s_conn请求发给服务端——redis服务集群

3.接着等待接受来自服务端——redis服务集群的s_conn响应,通过这之前的映射关系将其和conn请求关联起来。

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

我们能收发数据的一个重要原因是redis服务器的实现是单线程的,为此,twemproxy的实现也是单线程的。

这样我们可以将其分成两个部分,与客户端交互的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中要完成的主要流程进行了分析,构建了他们之间的基本联系,对于阅读代码有了一个骨架,相信未来通过对于这两个流程和4个模块的关键代码分析,我们就可以“会当凌绝顶,一览众山小”。

总结

通过对源码文件结构的探索,我们知道了twemproxy的主干内容和关键点,明确了阅读twemproxy代码的流程,接着分析twemproxy的主干内容,我们归纳出了我们未来阅读代码的两个重要流程即发送流程msg_send和接收流程msg_recv,还有四个主要模块即:客户层接收、服务层发送、服务层接收以及客户层发送,明确了各个模块的功能、两个流程与各个模块的联系。下一章将首先完成两个重要流程代码的讲解。

twemproxy代码框架概述——剖析twemproxy代码前编的更多相关文章

  1. twemproxy接收流程探索——剖析twemproxy代码正编

    本文旨在帮助大家探索出twemproxy接收流程的代码逻辑框架,有些具体的实现需要我们在未来抽空去探索或者大家自行探索.在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份 ...

  2. twemproxy发送流程探索——剖析twemproxy代码正编

    本文想要完成对twemproxy发送流程--msg_send的探索,对于twemproxy发送流程的数据结构已经在<twemproxy接收流程探索--剖析twemproxy代码正编>介绍过 ...

  3. twemproxy代理主干流程——剖析twemproxy代码正编

    在twemproxy的发送和接收流程剖析中,我们已经完全弄清楚twemproxy如何将客户端以及服务端发来的包切分成msg,获得一个独立的msg后twemproxy应该如何处理?这是本文这次需要重点介 ...

  4. twemproxy分片处理原理--剖析twemproxy代码正编

    twemproxy在redis上能处理多命令流程只有mset,mget,del的命令,例如mset的话是mset k1 v1 k2 v2 k3 k3,mget的话是mget k1 k2 k3,del的 ...

  5. twemproxy架构分析——剖析twemproxy代码前编

    twemproxy背景 在业务量剧增的今天,单台高速缓存服务器已经无法满足业务的需求, 而相较于大容量SSD数据存储方案,缓存具备速度和成本优势,但也存在数据安全性的挑战.为此搭建一个高速缓存服务器集 ...

  6. 剖析twemproxy前言

    又是喜闻乐见的新坑,前面的mysql协议,当我在解读go-mysql包的时候,会重新讲到,至于Leetcode的更新会与go语言同步.关于这个redis的新坑,目前打算通过剖析twemproxy源码来 ...

  7. AI框架外部用户贡献代码

    AI框架外部用户贡献代码 概述 飞桨是百度自主研发的一款开源的深度学习框架,是主流深度学习框架中首个完全国产化的产品,已经在农业.医疗.林业.科研.服务等领域成功应用.无论是已入职场的深度学习从业者. ...

  8. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  9. 由浅入深吃透MVC框架,驯服烂代码

    MVC 已经成为客户端的主流编程框架,相信客户端工程师对它并不陌生,甚至在开发过程中,不通过思考都会自动使用 MVC 框架编程.但在工作过程中,发现许多小伙伴也只是使用 MVC,对于为什么这样使用并不 ...

随机推荐

  1. 实现Action(含Action访问ServletAPI)

    Action里是否包含实例变量不重要,重要的是包含setter和getter方法. Action可用于封装请求参数和处理结果.jsp中使用struts2输出:<s:property value= ...

  2. 子元素增加margin-top会增加给父元素的问题

    假设我们有如下代码 <div id="father" style="height:400px;width:400px;background:#e4393c;&quo ...

  3. 机器视觉工具箱-Machine Vision Toolbox for Matlab

    发现了一个机器视觉的Matlab工具箱,分享一下. 机器视觉工具箱(MVT的)规定,在机器视觉和基于视觉的控制有益的多种功能.这是一个有点折衷收集反映作者在光度学,摄影测量,色度学 方面的个人利益.它 ...

  4. Mac、Linux与Windows

    Mac本身是基于达尔文内核(Darwin内核),是苹果由UNIX改造的类UNIX,然后在这内核基础上搭建的图形界面 Linux确实是个好东西,你只需要一个键盘,一个显示器,一根网线,接入网络,便能做几 ...

  5. The Greate Wall 相关网络知识(一)域名劫持

    什么叫做DNS? DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串 ...

  6. Application+Handle+Task

    Application Application和Activity,Service一样,是android框架的一个系统组件,android系统会为每个程序运行时创建一个Application类的对象且仅 ...

  7. http server v0.1_http_webapp.c

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  8. [BZOJ 1004] [HNOI2008] Cards 【Burnside引理 + DP】

    题目链接:BZOJ - 1004 题目分析 首先,几个定义和定理引理: 群:G是一个集合,*是定义在这个集合上的一个运算. 如果满足以下性质,那么(G, *)是一个群. 1)封闭性,对于任意 a, b ...

  9. uva 1428 - Ping pong

    树状数组,把他们的技能值作为轴: 首先按照编号从小到大插入值,这样就可以得到,技能值比当前小的人数: 然后按照编号从大到小再插一遍: 代码: #include<cstdio> #inclu ...

  10. call和apply还有bind

    有图有真相 function myfun1(){ //这是私有属性 var private1 = "这是私有属性1"; var privateMethod = function() ...