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发起的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代码前编的更多相关文章
- twemproxy接收流程探索——剖析twemproxy代码正编
本文旨在帮助大家探索出twemproxy接收流程的代码逻辑框架,有些具体的实现需要我们在未来抽空去探索或者大家自行探索.在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份 ...
- twemproxy发送流程探索——剖析twemproxy代码正编
本文想要完成对twemproxy发送流程--msg_send的探索,对于twemproxy发送流程的数据结构已经在<twemproxy接收流程探索--剖析twemproxy代码正编>介绍过 ...
- twemproxy代理主干流程——剖析twemproxy代码正编
在twemproxy的发送和接收流程剖析中,我们已经完全弄清楚twemproxy如何将客户端以及服务端发来的包切分成msg,获得一个独立的msg后twemproxy应该如何处理?这是本文这次需要重点介 ...
- twemproxy分片处理原理--剖析twemproxy代码正编
twemproxy在redis上能处理多命令流程只有mset,mget,del的命令,例如mset的话是mset k1 v1 k2 v2 k3 k3,mget的话是mget k1 k2 k3,del的 ...
- twemproxy架构分析——剖析twemproxy代码前编
twemproxy背景 在业务量剧增的今天,单台高速缓存服务器已经无法满足业务的需求, 而相较于大容量SSD数据存储方案,缓存具备速度和成本优势,但也存在数据安全性的挑战.为此搭建一个高速缓存服务器集 ...
- 剖析twemproxy前言
又是喜闻乐见的新坑,前面的mysql协议,当我在解读go-mysql包的时候,会重新讲到,至于Leetcode的更新会与go语言同步.关于这个redis的新坑,目前打算通过剖析twemproxy源码来 ...
- AI框架外部用户贡献代码
AI框架外部用户贡献代码 概述 飞桨是百度自主研发的一款开源的深度学习框架,是主流深度学习框架中首个完全国产化的产品,已经在农业.医疗.林业.科研.服务等领域成功应用.无论是已入职场的深度学习从业者. ...
- java集合框架之java HashMap代码解析
java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...
- 由浅入深吃透MVC框架,驯服烂代码
MVC 已经成为客户端的主流编程框架,相信客户端工程师对它并不陌生,甚至在开发过程中,不通过思考都会自动使用 MVC 框架编程.但在工作过程中,发现许多小伙伴也只是使用 MVC,对于为什么这样使用并不 ...
随机推荐
- js获取css属性方法
function getDefaultStyle(obj,attribute){ return obj.currentStyle?obj.currentStyle[attribute] : docum ...
- CSS3 中FLEX快速实现BorderLayout布局
学习完flex的布局模式之后,我们趁热打铁,来实现一个BoxLayout布局.什么是BoxLayout布局?那我们先上一个图看看 BoxLayout布局写过后端UI代码的编程者应该不陌生了,写前端的代 ...
- Android 进程和文件的UID/GID
一.文件的操作权限和UID,GID以及进程的UID,GID 1. 文件资源的权限力度:UID/GID 2. 文件的可操作权限 3. 进程的标识: PID, UID, GID, GIDs 二.UID,G ...
- 解决VS2015无法调试dotnet core项目
dotnet core 1.0正式版和VS2015 update3安装后一直无法在VS中正常调试. 错误提示:The debugger's worker process (msvsmon.exe) u ...
- linux源码Makefile的详细分析
目录 一.概述 1.本文的意义 2.Linux内核Makefile文件组成 二.Linux内核Makefile的“make解析”过程 1 顶层Makefile阶段 1.从总目标uImage说起 2.v ...
- MFC 之ActiveX控件学习
本文将介绍ActiveX控件的应用与工作原理,读者可以把ActiveX控件看成一个极小服务器的应用程序,它不能独立运行,必须要嵌入到容器程序中与容器一起运行,就像电脑主机中的显卡,它自己在电脑硬件系统 ...
- 0x1L
整形常量的后缀表示其类型,包括如下后缀,其中U和L的大小写通用 后缀 类型L long int LL long long int U ...
- c# 把 颜色值Hex 转换为 Color
原文: http://abujj.me/archives/695 Assuming you mean the HTML type RGB codes (called Hex codes, such a ...
- C连接MySQL数据库开发之Xcode环境配置及测试
一.开发环境 Mac OS X 10.9.2 64位.Xcode5.1.MySQL5.5.37 64位 MySQL安装目录为:/usr/local/mysql 二.配置xcode连接mysql的编译选 ...
- importExcel运用注解实现EXCEL导入poi类
JAVA报表 package com.app.common.excel; import java.io.File; import java.io.FileInputStream; import jav ...