博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
twemproxy源码解析---特性及启动流程
阅读量:6158 次
发布时间:2019-06-21

本文共 1817 字,大约阅读时间需要 6 分钟。

hot3.png

 

一、Twemproxy概述及其特性

Twemproxy是一个由twitter开源的memcache与redis的代理,全部由C语言实现。作为一个代理,它的主要特性包括:

1:可以减少到后端cache服务器的连接。

2:在多个cache服务之间自动共享数据。

3:能够使用不同的策略和散列函数支持一致性hash。

4:通过配置设置是否禁用失败的节点。

5:运行多个实例,客户端可以连接到第一个可用的代理服务。

6:支持请求的流式与批处理,降低来回的消耗。

二、Twemproxy启动启动流程分析

对于一个由C/C++编写的应用程序而言,程序的启动点一般都是main函数,所以对一个程序进行分析的话,也一般都是有main函数作为入口,我们这里也不例外,以main函数作为入口。

找到文件nc.c定位到main,我们可以看到定义了一个变量,

struct instance nci;

下边我们看下这个instance的定义:

struct instance {    struct context  *ctx;                        /* active context */    int             log_level;                   /* log level */    char            *log_filename;               /* log filename */    char            *conf_filename;              /* configuration filename */    uint16_t        stats_port;                  /* stats monitoring port */    int             stats_interval;              /* stats aggregation interval */    char            *stats_addr;                 /* stats monitoring addr */    char            hostname[NC_MAXHOSTNAMELEN]; /* hostname */    size_t          mbuf_chunk_size;             /* mbuf chunk size */    pid_t           pid;                         /* process id */    char            *pid_filename;               /* pid filename */    unsigned        pidfile:1;                   /* pid file created? */};

这个instance就相当于是一个twemproxy实例,后边整个程序的初始化很多都会用到。接下来就调用了nc_set_default_options()和nc_get_options()两个函数,其中nc_get_options这个函数是读取命令行参数。其中比较重要的几个参数分别有:

a) test_conf : 用于设置在启动twemproxy之前是否要对配置文件做检查,以确保配置文件格式的正确。

然后就会调用nc_pre_run,启动之前做一些预处理,包括:初始化日志级别以及日志文件;设置是否后台运行;对信号做初始化处理;是否创建pid文件。

接下来调用nc_run开始启动proxy;这个函数完成的工作就是调用core_start创建context,然后进入死循环调用core_loop开始整个事件循环的处理,接受请求并处理。当然,core_start以及core_loop这两个函数里边还包含了大量的处理工作,包括,配置文件解析以及读取,相关组件(server_pool,conf,context)的初始化等等,这些后边详细讲述。

总体来说,启动流程就是这些步骤,如下图:

转载于:https://my.oschina.net/yuxing/blog/140889

你可能感兴趣的文章
ExtJS之开篇:我来了
查看>>
☆1018
查看>>
oracle 去掉空格
查看>>
6.13心得
查看>>
Runtime类
查看>>
eclipse decompiler
查看>>
记一个搜索网盘资源的网站
查看>>
jdk1.7和jdk1.8的String的getByte方法的差异
查看>>
java父子进程通信
查看>>
Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
查看>>
Olap学习笔记
查看>>
Codeforces Round #431 (Div. 1)
查看>>
如何进行数组去重
查看>>
将标题空格替换为 '_' , 并自动复制到剪切板上
查看>>
List Collections sort
查看>>
Mysql -- You can't specify target table 'address' for update in FROM clause
查看>>
使用局部标准差实现图像的局部对比度增强算法。
查看>>
2017-2018-1 20165313 《信息安全系统设计基础》第八周学习总结
查看>>
《代码敲不队》第四次作业:项目需求调研与分析
查看>>
菜鸡互啄队—— 团队合作
查看>>