消息队列 redis vs nsq
为了解决高并发而形成阻塞的问题,通常是通过消息队列来解决问题。
最近研究了下golang消息队列的nsq框架(http://nsq.io),也动手实现了这么个功能:通过nsq的生产者大量生产消息向nsq推送而形成消息队列,然后通过nsq的消费者从消息队列里接收消息,再利用websocket将接收到的消息给所有web客户端进行消息推送。这样所有客户端就都能接收服务器广播的消息。
redis是NoSQL数据库,redis它的设计是用来做缓存的,但是由于它自身的某种特性使得他可以用来做消息队列,所以就比较了一下redis和nsq处理消息队列的吞吐量和执行效率。
消息队列执行效率和吞吐量测试方法:
redis:
生产者:LPUSH key value // 往名为key的链表的表头插入数据value
消费者:BRPOP key 0 // 阻塞式从名为key的链表的表尾弹出一个元素
nsqd:
生产者:Publish(topic, msg) // 往nsqd消息队列里推送主题为topic内容为msg的消息
消费者:AddHandler(handle) // 注册handle,在handle里接收消息队列的消息
测试1(内网+发送小数据消息):
测试2(内网+发送大数据消息):
条件有限,没有测试当redis和nsq服务器都处于外网的情况。其实这个很有必要,因为redis部署在外网时听说速度会慢很多。