RabbitMQ入门到实战——高级篇

这篇具有很好参考价值的文章主要介绍了RabbitMQ入门到实战——高级篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

消息的可靠性

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

 生产者的可靠性(确保消息一定到达MQ)

生产者重连

这⾥除了enabled是false外,其他 initial-interval 等默认都是⼀样的值。

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

生产者确认 

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

生产者确认代码实现

application中增加配置:(publisher-returns ⼀般不⽤配置)

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

 2. 在RabbitTemplate中设置回调函数 ReturnCallback ,在Rabbit发送信息失败时触发(如果开了 publisher-returns)

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

3. 在发送信息的RabbitTemplate 中指定 ConfirmCallback

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

总结:

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

设置⽇志级别

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

面试题:如何保证⽣产者发送消息的可靠性

⾸先,可以在Rabbit MQ中配置适量次数的⽣产者重试,重试时间等重连机制,避免⽹络波动影响 然后,如果是其他原因导致失败,Rabbit MQ也提供了接受信息后的回执,可以设置回调函数来保 证⽣产者接受信息。基本保证可靠性。 但是,由于MQ回调需要消耗额外的资源,如果不是对消息可靠性有较⾼要求,最好不要开启。(这里在P21测试中印证了,发100w条信息,半天才发40w条。关闭后显著提升速度) 

MQ的可靠性

问题:MQ出现故障,如宕机重启,消息会丢失。内存有限,MQ会阻塞

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

数据持久化durable

控制台页面:

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

Java代码实现(默认持久化)

paged out:当内存被占满,部分消息转移到磁盘,MQ阻塞不能访问的状态

非持久化:(优先写⼊内存)

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式 RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

持久化(直接写入磁盘 - 注意:这种模式下也会预先写⼀些信息到内存中保障安全性) 

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

Lazy queue

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

创建: ①⽤Bean创建

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

②基于注解

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

③控制台

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

总结(RabbitMQ如何保证消息可靠性)

  • 交换机、队列、发送的信息持久化
  • 使⽤LazyQueue(⾃动将所有消息持久化)

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

消费者可靠性

消费者确认

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

失败重试机制 

 重试策略

消费者确认问题:如果是业务异常,自动返回nack,程序会不断重试,不断抛异常。浪费资源
解决:设置重试策略,设定重试参数,重试多几次 

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

效果:重试三次后依然失败,将消息reject丢掉。

失败消息处理策略

问题:重试次数耗尽后,直接丢掉,处理草率

使⽤MessageRecoverer接⼝处理,以下是三种实现方式:

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

代码实现:

1.配置开启重试机制

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

2.定义接收失败消息的交换机、队列及其绑定关系

3.定义RepublishMessageRecoverer实现类

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

 总结

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

投递给异常交换机,需要实现 RepublishMessageRecoverer

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

业务幂等性

使⽤了MQ,不可避免的会有消息重复现象。就会导致消费者重复消费。要使非幂等业务转变为幂等。

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式 ⽅案1:给消息设置唯⼀id。如:类似token保证表单不重复提交。

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

 RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

缺点: 1. 业务增多。保存到数据库,判断id是否重复
2. 影响性能。涉及数据库操作(写、判断) 

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式 还可以基于乐观锁优化,避免线程并步运⾏:

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

面试题:微服务中的支付服务和交易服务如何保持订单状态⼀致? 

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

扩展:
为什么选择异步?同步异步(同步调用的问题),聊聊优化的时间。
生产者可靠性等等具体实现(也可突出自己用雪花,而不是默认的uuid)
幂等性判断如何实现?常见幂等方案有哪些
基于之前交易服务⼀直处于被动,再用个定时任务化为主动,定期查询支付状态 

消息过期机制

可以给每条消息指定一个有效期,一段时间内未被消费者处理,就过期了。这种机制允许系统自动清理和丢弃那些长时间未被消费的消息,以避免消息队列中积累过多的过期消息,从而保持系统的效率和可靠性。

例如:消费者(库存系统)挂了,一个订单 15 分钟还没被库存系统处理,这个订单其实已经失效了,哪怕库存系统再恢复,其实也不用扣减库存。
适用场景:清理过期数据、模拟延迟队列的实现(不开会员就慢速)、专门让某个程序处理过期请求。

延迟消息

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

例如:会员/非会员:会员用户,我们希望立即处理其请求;而对于普通用户,我们希望让其排队等待一段时间(比如5分钟)后再进行处理。这时,可以利用延迟队列实现。消费者可以监听延迟队列,普通用户的请求由一个程序处理监听该延迟队列,而会员用户的请求则由另一个程序监听一个高优先级的队列。一旦你掌握了消息队列的知识,就可以实现这样的程序逻辑。延迟队列的实现可以借助消息过期机制。具体的实现思路是创建两个队列,第一个队列中的消息设置了过期时间,比如5分钟,然后将过期的消息转移到第二个队列中。接着,让相应的用户程序监听第二个队列,这样第二个队列就成为了延迟队列。 

