一、消息队列对比
1.RabbitMQ
①RabbitMQ是使用Erlang语言编写的一个开源的消息队列
②本身支持很多协议:AMQP、XMPP、SMTP、STOMP,也正因如此,它非常重量级,更适合于企业级的开发
②实现了Broker架构,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。
③分布式
2.Redis
①Redis是一个基于key-value的NoSQL型数据库,开发维护很活跃
②虽然它是一个Key-Value的数据库存储系统,但它本身支持MQ功能,所以完全可以当作一个轻量级的队列服务来使用
3.ZeroMQ
①ZeroMQ号称最快的消息队列系统,尤其针对大吞吐量的需求场景
②ZeroMQ能供实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。
③ZeroMQ仅提供非持久性的队列,也就是说如果宕机,数据将会丢失,其中,Twitter的Storm 0.9以前的版本默认使用ZeroMQ作为数据流的传输(Storm从0.9版本开始同时支持ZeroMQ和Netty作为传输模块)
4.ActiveMQ
①ActiveMQ是Apache下的一个子项目
②类似于ZeroMQ,它能够以代理人和点对点的技术实现队列
③类似于RabbitMQ,它少量代码就可以高效地实现应用场景。
5.Kafka
①Kafka是Apache下的一个子项目
②采用Scala语言编写,它以可水平扩展和高吞吐率而被广泛使用。
③Kafka之间传输数据使用的是零拷贝技术
④完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡
⑤高吞吐,在一台普通的服务器上可以达到10W/s的吞吐速率
⑥快速持久化,可以在O(1)的系统开销下进行消息持久化
⑦支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要要求实时处理的限制,这是一个可行的方案。Kafka通过Hadoop的并行加载机制统一了在线和离线的消息处理。
这里被被应用于博主的一篇博客:网站日志流量分析系统
二、消息队列使用
1.RabbitMQ的安装及使用
1.异步处理
来一个场景
1.messaging
①对于一些常规的消息系统,kafka是个不错的选择,partions/replication和容错,可以使kafka具有良好的扩展性和性能优势
②kafka并没有提供JMS中的“事务性”、“消息传输担保(消息确认机制)”等企业级特性;kafka只能使用作为“常规”的消息系统,在一定程度上,尚未确保消息的发送与接收绝对可靠(比如,消息重发、消息发送丢失等)
2.Website activity tracking
①kafka可以作为“网站活性跟踪”的最佳工具,可以将网页/用户操作等信息发送到kafka中,并实时监控,或者离线