beanstalk源码剖析——tube和job的操作

1. tube定义

在beanstalk中,tube只是一个消息队列的名字,本身只是作为job的容器,因此不具有复杂的操作。

由于job具有优先级,这里采用最小堆保存job

job具有ready和delay两种状态,因此每个tube采用两个最小堆对job进行管理。

tube结构

2.tube管理

tube的操作定义在tube.c中,

采用一个全局变量tubes管理所有的tube,而每个tube采用引用计数的方式进行管理。

tubes定义为一个集合,采用数组的方式实现。

tube的查找采用的遍历操作的方式,因此性能并不高。在实际使用时每个实例不要包含过多的tube。

不过,如果use和watch操作比较少时,性能影响并不大,因为tubes的遍历只有在use、watch、state、pause的时候才会发生。其他时候使用连接自己管理的tube。

tube.c

 

3. job定义

job属于消息队列中的一个消息,因此必须同时注重内存管理和binlog生成。

job结构

4. job管理

为了保存job,整个实例采用一个全局数组保存所有的job。

因此这里存在一个问题就是如何找到一个job?通过hash的方式将job映射到数组元素中。

job的管理主要是增删查复制操作。

job.c


 

posted @ 2013-08-24 15:49  blockcipher  阅读(1029)  评论(0编辑  收藏  举报