RabbitMq (一)理论篇部分 MQ作用是什么 MQ的优缺点 RabbitMQ的基础架构 RabbitMQ 五种常用工作模式 RabbitMQ消息确认机制
Posted T_Antry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMq (一)理论篇部分 MQ作用是什么 MQ的优缺点 RabbitMQ的基础架构 RabbitMQ 五种常用工作模式 RabbitMQ消息确认机制相关的知识,希望对你有一定的参考价值。
本次的内容是rabbitmq,写这个专题的目的是为了更好的巩固和自我总结,因为暂时工作中是用不到的,所以也是希望自己下次在使用时,也能够借助文章轻松回顾,更快地着手应用。因为个人是第一次提及mq相关的内容,因此也会简单地介绍mq的相关特点。
如果理论部分,你比较清楚了,就想知道怎么快速跑起来,那么看这里吧RabbitMQ(二)实践篇 动手理解RabbitMQ五种模式
一、MQ的基本概念
1.1概述
Message Queue(消息队列),是在消息的传输过程中保存消息的容器(中间件)。
其过程是A系统只管将需要其他系统例如B系统处理的请求发到MQ中
B系统也只管去MQ中寻找需要自己处理的请求
这样做的好处
1.2削峰填谷
服务器同时处理请求的数量是有限的,如果cpu超负荷,服务宕机后果严重。此时把请求放到队列中等待,达到削峰的目的。波峰过后渐渐处理滞留的请求,达到提升系统稳定性的目的。
1.3异步提速
一个订单完成下单,需要处理库存,支付,物流,加起来需要九百多毫秒。把任务拆分完分给不同的系统处理,就可以大大减少时间。单位时间内就可以处理更多的数目。
有优点,自然也会带来缺点,老天总是公平的
1.4MQ的劣势
- 系统可用性降低
系统看似解耦了,但是各个系统都和MQ手拉手。MQ一旦宕机,大家都跑不动了。 - 系统复杂度提高
MQ的加入大大增加了系统的复杂度,因为引入了MQ后是异步调用,就有顺序,数据丢失等问题需要解决。
二、RabbitMQ
2.1简介
- 基于AMQP网络协议的消息中间件(Adcanced Message Queuing Protocol高级消息队列协议)
- RabbitMQ是采用Erlang语言开发的(Erlang语言是由Ericson设计,专门为高并发和分布式系统的一种语言)
2.2基础架构
通过一张图了解rabbitMQ的大体架构
- server内部有很多个虚拟机。
- 外部生产者(Producer)都是连接(connect)到指定虚拟机的指定交换机。
- 外部消费者(Consumer)都是连接到指定虚拟机的指定队列中。
- 交换机(Exchange)和队列(Queue)都有绑定关系
RabbitMQ中的相关概念: - Broker : 接收和分发消息的应用,RabbitMQ Server就是 Message Broker
我特地百度翻译了一下Broker
- Virtual host : 出于多租户的安全因素设计的, 当多个不同的用户使用同一个MQ server提供服务时,可以花费出多个虚拟机,每个用户在自己的虚拟机创建交换机等。就像mysql可以创建不同的数据库一样,每个库都有自己的表。
- Connection :消费者/提供者和broker之间建立的TCP连接
- Channel :如果每次访问Broker,都建立一次连接,在消息量大的时候建立TCP Connection的开销僵尸巨大的,效率也很低。Channel是connection内部建立的逻辑连接,多线程应用通常每个thread创建单独的channel进行通讯。AMQP method 包含了 channel id 帮助客户端和message broker识别channel,所以channel之间也是完全隔离的。channel作为轻量级连接,极大减少了操作系统建立TCP连接的开销。
- Exchange:message到达exchange,根据分发规则,匹配查询表中的routing key,分发到queue中去,常用的类型有direct(point-to-point),topic(publish-subscribe)和fanout(multicast)
- Queue:消息在这里等待被取走
- Binding:exchange和queue之间的虚拟连接,bingding中可以包含routing key。Binding信息被保存到exchange中的查询表。
2.3 五种常用工作模式
(一)简单模式
P:生产者C:消费者 queue:图中红色部分,生产者向其投递消息,消费者从中取出消息
(二)Work Queues工作队列模式
与简单模式相似,多了一个或多个消费者,多个消费者共同消费同一个队列中的消息
(三)发布与订阅模式
这里出现了交换机的概念,前面两种模式不是没有交换机,只是使用了默认交换机
交换机:
- 接收生产者发送的消息
- 投递给对应的队列
交换机一共有三种类型:
- fanout:广播,将消息缴费所有绑定到交换机的队列
- Direct:定向,把消息交给符合指定routing key的队列
- Topic:通配符,把消息交给符合routing pattern(路由模式)的队列
- 注意,交换机只负责转发,不负责存储,如果没有找到要发送的队列,那么消息会丢失
(四)路由模式
- 队列越交换机的绑定,不是任意绑定,要指定一个RoutingKey(路由Key)
- 消息发送给交换机,也必须指定消息的RoutingKey
- 交换机不会交给每一个绑定的队列,二十根据RoutingKey判断,只有队列的RoutingKey和消息的RoutingKey完全一致,才会接收到消息
(五)通配符模式
- Topic类型与Direct相比,都是通过RoutingKey把消息路由到不同的队列,只不过Topic类型Exchange可以让队列在绑定Routing key的时候使用通配符!
- RoutingKey一般是有一个或多个单词组成,用“.”分割。
- 通配符规则:#匹配一个或多个词,*匹配恰好一个词
例如:
- 红色Queue:绑定的是usa.#,因此以usa.开头的routing key 都会被匹配到
- 黄色Queue:绑定的是#.news,因此凡是以.news结尾的routing key 都会被匹配到
2.4 RabbitMQ消息确认机制
RabbitMQ在消息传递的过程中,充当了代理人(Broker)的角色,那生产者(Producer)怎样知道消息被正确投递了呢?
- RabbitMQ提供了监听器(Lisener)来接收消息投递的状态。
- 消息确认有两种状态:Confirm和Return
- Comfirm代表生产者将消息送到Broker时产生的状态,后续会出现两种情况
- ack 代表Broker已经将数据接收
- nack 代表Broker拒收消息。
- Return代表被Broker正常接收(ack)后,但Broker没有对应的队列进行投递时产生的状态,消息被退回给生产者
- 这两种状态只是生产者和Broker之间的关系,与是否消费无关
下一章
以上是关于RabbitMq (一)理论篇部分 MQ作用是什么 MQ的优缺点 RabbitMQ的基础架构 RabbitMQ 五种常用工作模式 RabbitMQ消息确认机制的主要内容,如果未能解决你的问题,请参考以下文章