基于memcache的队列设计
基于memcache的队列设计
作者: | gashero |
---|
1 需求
两个系统交互,使用memcache作为中间的接口,因为传送的数据可能类型很多,而且无法定义一个很好的键名,所以设计了memcache队列,以供数据传输用。
2 基本设计原理
memcache中实现了命令 incr 和 decr 分别对一个键进行自加和自减操作。执行命令的结果是返回自加或自减后的结果。因为是通用memcache命令,所以在各种语言的接口中都有实现,本例探讨基于Python的实现。
协议接口:
incr <key> <value>\r\n decr <key> <value>\r\n
Python接口:
incr(key,delta=1) decr(key,delta=1)
3 队列结构设计
基于memcache实现的队列,需要实现两个基本变量以控制整个队列。
3.1 队列指针
队列指针有两个变量,一个是 head 另一个是 tail 分别为队列的最后一个ID和最前一个ID。每次加入新的item都会使得 tail++ ,而每次取走一个item都会使得 head++ 。
3.2 队列元素
每个队列元素都是按照 prefix+index 形式构造,即一个类别前缀加上索引数字。之后在value中存储串行化以后的数据。
3.3 队列的循环
经测试memcache中的自增变量的数据类型为long型,即有符号32位整数。最大可取值区间为-2199023255552至 2199023255551。所以,为了防止系统长时间运行出现问题,必须设置一个队列的循环机制。无论head还是tail变量,必须设计一个最大值, 当达到最大值时就清零循环。
经测试,在Python调用memcache测试最大允许自增变量值超过最大可取值范围时,发生了ValueError异常。而在memcache 协议中则表示根本没有验证数据溢出的情况。在应用中需要酌情考虑。比如设置为1048576,为队列的最大长度,并且每次在index达到这个数字时即循 环。
4 需要注意的问题
4.1 数据项丢失
memcache的设计目标是提供高速度的数据缓存服务,并不确保数据的完整性,在内存不足时,memcache甚至会主动删除一些存储的键值。所以,即便是通过正常的接口、head与tail指定的标志,获取键值时也要考虑到异常的可能。
4.2 及时删除过期变量
在接收端应用程序取走数据之后应该立即删除memcache中的对应键,否则时间长了可能会因为占用内存过多而影响尚未取走变量的存储。