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(二)实践篇 动手理解RabbitMQ五种模式

以上是关于RabbitMq (一)理论篇部分 MQ作用是什么 MQ的优缺点 RabbitMQ的基础架构 RabbitMQ 五种常用工作模式 RabbitMQ消息确认机制的主要内容,如果未能解决你的问题,请参考以下文章

微服务实用篇4-消息队列MQ

绝对详细的 RabbitMQ 实践操作手册

RabbitMQ入门到精通(入门篇)

RabbitMQ---消息队列---上半部分

RabbitMQ 超详细入门篇

RabbitMQ 知识点总结