一个简单的TCP消息队列

经常有人会问我,消息队列你常用的是啥?
我用的是@greatdeer  同学推荐的Beanstalk。这个东东还是非常不错的。
不过有时候我们可能需要更轻巧的实现以满足自己的需求。
让我们来看下什么样的东东可以称之为消息队列。通常所谓队列就是个先进先出的玩意(FIFO)。消息队列就是用来存放消息的队列。因此,队列里边放啥,那是用户需要操心的。
如果是一个内存队列,用C/C++来实现,那就是一个单向链表,用脚本来做,那就是一个数组,只是在存取的时候要牢记,FIFO。
如果是一个放在磁盘上的玩意,那有很多做法。可以用基于单机DB的,如BerkeleyDB,SQLite等,也可用一般的数据库如mysql。当然,不怕麻烦,自己写个文件,定义好格式,做好索引也不难。

我在这里,用perl写个小程序来展示下套在队列这个数据结构外层的网络的框架。
对于TCP服务,最简单的做法是C/S双方约定好格式。简单的格式,通常是:
size | data。
就是说,头部第一个字节表示一次TCP业务的长度,data里边是具体的数据。data里边可能还有具体的业务格式。

对于我们这个最基本的消息对类来说,我们可以这样定义:
消息队列入队列的TCP流为:
两个字节的头+小于65536个长度的消息本身。
从消息队列获取消息:
0x00
格式非常简单。实现也就非常简单。

100513_acaI_1443697.png

程序监听在7070端口,当有客户端链接上来时,先读取头两个字节。如果读到了头两个字节,调用函数,get_size。

100538_0XxR_1443697.png

如果是要获取消息,程序首先检查是否队列里边已经有,有的话,从头部拿出一个来,返回给客户端。如果没有,将客户端的请求句柄压入等待队列。

如果是客户端请求把消息放入队列,则,继续获取消息本身。
到此,一个最基本的框架就搭好了。
简单测试下来,性能还可以,QPS基本上可以达到10000左右。

对于很多不太喜欢使用裸TCP的人来说,基于HTTP的消息队列可能更有需求。我们下一篇在介绍。不过如果消息本身比较短小的话,HTTP的效率还是低了点。

转载于:https://my.oschina.net/pikeman/blog/194903

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值