RabbitMQ消息队列

本文深入探讨RabbitMQ,包括其核心组件、高级特性如确认模式、回退模式、TTL、死信队列和延迟队列。并详细阐述了确保消息100%可靠传输的策略,涉及消息补充机制、乐观锁实现幂等性处理。同时介绍了消息成为死信的三种情况和延迟队列的模拟实现。
摘要由CSDN通过智能技术生成

MQ:
消息队列(Message Queue),由消息系统来确保消息传递的可靠性
作用:异步处理,解耦合,削峰填谷
AMQP:
Advanced Message Queuing Protocol,高级消息队列协议它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
JMS:
Java 消息服务(Java Message Service) 应用程序接口是一个 Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Erlang:
最初用于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能非常优秀(Erlang有着和原生Socket一样的延迟)。

RabbitMQ:
提供了6种模式:简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程调用,不太算MQ;暂不作介绍);
在这里插入图片描述

RabbitMQ各组件功能:
在这里插入图片描述

Broker:标识消息队列服务器实体.
Virtual Host:虚拟主机。标识一批交换机、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在链接时指定,RabbitMQ默认的vhost是 /。
Exchange:交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
Banding:绑定,用于消息队列和交换机之间的关联。一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
Channel:信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟链接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说,建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。
Connection:网络连接,比如一个TCP连接。
Publisher:消息的生产者,也是一个向交换器发布消息的客户端应用程序。
Consumer:消息的消费者,表示一个从一个消息队列中取得消息的客户端应用程序。
Message:消息,消息是不具名的,它是由消息头和消息体组成。消息体是不透明的,而消息头则是由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(优先级)、delivery-mode(消息可能需要持久性存储[消息的路由模式])等。

RabbitMQ高级特性:
rabbitmq 整个消息投递的路径为:
producer —> rabbitmq broker —> exchange —> queue —> consumer
消息从 producer 到 exchange 则会返回一个 confirmCallback 。
消息从 exchange 到 queue 投递失败则会返回一个 returnCallback 。
1、confirm确认模式:

  1. 确认模式开启:ConnectionFactory中开启publisher-confirms=“true”
  2. 在rabbitTemplate定义ConfirmCallBack回调函数
    2、Return回退模式:
  3. 开启回退模式:publisher-returns=“true”
  4. 设置ReturnCallBack
  5. 设置Exchange处理消息的模式:
  6. 如果消息没有路由到Queue,则丢弃消息(默认)
  7. 如果消息没有路由到Queue,返回给消息发送方ReturnCallBack
    3、TTL:
    TTL 全称 Time To Live(存活时间/过期时间)。当消息到达存活时间后,还没有被消费,会被自动清除。RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。
    4、死信队列(DLX):
    当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。
    在这里插入图片描述

消息成为死信的三种情况:
队列消息长度到达限制;
消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false;
原队列存在消息过期设置,消息到达超时时间未被消费;

5、延迟队列:
延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。
在rabbitMQ中未提供延迟队列的功能,可以通过TTL+死信队列完成此项功能
在这里插入图片描述

RabbitMQ应用问题
1、消息可靠性保障
提出需求:如何能够保证消息的 100% 发送成功?
首先大家要明确任何一个系统都不能保证消息的 100% 投递成功,我们是可以保证消息以最高最可靠的发送给目标方。
在RabbitMQ中采用 消息补充机制 来保证消息的可靠性
在这里插入图片描述

步骤分析:
参与部分:消息生产者、消息消费者、数据库、三个队列(Q1、Q2、Q3)、交换机、回调检查服务、定时检查服务
消息的生产者将业务数据存到数据库中
发送消息给 队列Q1
消息的生产者等待一定的时间后,在发送一个延迟消息给队列 Q3
消息的消费方监听 Q1 队列消息,成功接收后
消息的消费方会 发送 一条确认消息给 队列Q2
回调检查服务监听 队列Q2 发送的确认消息
回调检查服务接收到确认消息后,将消息写入到 消息的数据库表中
回调检查服务同时也会监听 队列Q3延迟消息, 如果接收到消息会和数据库比对消息的唯一标识
如果发现没有接收到确认消息,那么回调检查服务就会远程调用 消息生产者,重新发送消息
重新执行 2-7 步骤,保证消息的可靠性传输
如果发送消息和延迟消息都出现异常,定时检查服务会监控 消息库中的消息数据,如果发现不一致的消息然后远程调用消息的生产者重新发送消息。
2、消息幂等性处理
幂等性指一次和多次请求某一个资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
在MQ中指,消费多条相同的消息,得到与消费该消息一次相同的结果。
在本教程中使用 乐观锁机制 保证消息的幂等操作
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyyn_未来可期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值