消息中间件利用进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在。(来自百度百科)
如果大家对怎么选型感兴趣,可以看一下小编的这篇文章:四大MQ选型
Linux安装Docker
小编觉得在说概念之前,应该知道他的作用,然后再系统的学习概念等!
RabbitMQ作用
异步处理
应用解耦
流量控制
下面我们进行一个个的简单描述一下哈,我们还是拿被用了一万次的例子和图例哈!
1. 异步处理
我们看到这样非常的耗时,其实保存完成后,就可以登录了,短信和邮件过一会接收也是没有什么问题的!或者发送失败,用户一直没有收到,这都是没什么问题的,用户已经登录进去了,管你发不发短信,大家说对吧!
我们可以在将注册信息保存数据库之后,把要发送注册邮件和发送短信的消息写入消息队列,然后就告知用户注册成功。发送邮件和短信将由订阅了消息的应用异步的去执行。这样耗时的问题就解决了!
2. 应用解耦
但是也存在问题,如果库存系统挂了,这样就会导致下单失败;如果你是用户,你会判断这个产品不行,以后不用了!
别着急,小编来和你说一下哈!刚刚出错的原因就是库存系统挂了,改处理的请求没有处理,所以下单失败;我们引入消息队列,就是把订单消息写入到消息队列中,然后库存系统订阅我们的消息队列;然后库存系统去消息队列中获取消息,进行处理订单,来完成减库存的操作;如果失败也会有,真的挂了,也可以,等到库存系统活了之后继续处理!一个宗旨,不能影响用户的使用体验呢!
3. 流量控制
假设一瓶茅台2万人抢,这是我们的系统可能会被打垮。所以我们把超过一定时,把超过的请求放在消息队列中,然后,然后慢慢处理;虽然可能降低一下用户的体验,但是秒杀就是这样,只能有一部分人成功,我们要保证好系统可以正常运行哈!
RabbitMQ概念
1. RabbitMQ简介
RabbitMQ 是部署最广泛的开源消息代理。
RabbitMQ拥有数万用户,是最流行的开源消息代理之一。从T-Mobile到Runtastic,RabbitMQ在世界各地的小型初创公司和大型企业中使用。
RabbitMQ是轻量级的,易于在本地和云中部署。它支持多种消息传递协议。RabbitMQ可以在分布式和联合配置中部署,以满足高规模、高可用性需求。
RabbitMQ运行在许多操作系统和云环境上,并为最流行的语言提供了广泛的开发工具。
2. 核心概念
Message
消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,
这些属性包括(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可
能需要持久性存储)等。
Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。
Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
Exchange有4种类型:direct(默认),fanout, topic, 和headers,不同类型的Exchange转发消息的策略有所区别Queue
消息队列,用来保存消息直到发送给消费者。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
Connection
网络连接,比如一个TCP连接。
Channel
信道,多路复用连接中的一条独立的。信道是建立在真实的TCP连接内的虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
类似docker容器和容器之间是相互隔离的,一个坏了,不耽误另一个使用
Broker
表示消息队列服务器实体。
总架构图
JMS与AMQP比较
JMS(Java Message Service) | AMQP(Advanced Message Queuing Protocol) | |
---|---|---|
定义 | Java api | 网络线级协议 |
跨语言 | 否 | 是 |
跨平台 | 否 | 是 |
Model | 提供两种消息模型: (1)、Peer-2-Peer (2)、Pub/sub |
提供了五种消息模型: (1)、direct exchange (2)、fanout exchange (3)、topic change (4)、headers exchange (5)、system exchange 本质来讲,后四种和JMS的pub/sub模型没有太大差别, 仅是在路由机制上做了更详细的划分; |
支持消息类 型 |
多种消息类型: TextMessage MapMessage BytesMessage StreamMessage ObjectMessage Message (只有消息头和属性) |
byte[] 当实际应用时,有复杂的消息,可以将消息序列化后发 送。 |
实现中间件 | ActiveMQ、HornetMQ | RabbitMQ |
综合评价 | JMS 定义了JAVA API层面的标准;在java体系中, 多个client均可以通过JMS进行交互,不需要应用修 改代码,但是其对跨平台的支持较差; |
AMQP定义了wire-level层的协议标准;天然具有跨平 台、跨语言特性 |