RabbitMQ快速入门

1.什么是MQ

消息总线(Message Queue),是一种跨进程,异步的通讯机制,用于上下游传递消息。由消息系统来确保消息的可靠性。

2.RabbitMQ是干什么用

用于异步处理、解耦、流量削峰、错峰控流、数据分发、日志收集等。。。

3.RabbitMQ衡量标准

服务性能、数据存储,集群架构

4.RabbitMQ特点

1.开源、性能优秀、稳定性保障

2.提供可靠性消息投递模式,返回模式

3.与Spring AMQP完美整合,API丰富

4.集群模式丰富、表达式配置、HA模式、镜像队列模型

5.保证数据不丢失的前提下做到高可靠性、高可用性

5.RabbitMQ优势

1.可靠性:比如持久化、传输确认、发布确认

2.灵活的路由:消息进入队列之前,通过Exchange来路由消息

3.消息集群:多个RabbirMQ服务器可以组成一个集群,形成一个逻辑Broker

4.高可用:队列可以在集群中的机器上进行镜像,使得在部分节点出现问题的情况下队列仍然可以使用

5.多种协议:支持多种消息队列协议,如STOMP、MQTT等

6.多种语言客户端:几乎支持所有常用的语言,如:java、.NET、等

7.管理界面:提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面

8.跟踪机制:如果消息异常,RabbitMQ提供了消息的跟踪机制,开发者可以找出发生了什么

9.插件机制:提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件

6.AMQP(高级消息队列协议)

Rabbitmq是实现AMQP的消息中间件的一种,主要是为了实现系统之间的双向解耦而实现的。当生产者大量生产数据时,消费者无法快速消费,那么就需要一个中间层,保存这个数据。

主要特征是面向消息、队列、路由、可靠性、安全

7.RabbitMQ各组件功能

Broker:标识消息队列服务器实体

Virtual Host:虚拟主机,标识一批交换机、消息队列和相关的对象。每个vhost本质就是迷你版的RabbitMQ服务 器,vhost是AMQP概念的基础

Exchange:交换器,用来接收生产者发送的消息并将消息路由给服务器中的队列

Queue:消息队列,用来保存消息知道发送给消费者。

Banding:绑定,用于消息队列和交换器之间的关联

Channel:通道,消息读写等操作在通道中进行,客户端可以建立多个通道,没饿通道代表一个会话

Connection:网络连接,应用程序和Server的网络连接,TCP连接

Publisher:消息的生产者

Consumer:消息的消费者

Message:消息,是由消息头和消息体组成。

8.常用Exchange

RabbitMQ常用交换器类型有:direct、topic、fanout、headers四种

1.direct:该类型的交换器将所有发送到该交换器的消息转发到RoutingKey指定的队列中,也就是说路由到 BindingKey或RoutingKey完全匹配的队列中

2.topic:该类型交换器将所有发送到Topic Exchange的消息转发到所有RoutingKey指定的Topic的队列上。

Exchange将RoutingKey和某个Topic进行模糊匹配,其中【米】用于匹配一个词,【#】用于匹配一个或多个词。例如【com.#】能匹配到【com.rabbit.mq】和【com.rabbit】,而【com.米】只能匹配到【com.rabbit】

3.fanout:该类型交换器不处理路由建,会把所有发送到交换器的消息路由到所有绑定的队列中。优点是转发消 息最快,性能最好。

4.headers:该交换器不依赖于路由规则来路由消息,而是根据消息内容中的headers属性进行匹配,性能差,实 际中不常用。

9.TTL

TTL:生存时间,RabbitMQ支持消息的过期时间,一共两种。

  1. 在消息发送时可以进行指定。通过配置消息体的properties,可以指定当前消息的过期时间

  2. 在创建Exchange时可进行指定。从进入消息队列开始计算,只要超过了队列的超时时间配置,那么消息会自动清除。

10.死信队列DLX

死信队列DLX:利用DLX,当消息在一个队列中变成死信(dead message)之后,它能被重新publish到另一个 Exchange,这个Exchange就是DLX。

DLX也是一个正常的Exchange,和一般的Exchange没有区别,它能在任何队列上被指定,实际上就是设置了某个队列的属性。

当这个队列有死信时,RabbieMQ会自动将这个消息重新发布到设置的Exchange上,进而被路由到另一个队列。

11.消息变成死信的几种情况

1.消息被拒绝并且requeue等于false

2.消息TTL过期

3.队列达到最大长度

12.死信队列设置

需要设置死信队列的Exchange和Queue,然后通过RoutingKey进行绑定

只需要监听该死信队列即可处理死信消息,还可以通过死信队列完成延时队列

13.如何保证幂等性

消费端实现幂等性,就意味着我们的消息永远不会消费多次,即使我们收到了多条一样的信息。

  1. 唯一ID+指纹码机制,利用数据库主键去重

  2. 利用redis的原子性去实现

14.消费端限流(流量削峰)

当海量消息瞬间推送过来,单个客户端无法同时处理那么多数据,严重会导致系统宕机。这时,需要削峰。

RabbitMQ提供了一种qos(服务质量保证)功能。即在非自动确认消息的前提下(非ACK),如果一定数目的消息(通过基于consume或者channel设置qos的值)未被确认前,不进行消费新的消息。

posted @ 2020-08-20 10:59  comliang  阅读(207)  评论(0)    收藏  举报