题外,因为抢火车票的原因,颇有些年味的感觉。值得庆幸的是成功的购票。 


正题,跟朋友聊起现在的消息队列,虽然现在的消息队列服务端繁多,但因为业务的原因,往往就那几个选择。 要安全和功能? rabbitmq ,但他的性能确实一般。 zeromq性能是好,但他更偏向于tcp组件。kafka适合大吞吐的消息队列。 据我发现更多的人选择redis作为消息队列。 不少人吐槽redis队列实在简单? 那你要知道redis官方也只是把LIST作为nosql的一个数据类型而已。

我们social小组对于redis很是依赖,OPS操作数经常可以爆到3w+  


文章写的不是太严谨,后期会不断更新修改补充该文章,标注下原文地址:

http://xiaorui.cc/2015/12/11/%E4%BD%BF%E7%94%A8python%E5%AE%9E%E7%8E%B0redis%E7%9A%84ackcommit%E7%A1%AE%E8%AE%A4%E6%9C%BA%E5%88%B6/

项目名

secure_queue


项目地址

https://github.com/rfyiamcool/secure_queue


用一句话来描述这项目,secure_queue可以让redis支持ACK(消息确认), 值得一用  !

为什么会做secure_queue?


平时很喜欢使用redis做MQ消息队列, 使用他的List类型结构实现队列, 简单、高效、性能极好的优点,  但是Redis相比rabbitmq、kafka没有消息确认(ack commit)的特性. 那么我通过实现一个服务来扩展redis的消息确认功能. 现在已经封装了server服务及python client模块,对于使用者来说很是易用的.

实现原理:

服务端是通用的,但现在客户端只有python一个版本,其他语言想用的话,只需要在入队的时候兼容下格式就可以了。 服务端是通过zset有序队列实现的到期时间判断,score分支为通知时间。

secure_queue主要分两部分:

secure_queue client
每次消费队列的时候,会往该队列的ack_queue有序队列扔任务, score为任务的最长超时时间.

secure_queue.py
用来维护ack_queue, 把符合条件的任务重新扔回任务队列 !

Future:

1.  redis zset的value不能重复,解决方法在value加入uuid.  (现在已经实现)
2.  加入重试次数控制.


使用方法:

启动redis

启动secure_queue服务端


secure_queue的客户端测试代码

性能测试

secure_queue主要分为入队列和扫描ackqueue两个模块,虽然是python写的,但他本身没什么性能损耗,另外对于扫描ackqueue是支持多线程扫描的。 最后简单、暴力地测试性能也是可以一秒钟处理1w+的任务量.

 

扯淡, 大家有时间细心看下redis的数据结构,很多时候我们往往扫一眼就不再关注。



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

redis多线程服务端设计的一些思考

    最近有看redis server的源码,想实现一个多线程的版本。在大多数场景下单个redis实例是满足需求的,但如果ops的量级过十几万,连接数超过几k...

阅读全文

redis modules扩展模块的开发使用

上下文:       Redis 4.0 的RC终于出来了, 看了redis官方及antirez的博客都有提到4.0的各种新功能,对我来说是相当有吸引力的 。&n...

阅读全文

技术分享 《大话redis设计实现》

        这次又给朋友公司 (Naver) 做了一次技术分享,主题是《大话redis设计实现》 ,  里面的内容来自 学习《redis设计与实现》...

阅读全文

发表评论