本篇将去探索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. Android性能分析工具介绍

    1. Android系统性能调优工具介绍 http://blog.csdn.net/innost/article/details/9008691 TraceviewSystraceOprofile 2 ...

  2. maven web项目不能创建src/main/java等文件夹的问题

    eclipse创建maevn web项目,在选择maven_archetype_webapp原型后,默认只有src/main/resources这个Source Floder.  按照maven目录结 ...

  3. HNOI2015滚粗记

    HNOI2015滚粗记 经过两天的苦战,艰难的HNOI终于结束了.感觉这次HNOI自己还是收获了许多. \(Day1\)打的很是艰难,题目一下就有种晕头转向的感觉.开场\(20min\)自己还在读题时 ...

  4. [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】

    题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...

  5. 基于MVC模式的数据库综合练习

    一.准备 没什么好说的,直接上代码.... 下面是web.xml <servlet> <servlet-name>list_user</servlet-name> ...

  6. ios7控件特性(一)

    苹果发布iOS7之后,iOS7全部采用扁平化的界面,我们的app界面在iOS7上出现了很大的改变,这包括UINavigationBar,UIButton,UIActionSheet,UITabBar等 ...

  7. 【Maven】解决maven打jar包报错 source 1.3 中不支持注释 (请使用 -sour

    问题:maven在进行打包时,报 '请使用-source 5 或者更高版本以启用XX'的信息并导致打包失败. 原因:maven默认的编译插件的java版本较低,导致其不支持例如泛型,注解等用法. 解决 ...

  8. Android开源项目发现--- 工具类图片缓存篇(持续更新)

    1. Android-Universal-Image-Loader 图片缓存 目前使用最广泛的图片缓存,支持主流图片缓存的绝大多数特性. 项目地址:https://github.com/nostra1 ...

  9. hadoop-2.0.0-cdh4.2.1源码编译总结

    经过一个星期多的努力,这两个包的编译工作总算告一段落. 首先看一下这一篇文章: 在eclipse下编译hadoop2.0源码 http://www.cnblogs.com/meibenjin/arch ...

  10. dump iot表

    SQL> create user scan identified by scan default tablespace users; User created. SQL> grant db ...