消息中间件对比
一、为什么需要消息队列服务?
在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如大量的insert,update之类的请求同时达到mysql,直接导致无数的行锁表锁,甚至最后请求堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。
二、选择MQ时主要关注的特性
1) 通信模式(是否满足业务场景):
ActiveMQ: queue(producer/consumer), topic(publisher/subscriber)
RabbitMQ: AMQP协议支持路由选择和广播
ZeroMQ: 支持REQ、PUSH、PULL等模式
2) 支持的接口语言:
RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。
3) 消息持久化:
ActiveMQ 和 RabbitMQ都支持
4) 服务器主备搭建,客户端自动failover支持:
ActiveMQ(非常容易) > RabbitMQ > ZeroMQ
5) 性能
6) 监控、配置
方便监控、配置
三、各类MQ比较
ActiveMQ
Apache ActiveMQ居于两者(RabbitMQ & ZeroMQ)之间,类似于ZeroMQ,它可以部署于代理模式和P2P模式。
ActiveMQ被誉为Java世界的中坚力量。
类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。
RabbitMQ
RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多协议:AMQP,XMPP,SMTP,STOMP,也正是如此,使它变得非常重量级,更适合企业级的开发。RabbitMQ是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。
对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。此特性使得RabbitMQ易于使用和部署,适宜很多场景如路由、负载均衡或消息持久化等,用消息队列只需要几行代码就可以搞定。但是,这使得它的扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。
RabbitMQ需要在目标主机上安装Erlang环境。
ZeroMQ
ZeroMQ号称最快的消息队列系统,尤其针对大吞吐量的需求场景。是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个模块(比如Socket或者Device等)。
ZeroMQ能实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合各种技术框架,技术上的复杂度是对这个MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或者中间件,因为你的应用程序将扮演这个服务角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。
但是,ZeroMQ仅提供非持久性的队列,也就是down机,数据将会丢失。
Kafka/Jafka
Kafka(能将消息分散到不同的节点上)是LinkedIn于2010年12月开发并开源的一个分布式MQ系统,现在是Apache的一个孵化项目,是一个高性能跨语言分布式Publish/Subscribe消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。
Kafka具有以下特性:
快速持久化,可以在O(1)的系统开销下进行消息持久化;
高吞吐,在一台普通的服务器上既可以达到10w/s的吞吐速率;
完全分布式,Broker,Producer,Consumer都原生自动支持分布式,自动实现负载均衡;
支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。
Redis
Redis是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所有完全可以当做一个轻量级的队列服务来使用。
四、参考
http://blog.ftofficer.com/2010/03/translation-rabbitmq-python-rabbits-and-warrens/ 兔子和兔子窝