经常有人会问我,消息队列你常用的是啥?
我用的是 同学推荐的Beanstalk。这个东东还是非常不错的。不过有时候我们可能需要更轻巧的实现以满足自己的需求。让我们来看下什么样的东东可以称之为消息队列。通常所谓队列就是个先进先出的玩意(FIFO)。消息队列就是用来存放消息的队列。因此,队列里边放啥,那是用户需要操心的。如果是一个内存队列,用C/C++来实现,那就是一个单向链表,用脚本来做,那就是一个数组,只是在存取的时候要牢记,FIFO。如果是一个放在磁盘上的玩意,那有很多做法。可以用基于单机DB的,如BerkeleyDB,SQLite等,也可用一般的数据库如mysql。当然,不怕麻烦,自己写个文件,定义好格式,做好索引也不难。我在这里,用perl写个小程序来展示下套在队列这个数据结构外层的网络的框架。对于TCP服务,最简单的做法是C/S双方约定好格式。简单的格式,通常是:size | data。就是说,头部第一个字节表示一次TCP业务的长度,data里边是具体的数据。data里边可能还有具体的业务格式。对于我们这个最基本的消息对类来说,我们可以这样定义:消息队列入队列的TCP流为:两个字节的头+小于65536个长度的消息本身。从消息队列获取消息:0x00格式非常简单。实现也就非常简单。程序监听在7070端口,当有客户端链接上来时,先读取头两个字节。如果读到了头两个字节,调用函数,get_size。
如果是要获取消息,程序首先检查是否队列里边已经有,有的话,从头部拿出一个来,返回给客户端。如果没有,将客户端的请求句柄压入等待队列。
如果是客户端请求把消息放入队列,则,继续获取消息本身。到此,一个最基本的框架就搭好了。简单测试下来,性能还可以,QPS基本上可以达到10000左右。对于很多不太喜欢使用裸TCP的人来说,基于HTTP的消息队列可能更有需求。我们下一篇在介绍。不过如果消息本身比较短小的话,HTTP的效率还是低了点。