当前位置: 首页 > news >正文

【Fifty Project - D33】

连带着端午一起给自己放了一个小长假,返校的第一天开始了无尽的挨骂QAQ,一个小论文从上午讨论到下午,是真的一坨,也是真的不想写哇

今日完成记录

TimePlan完成情况
8:30 - 9:30RabbitMQ学习
9:30 - 11:00挨骂
13:30 - 14:30练胸
14:30 - 15:30继续挨骂
15:30 - 17:30RabbitMQ学习
19:00 - 20:30篮球
20:30 - 22:00羽毛球

RabbitMQ

粗略完成了初级篇,今天开始高级篇,主要是关于消息队列的可靠性部分

主要学习问题有两个:

  1. 如何保证MQ消息的可靠性
  2. 如果真的出现了消息发送失败,有没有其他的兜底方案

在讨论这两个问题之前,先分析一下在MQ发送消息到消费消息成功这个过程中,哪些环节可能出现丢失消息?
在这里插入图片描述
如上图,可能发生消息丢失的情况有:

  1. 生产者发送消息给交换机:
    • 连接MQ失败
    • 发送消息找不到交换机
    • 交换机接收但是找不到匹配的队列【路由失败】
    • 消息到达MQ后处理消息的进程发生异常
  2. MQ导致消息丢失:
    • 消息发送到队列后未被消费就宕机了
  3. 消费者处理消息时:
    • 消息接收后未处理就宕机
    • 消息接收后处理过程抛出异常

因此,我们应该在这三个方面保证MQ的可靠性:

  1. 确保生产者一定会将消息发送到MQ
  2. 确保MQ不会弄丢消息
  3. 确保消费者成功消费消息

生产者的可靠性

生产者重试机制

首先针对第一种场景:生产者发送消息时,由于网络导致的MQ连接中断
为了解决这个问题,SpringAMQP提供了消息发送的重试机制:当RabbitTemplate与MQ连接超时后,进行多次重试
修改application.yaml增加相关设置

spring:rabbitmq:connection-timeout: 1stemplate:retry:enabled: trueinitial-interval: 1000ms # 失败后的初始等待时间multiplier: 1 # 失败后下次的等待时长倍数 下次等待时间 = 上一次等待时间/initial-interval * multipliermax-attempts: 3 # 最大尝试重连次数

简单测试一下,首先停掉rabbitmq服务,模拟网络连接失败,然后启动测试脚本尝试发送消息,观察日志情况。

06-05 19:24:41:919  INFO 33216 --- [           main] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: [192.168.4.41:5672]
06-05 19:24:43:948  INFO 33216 --- [           main] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: [192.168.4.41:5672]
06-05 19:24:45:970  INFO 33216 --- [           main] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: [192.168.4.41:5672]

观察发现等待时间间隔是2s,并不是1s,实际上这是因为其他操作的一些耗时和计算开销。当设置初始间隔为2s,退避指数为2,最大等待时间为20s,发现等待时间变化是:3,5,9,11,21,21,21。每一项减去1刚好符合计算公式,所以这个1s应该就是一些其余的计算开销。

生产者确认机制

一般来说,生产者和MQ之间的网络通畅,基本不会出现消息丢失的情况,因此大多数情况不需要考虑这个问题,但是在少数情况下,也会出现消息发送到MQ后丢失的现象:

  1. MQ内部处理消息的进程异常
  2. 生产者发送消息到MQ后没找到exchange
  3. 发送到exchange后没找到queue,无法路由

因此设计了生产者确认机制,publisher confirm和publish return。

http://www.dtcms.com/a/232999.html

相关文章:

  • 仓库拉下ssm项目配置启动
  • ros2--图像/image
  • YOLO在C#中的完整训练、验证与部署方案
  • 数据分析后台设计指南:实战案例解析与5大设计要点总结
  • Java开发中复用公共SQL的方法
  • 测试W5500的第11步_使用ARP解析IP地址对应的MAC地址
  • Postgresql字符串操作函数
  • 【笔记】解决MSYS2安装后cargo-install-update.exe-System Error
  • 如果科技足够发达,是否还需要维持自然系统(例如生物多样性)中那种‘冗余’和‘多样性’,还是可以只保留最优解?
  • Android Settings 数据库生成、监听与默认值配置
  • Mysql锁及其分类
  • Linux下JSON序列化与反序列化方法
  • buuctf——web刷题第二页
  • 深入解析CI/CD开发流程
  • Elasticsearch最新入门教程
  • 【C++进阶篇】C++11新特性(中篇)
  • 【Python3教程】Python3基础篇之错误和异常
  • 【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
  • Go语言底层(三): sync 锁 与 对象池
  • 华为云CentOS配置在线yum源,连接公网后,逐步复制粘贴,看好自己对应的版本即可,【新手必看】
  • 【Zephyr 系列 9】Zephyr 与设备树机制详解:如何为你的板子编写 Devicetree
  • Linux系统编程-DAY10(TCP操作)
  • java32
  • python变量
  • 【Go语言基础】基本语法
  • Linux(12)——基础IO(下)
  • 优化学习笔记
  • Unity协程Coroutine与UniTask对比
  • TIA博途中的程序导出为PDF格式的具体方法示例
  • 2025年牛客网秋招/社招高质量 Java 面试八股文整理