RabbitMQ消息队列+死信队列实现延迟消息(不懂)

128 阅读4分钟

什么是MQ消息中间件

全称MessageQueue,主要是⽤于程序和程序直接通信,异步+解耦

应⽤场景

核⼼应⽤

解耦:订单系统-》物流系统

异步:⽤户注册-》发送邮件,初始化信息

削峰:秒杀、⽇志处理

image.png

RabbitMQ:

官⽹:www.rabbitmq.com/

⽂档:www.rabbitmq.com/getstarted.…

1.多数互联⽹公司⾥⾯⽤的技术栈,可以承载海量消息处理

2.在多数互联⽹公司中,RabbitMQ占有率很⾼,且全球都很流⾏

3.在分布式系统中存储转发消息,在易⽤性、扩展性、⾼可⽤性等⽅⾯表现强劲,API丰富易⽤

4.可以作为公司内部培训技术分享必备知识,可靠性投递、消费、⾼可⽤集群等

核⼼概念, 了解了这些概念,是使⽤好RabbitMQ的基础

image.png

Broker

RabbitMQ的服务端程序,可以认为⼀个mq节点就是⼀个broker

Producer⽣产者

创建消息Message,然后发布到RabbitMQ中

Consumer消费者:

消费队列⾥⾯的消息

Message 消息

⽣产消费的内容,有消息头和消息体,也包括多个属性配置,⽐如routingKey路由键

Queue 队列

是RabbitMQ 的内部对象,⽤于存储消息,消息都只能存储在队列中

1.多数互联⽹公司⾥⾯⽤的技术栈,可以承载海量消息处理

2.在多数互联⽹公司中,RabbitMQ占有率很⾼,且全球都很流⾏

3.在分布式系统中存储转发消息,在易⽤性、扩展性、⾼可⽤性等⽅⾯表现强劲,API丰富易⽤

4.可以作为公司内部培训技术分享必备知识,可靠性投递、消费、⾼可⽤集群等Channel 信道

⼀条⽀持多路复⽤的通道,独⽴的双向数据流通道,可以发布、订阅、接收消息。

信道是建⽴在真实的TCP连接内的虚拟连接,复⽤TCP连接的通道

Connection连接

是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑,⼀个连接上可以有多个channel进⾏

通信

Exchange 交换器

⽣产者将消息发送到 Exchange,交换器将消息路由到⼀个或者多个队列中,⾥⾯有多个类型,后续

再⼀⼀介绍,队列和交换机是多对多的关系。

RoutingKey 路由键

⽣产者将消息发给交换器的时候,⼀般会指定⼀个RoutingKey,⽤来指定这个消息的路由规则

最⼤⻓度255 字节

Binding 绑定

通过绑定将交换器与队列关联起来,在绑定的时候⼀般会指定⼀个绑定键 ( BindingKey ),这样

RabbitMQ 就知道如何正确地将消息路由到队列了

⽣产者将消息发送给交换器时,需要⼀个RoutingKey,当BindingKey和 RoutingKey相匹配时,消息会被路由

到对应的队列中

Virtual host 虚拟主机

⽤于不同业务模块的逻辑隔离,⼀个Virtual Host⾥⾯可以有若⼲个Exchange和Queue,同⼀个

VirtualHost ⾥⾯不能有相同名称的Exchange或Queue

默认是 /

/dev

/test

/pro

image.png

image.png

⾼性能消息队列RabbitMQ⾼级特性

TTL死信队列

什么是TTL

time to live 消息存活时间

如果消息在存活时间内未被消费,则会被发送到死信队列

RabbitMQ⽀持两种ttl设置

单独消息进⾏配置ttl

整个队列进⾏配置ttl(居多)

什么是rabbitmq的死信队列

没有被及时消费的消息存放的队列

什么是rabbitmq的死信交换机

Dead Letter Exchange(死信交换机,缩写:DLX)当消息成为死信后,会被重新发送到另⼀个交换

机,这个交换机就是DLX死信交换机。

image.png

消息有哪⼏种情况成为死信

消费者拒收消息(basic.reject/ basic.nack),并且没有重新⼊队 requeue=false

消息在队列中未被消费,且超过队列或者消息本身的过期时间TTL(time-to-live)

队列的消息⻓度达到极限

结果:消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列

基于Linux服务器安装RabbitMQ容器化部署

登录服务器

Docker安装RabbitMQ

地址:hub.docker.com/_/rabbitmq/

ssh -o ServerAliveInterval=60 root@120.25.3.72

#拉取镜像

docker pull rabbitmq:management

docker run -d --hostname rabbit_host1 --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin

-e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:3.8.9-

management

#介绍

-d 以守护进程⽅式在后台运⾏

-p 15672:15672 management 界⾯管理访问端⼝

-p 5672:5672 amqp 访问端⼝--name:指定容器名

--hostname:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts,作为容器主机IP的

别名,并且将显示在容器的bash中

-e 参数

RABBITMQ_DEFAULT_USER ⽤户名

RABBITMQ_DEFAULT_PASS 密码

image.png