消息队列是分布式系统中重要的组件,在不少生产环境如商品抢购等须要控制并发量的场景下都须要用到。最近组内须要作流水server的选型升级,这里对消息队列及常见的消息队列进行了一次调研,整理了相关资料,分享给你们。php
1、消息队列(MQ)概述html
消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景能够简单地描述为:java
当不须要当即得到结果,可是并发量又须要进行控制的时候,差很少就是须要使用消息队列的时候。python
消息队列主要解决了应用耦合、异步处理、流量削锋等问题。c++
当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。git
2、消息队列使用场景web
消息队列在实际应用中包括以下四个场景:redis
下面详细介绍上述四个场景以及消息队列如何在上述四个场景中使用:sql
2.1 异步处理 具体场景:用户为了使用某个应用,进行注册,系统须要发送注册邮件并验证短信。对这两个操做的处理方式有两种:串行及并行。数据库
(1)串行方式:新注册信息生成后,先发送注册邮件,再发送验证短信;
在这种方式下,须要最终发送验证短信后再返回给客户端。
(2)并行处理:新注册信息写入后,由发短信和发邮件并行处理;
在这种方式下,发短信和发邮件 需处理完成后再返回给客户端。
假设以上三个子系统处理的时间均为50ms,且不考虑网络延迟,则总的处理时间:
串行:50+50+50=150ms
并行:50+50 = 100ms
若使用消息队列:
并在写入消息队列后当即返回成功给客户端,则总的响应时间依赖于写入消息队列的时间,而写入消息队列的时间自己是能够很快的,基本能够忽略不计,所以总的处理时间相比串行提升了2倍,相比并行提升了一倍;
2.2 应用耦合
具体场景:用户使用QQ相册上传一张图片,人脸识别系统会对该图片进行人脸识别,通常的作法是,服务器接收到图片后,图片上传系统当即调用人脸识别系统,调用完成后再返回成功,以下图所示:
该方法有以下缺点:
若使用消息队列:
此时图片上传系统并不须要关心人脸识别系统是否对这些图片信息的处理、以及什么时候对这些图片信息进行处理。事实上,因为用户并不须要当即知道人脸识别结果,人脸识别系统能够选择不一样的调度策略,按照闲时、忙时、正常时间,对队列中的图片信息进行处理。
2.3 限流削峰
具体场景:购物网站开展秒杀活动,通常因为瞬时访问量过大,服务器接收过大,会致使流量暴增,相关系统没法处理请求甚至崩溃。而加入消息队列后,系统能够从消息队列中取数据,至关于消息队列作了一次缓冲。
该方法有以下优势:
2.4 消息驱动的系统
具体场景:用户新上传了一批照片, 人脸识别系统须要对这个用户的全部照片进行聚类,聚类完成后由对帐系统从新生成用户的人脸索引(加快查询)。这三个子系统间由消息队列链接起来,前一个阶段的处理结果放入队列中,后一个阶段从队列中获取消息继续处理。
该方法有以下优势:
3、消息队列的两种模式
消息队列包括两种模式,点对点模式(point to point, queue)和发布/订阅模式(publish/subscribe,topic)。
3.1 点对点模式
点对点模式下包括三个角色:
消息发送者生产消息发送到queue中,而后消息接收者从queue中取出而且消费消息。消息被消费之后,queue中再也不有存储,因此消息接收者不可能消费到已经被消费的消息。
点对点模式特色:
3.2 发布/订阅模式
发布/订阅模式下包括三个角色
发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
发布/订阅模式特色:
4、经常使用消息队列介绍
本部分主要介绍四种经常使用的消息队列(RabbitMQ/ActiveMQ/RocketMQ/Kafka)的主要特性、优势、缺点。
4.1 RabbitMQ
RabbitMQ 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
主要特性:
使用RabbitMQ须要:
RabbitMQ能够运行在Erlang语言所支持的平台之上:
优势:
缺点:
4.2 ActiveMQ
ActiveMQ是由Apache出品,ActiveMQ 是一个彻底支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。它很是快速,支持多种语言的客户端和协议,并且能够很是容易的嵌入到企业的应用环境中,并有许多高级功能。
主要特性:
使用ActiveMQ须要:
ActiveMQ能够运行在Java语言所支持的平台之上。
优势:
缺点:
4.3 RocketMQ
RocketMQ出自 阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并作出了本身的一些改进,消息可靠性上比 Kafka 更好。RocketMQ在阿里集团被普遍应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。
主要特性:
使用RocketMQ须要:
RocketMQ能够运行在Java语言所支持的平台之上。
优势:
缺点:
4.4 Kafka
Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),,以后成为Apache项目的一部分。Kafka系统快速、可扩展而且可持久化。它的分区特性,可复制和可容错都是其不错的特性。
主要特性:
快速持久化,能够在O(1)的系统开销下进行消息持久化;
高吞吐,在一台普通的服务器上既能够达到10W/s的吞吐速率;
.彻底的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;
支持同步和异步复制两种HA;
支持数据批量发送和拉取;
zero-copy:减小IO操做步骤;
数据迁移、扩容对用户透明;
无需停机便可扩展机器;
其余特性:严格的消息顺序、丰富的消息拉取模型、高效订阅者水平扩展、实时的消息订阅、亿级的消息堆积能力、按期删除机制;
使用Kafka须要:
Java JDK
Kafka安装包
优势:
客户端语言丰富,支持java、.net、php、ruby、python、go等多种语言;
性能卓越,单机写入TPS约在百万条/秒,消息大小10个字节;
提供彻底分布式架构, 并有replica机制, 拥有较高的可用性和可靠性, 理论上支持消息无限堆积;
支持批量操做;
消费者采用Pull方式获取消息, 消息有序, 经过控制可以保证全部消息被消费且仅被消费一次;
有优秀的第三方Kafka Web管理界面Kafka-Manager;
在日志领域比较成熟,被多家公司和多个开源项目使用;
缺点:
Kafka单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应时间变长
使用短轮询方式,实时性取决于轮询间隔时间;
消费失败不支持重试;
支持消息顺序,可是一台代理宕机后,就会产生消息乱序;
社区更新较慢;
4.5 RabbitMQ/ActiveMQ/RocketMQ/Kafka对比
这里列举了上述四种消息队列的差别对比
注意:其实RabbitMQ也是支持事物的
结论:
Kafka在于分布式架构,RabbitMQ基于AMQP协议来实现,RocketMQ/思路来源于kafka,改为了主从结构,在事务性可靠性方面作了优化。普遍来讲,电商、金融等对事务性要求很高的,能够考虑RabbitMQ和RocketMQ,对性能要求高的可考虑Kafka。
5、参考资料:
5.1 消息队列:
大型网站架构之分布式消息队列 blog.csdn.net/shaobingj12…
消息队列的使用场景 www.zhihu.com/question/34…
浅谈异步消息队列模型 www.cnblogs.com/sunkeydev/p…
消息队列的两种模式 blog.csdn.net/heyutao007/…
5.2 RabbitMQ
RabbitMQ主页 www.rabbitmq.com/
RabbitMQ学习教程 www.rabbitmq.com/getstarted.…
专栏:RabbitMQ从入门到精通 blog.csdn.net/column/deta…
RabbitMQ能为你作些什么 rabbitmq.mr-ping.com/description…
RabbitMQ指南(1)-特性及功能 blog.zenfery.cc/archives/79…
5.3 ActiveMQ
ActiveMQ主页 activemq.apache.org/
Apache ActiveMQ介绍 jfires.iteye.com/blog/118768…
ActiveMQ的简介与安装 blog.csdn.net/sl1992/arti…
ActiveMQ 和消息简介 www.cnblogs.com/craftsman-g…
5.4 RocketMQ
RocketMQ 原理简介 rocketmq.apache.org/docs/quick-…
RocketMQ与kafka对比(18项差别) jm.taobao.org/2016/03/24/…
5.5 Kafka
1.Kafka主页: kafka.apache.org/
Kafka特性 www.cnblogs.com/lsx1993/p/4…
Kafka客户端支持语言 cwiki.apache.org/confluence/…
5.6 RabbitMQ/ActiveMQ/RocketMQ/Kafka对比
RocketMQ,队列选型 www.zmannotes.com/index.php/2…
RabbitMQ和Kafka www.dongcoder.com/detail-4168…
即时通讯RabbitMQ二-性能测试 www.jianshu.com/p/d31ae9e3b…
RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总 blog.csdn.net/linsongbin1…
消息队列软件产品大比拼 www.cnblogs.com/amityat/arc…
总结:
消息队列利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通讯来进行分布式系统的集成。目前业界有不少的MQ产品,例如RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,也有直接使用数据库redis充当消息队列的案例。而这些消息队列产品,各有侧重,在实际选型时,须要结合自身需求及MQ产品特征,综合考虑。
note:只有作好今天,才能梦想明天。