MQ学习系列:php
本文是-消息队列学习的概念与介绍篇。目的是可以对消息队列可以有一个简单的了解和大致的认知。html
参考/学习资料整理(好东西要学会分享 )java
架构之家公众号上的消息队列文章github
JavaGuide(一份涵盖大部分Java程序员所须要掌握的核心知识的文档类项目)面试
JCSprout(处于萌芽阶段的 Java 核心知识库)数据库
一个在线绘图的工具apache
消息队列 MQ(message queue)中间件是分布式系统中的重要组件,主要解决异步消息、应用解耦、流量 削峰等问题,从而实现高性能、高可用 ,可伸缩和最终一致性的架构。
使用较多的消息队列有ActiveMQ 、RabbitMQ、RocketMQ、Kafka、MetaMQ等
举个栗子:
有这样一个用户注册场景 ,实现将注册信息写入数据库并发送邮件和注册短信的功能。
传统的方式如图:
这样的方式会一步步按照前后顺序 完成后返回给用户信息 ,整个过程用户都处于等待的状态,并用时150ms。
而引用消息对列 ,异步处理,改造后的架构以下:
这样对于用户的响应时间就大大减小了。
多应用间经过消息队列对同一消息进行处理,避免调用接口失败致使整个过程失败。
普遍应用于秒杀或抢购活动中,避免流量过大致使应用系统挂掉的状况。
具体场景:购物网站开展秒杀活动,通常因为瞬时访问量过大,服务器接收过大,会致使流量暴增,相关系统没法处理请求甚至崩溃。而加入消息队列后,系统能够从消息队列中取数据,至关于消息队列作了一次缓冲。
JMS(JAVA Message Service,java消息服务)是java的消息服务,JMS的客户端之间能够经过JMS服务进行异步的消息传输。JMS(JAVA Message Service,Java消息服务)API是一个消息服务的标准或者说是规范,容许应用程序组件基于JavaEE平台建立、发送、接收和读取消息。它使分布式通讯耦合度更低,消息服务更加可靠以及异步性。
ActiveMQ 就是基于 JMS 规范实现的。
P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每一个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留消息 ,直到他们被消费或超时。
P2P的特色:
若是但愿发送的每一个消息都会被成功处理的话,那么须要P2P模式。
Pub/Sub模式包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。多个 发布者将消息发布到Topic,系统将这些消息传递给多个订阅者。
Pub/Sub的特色:
若是但愿发送的消息能够被多个消费者处理的话,那么能够采用Pub/Sub模型。
JMS定义了五种不一样的消息正文格式,以及调用的消息类型,容许你发送并接收以一些不一样形式的数据,提供现有消息格式的一些级别的兼容性。
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准 高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准,为面向消息的中间件设计,兼容 JMS。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不一样的开发语言等条件的限制。
RabbitMQ 就是基于 AMQP 协议实现的。
对比方向 | JMS | AMQP |
---|---|---|
定义 | Java API | 协议 |
跨语言 | 否 | 是 |
跨平台 | 否 | 是 |
支持消息类型 | 提供两种消息模型:①Peer-2-Peer;②Pub/sub | 提供了五种消息模型:①direct exchange;②fanout exchange;③topic change;④headers exchange;⑤system exchange。本质来说,后四种和JMS的pub/sub模型没有太大差异,仅是在路由机制上作了更详细的划分; |
支持消息类型 | 支持多种消息类型 ,咱们在上面提到过 | byte[](二进制) |
总结:
对比方向 | 概要 |
---|---|
吞吐量 | 万级的 ActiveMQ 和 RabbitMQ 的吞吐量(ActiveMQ 的性能最差)要比 十万级甚至是百万级的 RocketMQ 和 Kafka 低一个数量级。 |
可用性 | 均可以实现高可用。ActiveMQ 和 RabbitMQ 都是基于主从架构实现高可用性。RocketMQ 基于分布式架构。 kafka 也是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会致使不可用 |
时效性 | RabbitMQ 基于erlang开发,因此并发能力很强,性能极其好,延时很低,达到微秒级。其余三个都是 ms 级。 |
功能支持 | 除了 Kafka,其余三个功能都较为完备。 Kafka 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准 |
消息丢失 | ActiveMQ 和 RabbitMQ 丢失的可能性很是低, RocketMQ 和 Kafka 理论上不会丢失。 |
总结: