rocket 如何解决消息堆积问题、如何消息丢失问题、r安全问题(设置密码)、时间复杂度。

news2024/11/16 13:32:15

20240803

  • 一、 如何解决消息堆积问题?
    • 一般认为单条队列消息差值>=10w时 算堆积问题
      • 生产太快了
      • 线程数量的设置
      • 挤压问题
    • 消费者消费出现问题
    • 如果堆积的消息不想要了,可以直接跳过堆积
  • 二、 信息丢失问题
    • 为什么会丢失
    • 解决思路1 记录下来
    • 解决思路2 使用rocketmq中的轨迹
    • 如何确保消息不丢失?(总结)
  • 三、安全
  • 四、时间复杂度

一、 如何解决消息堆积问题?

一般认为单条队列消息差值>=10w时 算堆积问题

一般认为单条队列消息差值>=10w时 算堆积问题

生产太快了

  1. 生产方可以做业务限流

  2. 增加消费者数量,但是消费者数量<=队列数量,适当的设置最大的消费线程数量(根据IO(2n)/CPU(n+1))

  3. 动态扩容队列数量,从而增加消费者数量

线程数量的设置

//  最大线程数写几个?   根据电脑来看,比如我现在是20个处理器,那么如果是IO密集型,那么我的线程数为2*n=40个
//  如果我是CPU密集型,那么我的线程数为n + 1 = 21个
/*    public ThreadPoolExecutor poolExecutor =  new ThreadPoolExecutor(
                10,
            Runtime.getRuntime().availableProcessors()*2,  //这个是获取核心线程数
            //  最大线程数写几个?   根据电脑来看,比如我现在是20个处理器,那么如果是IO密集型,那么我的线程数为2*n=40个
            //  如果我是CPU密集型,那么我的线程数为n + 1 = 21);*/

因为我们的mq一般都是增删改查,所以线程数一般设置为40(IO密集型)


所以:

/**
 * CLUSTERING 集群模式下,队列会被消费者分摊,队列数量>=消费者数量,消息的消费位点 mq服务器回记录处理,用的比较多
 * BROADCASTING 广播模式下,队列会被消费者全部消费(每个消费者都处理一次),mq服务器不会记录消费位点,也不会重试。
 */
@Component
@RocketMQMessageListener(topic = "modeTopic",
        consumerGroup = "mode-consumer-group-a",
        messageModel = MessageModel.CLUSTERING ,//集群模式 负载均衡
        consumeThreadNumber = 40 //线程数  因为我们的mq一般都是增删改查,所以线程数一般设置为40(IO密集型)
        //这个值不能写太大,不然cpu会频繁的做切换,导致性能下降
)
public class DC1 implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("我是mode-consumer-group-a组的第一个消费者"+message);
    }
}

挤压问题

生产者

      //积压问题
    @Test
    void jydelTest() throws Exception{
        for (int i=1;i<=10000;i++){
            Thread.sleep(500L);
            rocketMQTemplate.syncSend("jyTopic","我是第"+i+"个消息");
        }
    }

先不设置消费者,看可视化界面

首先是四个线程:
在这里插入图片描述
换到八线程
在这里插入图片描述
在这里插入图片描述
重平衡
在这里插入图片描述
停止程序,开始消费:(两份)

@Component
@RocketMQMessageListener(topic = "jyTopic",
consumerGroup = "jy-consumer-group",
consumeThreadNumber = 40,
consumeMode = ConsumeMode.CONCURRENTLY //并发消费
)

public class EJyListener1 implements RocketMQListener<String> {

    @Override
    public void onMessage(String message) {
        System.out.println("我是第一个消费者:"+message);
    }
}

在这里插入图片描述
恢复成4线程
在这里插入图片描述
缩容,重分配:可以看到把新增的删除了
在这里插入图片描述

消费者消费出现问题

排查消费者程序的问题

如果堆积的消息不想要了,可以直接跳过堆积

在这里插入图片描述

二、 信息丢失问题

为什么会丢失

在这里插入图片描述

解决思路1 记录下来

在这里插入图片描述

解决思路2 使用rocketmq中的轨迹

  1. 可以开启mq的trace机制,消息跟踪机制。在broker.conf中开启消息追踪

关闭的时候,不要kill -9 因为有可能里面还有很多数据在执行,可以直接 kill 这样会等里面的线程数据走完,才会关闭进程
在这里插入图片描述
配置(在最下面加入traceTopicEnable=true),重启broke.conf

然后在yml中配置:

rocketmq:
    name-server: 192.168.88.128:9876
    producer:
        group: boot-producer-group
        enable-msg-trace: true #开启发送方的消息轨迹

生产者:

//消息跟踪
    @Test
    void tranceTest() throws Exception{
            rocketMQTemplate.syncSend("traceTopic","我是消息");
    }

在这里插入图片描述
在这里插入图片描述
开始消费

    @Component
    @RocketMQMessageListener(topic = "traceTopic",
            consumerGroup = "trace-consumer-group",
            consumeThreadNumber = 40,
            consumeMode = ConsumeMode.CONCURRENTLY ,//并发消费
            enableMsgTrace = true//开启消费者方轨迹,一般不开,开了会影响性能
    )

    public class GTranceListener implements RocketMQListener<String> {

        @Override
        public void onMessage(String message) {

            System.out.println("我是消费者:"+message);
        }
    }



在这里插入图片描述

如何确保消息不丢失?(总结)

1. 生产者使用同步发送模式 ,收到mq的返回确认以后 顺便往自己的数据库里面写

msgId status(0) time

2. 消费者消费以后 修改数据这条消息的状态 = 1
3. 写一个定时任务 间隔两天去查询数据 如果有status = 0 and time < day-2
4. 将mq的刷盘机制设置为同步刷盘
5. 使用集群模式 ,搞主备模式,将消息持久化在不同的硬件上
6. 可以开启mq的trace机制,消息跟踪机制

 

1.在broker.conf中开启消息追踪

traceTopicEnable=true

2.重启broker即可

3.生产者配置文件开启消息轨迹

enable-msg-trace: true

1. 消费者开启消息轨迹功能,可以给单独的某一个消费者开启

enableMsgTrace = true

在rocketmq的面板中可以查看消息轨迹

默认会将消息轨迹的数据存在 RMQ_SYS_TRACE_TOPIC 主题里面

三、安全

  1. 开启acl的控制 在broker.conf中开启aclEnable=true
  2. 配置账号密码 修改plain_acl.yml
  3. 修改控制面板的配置文件 放开52/53行 把49行改为true 上传到服务器的jar包平级目录下即可

四、时间复杂度

速度排序: 数组>Hash>B+tree
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BulingBuling - 活法自如 [Reset Your Routine] - 2

2. What matters most to you? 学习如何优先考虑适合自己的日常工作。 Learn how to prioritize what fits into your routine. Get to your why (找到原因) 因此&#xff0c;当你开始制定新的个性化日常计划时&#xff0c;其中一个关键因素就是要深入挖掘什么对你来说才是真…

Kubernets(k8s) 网络原理一:Pod与宿主机通信

对于刚接触K8S的同学来说&#xff0c;K8S网络显得尤为复杂&#xff0c;例如Pod如何访问主机以及pod间如何进行通信等。本系列文章将站在一个初学者角度&#xff0c;逐层刨析Kubernetes网络实现原理&#xff0c;并利用基本的Linux命令加以实现。 网络虚拟化基石&#xff1a;net…

【Qt】QDial和QSlider

QDial QDial类用于创建一个旋转式的圆形控件&#xff0c;通过鼠标点击旋转、方向键或者pageUp和pageDown调整一个值。常用在需要进行连续调整的场景&#xff0c;比如音量控制、亮度控制、透明度调节等 常见属性 属性说明value持有的值minimum持有值所能到达的最小值maximum持有…

Fiddler抓包及设置

1、打开Fiddler.exe 2、设置过滤&#xff0c;只抓取具体网页或APP 3、勾选 Request Headers 中的 Hide if url contains 过滤项&#xff0c;贴入下方正则表达式&#xff1a;REGEX:(?index)/[^\?/]*\.(css|ico|jpg|png|gif|bmp|wav|js|jpeg|webp)(\?.*)?$&#xff0c;表示过…

云计算 docker 管理镜像和容器

docker的概述 命令说明docker version查看服务器与客户端版本docker info查看 docker 服务配置信息 容器安装部署dnf install -y docker-ce systemctl enable --now docker 配置镜像仓库 镜像概述 镜像管理命令 镜像管理命令说明docker images查看本机镜像docker pull 镜像名…

HDU1100——Trees Made to Order以及卡特兰数

HDU1100——Trees Made to Order 题目描述 Problem - 1100 运行代码 #include <iostream> #include <vector> using namespace std; vector<long long> C(21, 1); // 第21个卡特兰数达到65亿 // 预处理卡特兰数 void Catalan() {for (int i 1; i < 2…

网络学习:应用层DNS域名解析协议

目录 一、简介 二、工作流程 一、简介 DNS( Domain Name System)是“域名系统”的英文缩写&#xff0c;是一种组织成域层次结构的计算机和网络服务命名系统&#xff0c;它用于TCP/IP网络&#xff0c;它所提供的服务是用来将主机名和域名转换为IP地址的工作。 同时,DNS…

[Leetcode 875][Medium]-爱吃香蕉的珂珂-二分搜索

目录 一、题目描述 二 、整体思路 三 、代码 一、题目描述 原题地址 二 、整体思路 题目要求在时间h内(含h)&#xff0c;求解最小速度k。那么首先要知道速度与吃香蕉所用时间的关系。 假设速度为k&#xff0c;那么吃香蕉所用时间t就等于每堆香蕉piles[i]除以速度k所得的向…

电子元器件—电容和电感(一篇文章搞懂电路中的电容和电感)(笔记)(面试考试必备知识点)电容和电感作用、用途、使用、注意事项、特点等(面试必备)-笔记(详解)

作者&#xff1a;Whappy 座右铭&#xff1a;不曾拥有&#xff0c;何来失去&#xff01; 时间&#xff1a;2024年8月2日08:40:04 一、电容的作用 储能&#xff1a; 电容器通过充电储存电荷在电容板上&#xff0c;形成电场储存电能。当需要释放储存的电能时&#xff0c;电荷…

django集成pytest进行自动化单元测试实战

文章目录 一、引入pytest相关的包二、配置pytest1、将django的配置区分测试环境、开发环境和生产环境2、配置pytest 三、编写测试用例1、业务测试2、接口测试 四、进行测试 在Django项目中集成Pytest进行单元测试可以提高测试的灵活性和效率&#xff0c;相比于Django自带的测试…

回测本身就是一种过度拟合?

这也许是一个絮絮叨叨的专题&#xff0c;跟大伙儿唠一唠量化相关的小问题&#xff0c;有感而发写到哪算哪&#xff0c;这是第一期&#xff0c;先唠个10块钱的~ 前段时间在某乎上看到这样一个问题『您怎么理解回测本身就是一种过度拟合&#xff1f;』 个人看来&#xff0c;回测本…

JavaWeb学习——mybatis

目录 一、入门学习 1、什么是mybatis&#xff1f; 2、入门使用 3、配置SQL提示 4、数据库连接池 5、lombok 二、基础操作学习 1、删除 2、新增 3、更新 4、查询 三、XML配置文件 1、映射规范 2、示例代码展示 四、动态SQL 1、学习 2、学习 3、学习 4、学习 一…

TCP/IP协议:互联网通信的基础

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【深度学习】【框架】【基本结构】激活函数

1. relu 2. softmax 3. sigmoid 4. silu 函数&#xff1a;f(x) x * sigmoid(x) 优点&#xff1a; 它既有 ReLU&#xff08;Rectified Linear Unit&#xff09;激活函数的一些优点&#xff08;例如&#xff0c;能够缓解梯度消失问题&#xff09;&#xff0c;又能解决 ReLU …

JavaEE---Spring MVC(2)

5.传递数组 当请求中参数是多个的时候,浏览器就会封装成一个数组 下面是在postman中返回的值 6.传递集合 运行的时候报错了,状态码是500,表示此时是服务器的错误,我们去查看后端源码发现 默认封装的是数组而不是List接口 修改方式: 此时我们就拿到了列表的值 状态码是HT…

文案生成器有哪些?4款为你一键生成原创文案

大家好&#xff01;今天来分享一波超级实用的干货——文案生成器&#xff01;在今天这个信息爆炸的时代&#xff0c;咱们无论是打理社交媒体&#xff0c;还是搞广告宣传等等&#xff0c;对优质文案的需求那是与日俱增。可有时候&#xff0c;灵感枯竭、时间紧迫&#xff0c;怎么…

测试类型分类

前言&#x1f440;~ 上一章我们介绍了如何设计一个测试用例&#xff0c;接下来我们对测试类型进行分类以便更好的了解和分清不同测试测试的内容、对象、时间点等 按照测试对象划分 界面测试&#xff08;也称UI测试&#xff09; 可靠性测试 容错性测试 文档测试 兼容性测…

vue2怎么上传文件夹,并展示文件夹内的图片?

我使用的是element-ui组件库,发现el-upload组件并不能满足需求,于是用原生实现一下,这里贴一下关键代码,如果大家有更好的实现方法,欢迎分享!! 实现效果:

Jangow-1.0.1靶机

一、安装Jangow: 1.0.1靶机 下载靶机&#xff0c;导入到virtualBox里面 开机可以看到&#xff0c;他已经给出了靶机的IP地址&#xff0c;就不用我们自己去探测了 二、信息收集 扫描靶机的端口 首先访问80端口 扫描目录也就是一个site 点击site&#xff0c;来到以下界面 发现…

进阶SpringBoot之自动装配原理

pom.xml&#xff1a; spring-boot-dependencies -> spring-boot-starter-parent spring-boot-dependencies&#xff1a;核心依赖在父工程&#xff0c;引入依赖时不需要指定版本 启动器&#xff1a;SpringBoot 的启动场景 <dependency><groupId>org.springfra…