周末测试了一下RabbitMQ的性能,RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。个人认为,在互联网开发中,使用消息队列,更多的因为在高并发环境下,由于来不及同步处理,请求会发生堵塞,所以我们需要一个队列服务来进行异步的处理,在这种场景下,只要队列服务满足最基本的Push/Pop已经足够了。
Redis是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持list数据结构的操作,所以完全可以当做一个轻量级的队列服务来使用。
本文简单对比了Redis作为消息队列和RabbitMQ的性能表现情况。
测试环境
1. 硬件环境:在个人笔记本上测试,Server和Client使用同一台机器,硬件信息如下
Processor : Inter(R) Core(TM)2 Duo CPU P8400 @2.26GHz
RAM : 4.00GB
Operating System : 32-bit Ubuntu 10.10
2. 软件化境:RabbitMQ和Redis的Server启动都是用默认配置,客户端使用Java,JVM启动使用默认参数:
RabbitMQ Server 2.2.0
RabbitMQ Java Client 2.2.0
Redis 2.0 Stable
Jedis
对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。
入队性能对比
四种不同大小的数据入队性能对比(RPS):
测试结果:
可以看到对于入队操作,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis慢的无法忍受。
出队性能对比
四种不同大小的数据出队对比(PRS):
测试结果:
可以看到对于出队操作,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。
Redis入队和出队对比
针对Redis入队和出队对比(RPS):
测试数据:
不管数据大小,Redis的出队性能都表现的非常优秀,而入队性能在数据比较大时,慢的无法忍受。
RabbitMQ入队和出队对比
针对RabbitMQ的入队和出队对比(RPS):
测试数据:
不管数据大小,RabbitMQ的入队和出队性能都保持一个均衡的状态,但总体上,出队性能远低于入队性能。
总结
总体看来,Redis比较适合在Web场景下作为队列服务使用,但当数据比较大的时候,入队性能有些问题,也可能是我配置上不正确,所以还需要进一步研究。而RabbitMQ本身支持太多的协议,不适合在Web环境中使用。另外有一个MySQL的插件Q4M,可以使用SQL语法来操作消息队列,只不过性能表现怎么样,还需要进一步测试。