死信

通过将设置消息过期时间,并令其过期达到延迟发送。

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

问题:死信交换机本身不是做延迟消息,需要等时间过期才能实现延迟消息

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

 RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

取消超时订单的基本思路

问题:每创建⼀个订单,队列都有⼀个30min延迟消息,MQ压⼒过大
解决:将30min切开,进行分段检查

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

 代码实现:

在订单业务的最后拓展代码:
1. 定义延迟消息体与延迟常量
        a. 延迟消息体

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

b. 延迟常量(交换机 - topic,队列,Key)

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

2. 发送信息

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

优化:每次都要new⼀个类,并配置。可以单独提取出来,new⼀个类

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

监听延迟信息

定义监听器:构造注⼊orderService,注解中开启延迟信息,传参为延迟消息体

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

5 与 6 应该为分布式事务,需要写在 OrderService 中,改动如下:

 RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

RabbitMQ入门到实战——高级篇,中间件,rabbitmq,分布式

参考:MQ高级-15.延迟消息-监听延迟消息_哔哩哔哩_bilibili 文章来源地址https://www.toymoban.com/news/detail-802781.html

到了这里,关于RabbitMQ入门到实战——高级篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 消息中间件RabbitMQ详解

    消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。 消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中

    2024年02月16日
    浏览(77)
  • 消息中间件之RabbitMQ

    1.基于AMQP协议Erlang语言开发的一款消息中间件,客户端语言支持比较多, 比如Python,Java,Ruby,PHP,JS,Swift.运维简单,灵活路由,但是性能不高, 可以满足一般场景下的业务需要,三高场景下吞吐量不高,消息持久化没有采取 零拷贝技术,消息堆积时,性能会下降 2.消息吞吐量在

    2024年01月19日
    浏览(84)
  • 【RabbitMQ教程】前言 —— 中间件介绍

                                                                       💧 【 R a b b i t M Q 教程】前言——中间件介绍 color{#FF1493}{【RabbitMQ教程】前言 —— 中间件介绍} 【 R abbi tMQ 教程】前言 —— 中间件介绍 💧           🌷 仰望天空,妳

    2024年02月08日
    浏览(69)
  • 中间件RabbitMQ消息队列介绍

    1.1 什么是 MQ MQ ( message queue ),从字面意思上看,本质是个队列, FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中, MQ 是一种非常常 见的上下游 逻辑解耦+物理解耦 的消息通信服务。使用了 MQ 之

    2024年02月13日
    浏览(65)
  • RabbitMQ 消息中间件 消息队列

    RabbitMQ 1、RabbitMQ简介 RabbiMQ是⽤Erang开发的,集群⾮常⽅便,因为Erlang天⽣就是⼀⻔分布式语⾔,但其本身并 不⽀持负载均衡。支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 2、RabbitMQ 特点 可

    2024年02月03日
    浏览(65)
  • 高性能消息中间件 RabbitMQ

    消息队列 MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的 异步通信 。 同步通信相当于两个人当面对话,你一言我一语。必须及时回复: 异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系。 消息

    2024年02月11日
    浏览(104)
  • Springboot整合RabbitMQ消息中间件

    spring-boot-rabbitmq–消息中间件整合 前言:RabbitMQ的各种交换机说明 1、直连交换机 生产者发布消息时必须带着routing-key,队列绑定到交换机时必须指定binding-key ,且routing-key和binding-key必须完全相同,如此才能将消息路由到队列中 直连交换机通常用来循环分发任务给多个workers,

    2024年02月11日
    浏览(44)
  • 消息队列中间件(二)- RabbitMQ(一)

    接收,存储,转发消息 生产者 交换机 队列 消费者 简单模式 工作模式 发布 路由模式 主题模式 发布订阅模式 Broker 接收和分发消息的应用 Virtual host 虚拟分组 Connection: TCP连接 Channel: 节省连接,每次访问建立一次Connection消耗太大,所以使用信道代替连接 交换机 队列 www.r

    2024年02月11日
    浏览(65)
  • 中间件_RabbitMQ五种消息模型

    RabbitMQ官方文档 RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。 简单消息队列官方文档 1、创建简单消息队列 2、导入依赖 3、编写生产者测试类SpringAmqpTest,并利用 RabbitTemplate 实现消息发送 4、编写消费者,监听队列消息

    2024年02月06日
    浏览(41)
  • RabbitMQ系列教程消息中间件技术精讲

    作者:禅与计算机程序设计艺术 消息中间件(Message Queue,MQ)是一种分布式应用间通信的组件。它可以在不同的系统之间传递消息、数据或指令。在现代IT架构中,越来越多的应用需要相互通信,所以出现了消息队列的概念。RabbitMQ是一个开源的AMQP实现,是一个可靠、可扩展

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包