Twemproxy源码分析(三)数据结构(队列)

23 篇文章 0 订阅
5 篇文章 0 订阅

概述

前面我们分析了Twemproxy的启动过程,进程和时间驱动模型,再往下细看逻辑的话,就必须先了解一下Twemproxy的重要数据结构和它们之间的关系了,本节我们先看一下队列,因为很多主要数据结构都用到了它。

有关队列的代码主要在nc_queue.h中,从代码注释中可以看到,这个文件只不过是从FreeBSD中拿过来的,队列的定义和操作凑是通过宏来实现的。通过注释,我们可以了解到nc_queue.h这个文件主要实现了5种队列:

  • singly-linked lists
  • singly-linked tail queues
  • lists
  • tail queues
  • circular queues

大致看了一下,Twemproxy这里似乎只用到了tail queues(尾队列)和singly-linked tail queues(单向尾队列),我们只需要关注这两个。

尾队列:

 

一个尾队列包含两个部分:一个头head,一组元素elements,头我们简称为tqh(tail queue header),元素我们简称为tqe(tail queue element)。

在尾队列的头当中,保存了指向队列第一个元素的指针和指向最后一个元素的next指针的指针,在每个元素当中,则保存了指向下一个元素的next指针和指向上一个元素的next指针的指针。读起来有一点点拗口,看一下下面这个图片就明白了:

tail queues

prev指针的目的是,当需要从队列中删除一个元素时,不需要遍历队列,就能立刻找到上一个元素指向待删除元素的指针,从而仅用O(1)的代价就可以完成删除。

定义尾队列需要用到宏:TAILQ_HEAD(定义一个tqh)和TAILQ_ENTRY(定义一个tqe),通过grep代码我们可以知道使用到尾队列的数据结构分别是conn和msg。

举个例子,使用到conn_tqh的地方在server和server_pool中,这两个结构体都在nc_server.h中定义,可以看下示意图:

server

 

从这张图上我们可以看到server和server_pool的关系,每一个server都会指向一个server_pool,server_pool就是一个Memcached集群,里面包含多个Memcached server,Twemproxy与每一个server会创建多个连接,每个连接放在server->s_conn_q队列当中。而对于每一个server_pool,都会有多个client连接上来,每一个client连接都放在server_pool->c_conn_q当中。

单向尾队列:

顾名思义,单向尾队列就是不包含prev指针的尾队列,因此在删除队列中的元素时需要O(n)的时间复杂度。单向尾队列适用于需要FIFO队列的场合。理解了尾队列就很容易理解单向尾队列,这里就不画图了。

mbuf使用了单向尾队列,可以在nc_mbuf.h中找到定义:

小结:

本节我们了解了一下Twemproxy中队列数据结构的实现,它其实是照搬了FreeBSD中的queue.h。队列的定义和操作全部都是用宏来完成的。Twemproxy中用到了单向尾队列和尾队列。分别在mbuf中、server中和server_pool中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值