妙博客

主机评测 香港服务器 洛杉矶VPS测评

RabbitMQ认识

一、什么是消息队列

消息队列(Message Queue):是一种应用于在应用程序之间同步或者一步传递消息的通信方式

消息(Message):是指在应用中传递的数据

队列(Queue):一个先进先出的数据结构,用来存储数据


二、队列有哪些应用场景

(1)应用解耦

1684367570534.png

订单系统不直接操作物流系统,而是通过MQ中间键,让物流系统接受消息生成物流信息。

(2)提高容错

传统模式,如果下单时库存系统异常,直接返回报错。

引入MQ后,下单后不报错直接返回,等到库存系统恢复后,库存系统再去消费执行

(3)提高接口响应速度

image.png

引入MQ后,用户注册完并不等待发送邮件或者短信通知,而是直接返回,然后异步执行,大大提高响应速度。

(4)流量消峰

image.png

如果突然流量暴涨,传统模式中,很可能导致整个系统不可用,服务宕机。引入MQ后,仅仅是用户多等待一会,并不会造成系统宕机等严重后果。


三、消息队列难点

(1)如何保证消息队列的顺序性

  1. 生产者有序的情况下,用单线程消费来保证消息的顺序性

  2. 生产者无序的情况下,对消息编号,消费者处理时根据编号判断顺序。多个消费者可以考虑增加分布式锁

(2)如果保证消息不被重复消费,如何保证多次操作下得到的结果是一样的(幂等性)

  1. 生产者发送每条数据的时候,里面添加一个全局唯一的id,消费者消费到消息后,先根据消息id去redis中查询,如果redis不存在,就处理消息,然后将消息id写入redis。如果redis中存在,说明消息已经消费过,就不用处理。

  2. 基于数据库的唯一键,保证重复数据不会重复插入。因为有唯一键约束,所以重复数据只会插入报错,不会导致数据库中出现脏数据。

(3)如何保证消息不丢失

保证消息不丢失我们应该从以下方面来分析,以rabbitmq为例:

  1. 生产者丢失消息

    丢失原因: 发送消息过程中出现网络问题: producer以为发送成功,但RabbitMQ server没有收到

    解决方案: 发送方确认机制,在生产者端开启comfirm确认模式,你每次写的消息都会分配一个唯一的id,然后如果写入了RabbitMQ中,RabbitMQ会给你回传一个ack消息,告诉你说这个消息ok了

  2. 队列丢失消息

    丢失原因: 暂存内存中,还没消费,自己挂掉,数据会都丢失

    解决方案:

    1) MQ设置为持久化。将内存数据持久化到磁盘中;

    2) 开启镜像队列

    3) 持久化到磁盘中也并不能保证100%不丢失数据,可能在写入磁盘过程中宕机;这时候可以开启生产者开启confirm确认模式


四、消息队列结构

image.png

Producer∶ 生产者-投递消息的一方

生产者创建消息,然后发布到 RabbitMQ 中。消息一般可以包含 2 个部分:

1.消息体,消息体也可以称之为 payload,在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个 JSON 字符串。当然可以进一步对这个消息体进行序列化操作

2.标签(Label),用来表述这条消息,比如一个交换器的名称和一个路由键。生产者把消息交由RabbitMO, RabbitMQ 之后会根据标签把消息发送给感兴趣的消费者(Consumer)。


Consumer∶ 消费者-接收消息的一方

消费者连接到 RabbitMQ 服务器,订阅到队列。消费者消费一条消息时,只消费消息的消息体(payload)。在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者只会消费到消息体,也就不知道消息的生产者是谁,当然消费者也不需要知道。


Broker∶ 消息中间件的服务节点

一个RabbitMQ Broker 可以看作一个 RabbitMQ 服务节点,或RabbitMQ服务实例


Queue:队列:RabbitMQ 的内部对象,用于存储消息


Exchange∶ 交换器


RoutingKey∶ 路由键


Binding∶ 绑定


五、RabbitMQ交换机类型

(1)direct(直连交换机)

消息发送到此交换机上时,交换机会将此消息发送到RoutingKey和消息中RoutingKey完全匹配的的队列(如果匹配了多个队列,则每个队列都会收到相同的消息)。

(2)fanout(扇形交换机)

会将收到的消息全部发送给和自己绑定的队列(可以理解成少了一步匹配RoutingKey的步骤),所以它时所有交换机利速度最快的

(3)topic(主题交换机)

通过模式匹配分配消息,将 Routing Key 和某个模式进行匹配。

匹配规则如下

1- 【将routingkey通过"."来分为多个部分】

2- 【 “*”:代表一个部分】

2- 【“#”:代表0个或多个部分】

(4)headers(头部交换机)

它不通过RoutingKey进行分发消息,而时通过消息中内容的headers属性进行匹配,此外和direct交换机一致,但是性能差很多,几乎不用了。

消费方指定的heade中必须包含一个"x-match"的键。锻"x-match"的值有2个

1. x-match = all :表示所有的键值对都匹配才能接受到消息

2. x-match = any :表示只要有键值对匹配就能接受到消息


Copyright Your 142132.com Rights Reserved. 赣ICP备17010829号-2