Java后端项目性能优化实战-群发通知

背景

公司群发通知模块性能存在问题,我进行全面的系统调优,系统处理能力大幅提升。

原发送流程

在这里插入图片描述

优化后的发送流程

在这里插入图片描述

优化的点

  • 说明:以下问题基本都是压测过程遇到的,有些问题普通的功能测试暴露不了。
  • 优化目标:保证高可用、高并发、可扩展。

添加索引

普通索引:

  • 现象:发送过程出现SQL超时异常。
  • 原因:基本都是随着数据量不断提升,某些表没有索引导致的,对于群发这个场景,会因为这种异常影响主流程。
  • 建议:设计表的时候预估业务量,对于关键字段添加索引是成本最低的性能优化手段。

唯一索引:

  • 现象:生成的雪花ID重复,导致数据库要求的唯一字段重复。
  • 原因:多节点雪花算法指定了相同的数据中心ID和机器ID,高并发情况下导致重复。
  • 建议:某些需要保证唯一的场景,不要过分依靠代码逻辑,数据库添加唯一索引至少可以保证一致性。

优化表结构(垂直拆分、水平拆分)

  • 现象:发送过程中有一个发送记录表被锁死。
  • 原因:发送、第三方回调、定时任务都会去操作这个表(包括新增、修改),update操作的时候会加锁,导致大量请求排队处理。(这里把发送记录和回调记录拆成了2个表,瞬间缓解了压力)
  • 建议:合理的进行表结构设计,解耦,不强相关的字段可以拆成多个表。

雪花ID处理

  • 现象:生成的雪花ID重复
  • 原因:多节点雪花算法指定了相同的数据中心ID和机器ID,高并发情况下导致重复。
  • 建议:网上有很多方案
    • 大厂的做法应该是有一个专门生成雪花ID的服务集群
    • 思路是使用注册中心、redis等维护数据中心ID和机器ID
    • 我们目前的临时方案是采用redis的递增,每次服务重启递增拿id,到某个值之后清零(这种方案解决我们目前的场景没什么问题,当集群机器数增加和遇到不断重启的场景可能会有点问题)

使用设计模式

  • 现象:之前代码很多地方采用if else、switch,代码可读性和可扩展性都很差。
  • 原因:一开始开发时间比较赶,想着if else、switch写起来方便。
  • 建议:预估可能会频繁扩展的地方使用工厂模式、策略模式、模板方法模式提高扩展性。(主要就是添加新功能可以尽可能少的改动其他代码)

池化思想

  • 现象:http句柄被用完
  • 原因:
    • 服务有时候发送大量http请求,导致http句柄被用完。
    • redis、数据库没用连接池导致频繁创建和销毁连接。
    • 没用线程池,导致频繁创建销毁线程等。
  • 建议:能用池的就尽量用池,可以提高效率、节约资源。

批处理思想

  • 现象:接口效率低、占用资源多
  • 原因:频繁操作数据库、频繁调用第三方接口
  • 建议:看看能不能分批处理、有没有批量接口

集群思想

  • 现象:处理慢
  • 原因:一台机器处理能力有限
  • 建议:想办法利用集群的优势、把压力分散到其他节点

使用MQ

  • 现象:突然的流量洪流使系统满载或者崩溃
  • 原因:系统处理能力有限
  • 建议:使用MQ销峰,先把要处理的任务推送到MQ,消费者根据自己的消费能力指定消费线程数慢慢处理。

使用多线程

  • 现象:代码执行效率低
  • 原因:逻辑多,串行处理,没用充分利用cpu和内存资源
  • 建议:适当使用多线程相关技术提高效率,JUC包下面的工具

JVM调优

  • 现象:OOM、系统停顿
  • 原因:代码复杂之后(高并发、大数据)、运用了很多线程池、批处理,内存和cpu消耗会有上升
  • 建议:
    • 通过压测合理设置JVM参数(垃圾回收器、堆内存配置等)
    • 常用的观察工具使用(本地VisualVM、线上Arthas等,还有其他的);
    • 观察GC次数和时间,Full GC会暂停整个进程
    • 观察堆内存使用情况(防止各个区域OOM)

使用限流

  • 现象:突然的流量洪流使系统满载或者崩溃
  • 原因:系统处理能力有限
  • 限制接口处理能力,多余请求直接拒绝

服务拆分

  • 现象:已经不能从技术上优化系统了
  • 原因:服务处理能力有限,业务放到一起会互相影响
  • 合理的服务拆分,根据不同服务的业务量来选择部署方案

数据一致性保证

  • 现象:服务重启、OOM会导致业务流程中断,导致业务没有执行完整
  • 原因:业务流程太长
  • 预估可能会出现的系统问题,合理的设计做补偿措施,就算出错了也要有办法能够补偿回来

使用缓存

库存处理等使用缓存,避免频繁操作数据库

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

conda 查看激活自己的新环境,labelImg的使用

查看环境目录 我们可以在基础环境中查看我们有几个环境 conda env list 激活新环境 我们激活pytorch环境pytorch conda activate pytorch 在新环境下安装 然后我们安装labelImg(Python3.10以上会报错) pip install labelImg 新环境下打开 labelImg …

GIT开发中的使用

GIT 什么是Git? Git是一个版本控制器:可以记录工程的每一次改动和版本迭代的一个管理系统 注意事项: 所有的版本控制系统,其实只能跟踪文本文件的改动(如TXT文件、网页、所有的程序代码等),…

线程的状态:操作系统层面和JVM层面

在操作系统层面,线程有五种状态 初始状态:线程被创建,操作系统为其分配资源。 可运行状态(就绪状态):线程被创建完成,进入就绪队列,参与CPU执行权的争夺。或因为一些原因,从阻塞状态唤醒的线程…

Windows11 安装VitrulBox Ubuntu20 虚拟机启动后卡在“Freeing initrd memory: 131304K”

步骤:点击启动Ubuntu后,一直起不来?没办法正常关机,选择重启又一直卡在这里,原来是同样的错误 Freeing initrd memory: 131304K 原因:本机联想小新14Pro,AMD 7840HS,锐龙版。而Ryze…

Visual Studio项目编译和运行依赖第三方库的项目

1.创建项目,这里创建的项目是依赖于.sln的项目,非CMake项目 2.添加第三方库依赖的头文件和库文件路劲 3.添加第三方依赖库文件 4.项目配置有2个,一个是Debug,一个是Release,如果你只配置了Debug,编译和运行…

centos 虚拟机 增加硬盘 虚拟机centos磁盘扩容

2 在centos 7 系统中挂载磁盘 2.1 查看磁盘信息 进入centos 7系统中,输入“# df -h”命令,查看磁盘信息。 这里没有写显示新增的磁盘信息。 2.2 对新加的磁盘进行分区操作 2.2.1 查看磁盘容量和分区 2.2.2 创建分区 a. 选择新增的磁盘(这…

项目3-留言板

1.创建项目 记得将project type改为maven 将需要的包引入其中 更改版本号 引入MYSQL相关包记得进行配置!!! spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncodingutf8&useSSLfalseusername: rootpassword:…

SpringBoot集成Solr全文检索

SrpingBoot 集成 Solr 实现全文检索 一、核心路线 使用 Docker 镜像部署 Solr 8.11.3 版本服务使用 ik 分词器用于处理中文分词使用 spring-boot-starter-data-solr 实现增删改查配置用户名密码认证使用 poi 和 pdfbox 组件进行文本内容读取文章最上方有源码和 ik 分词器资源…

数据结构(五)——树与二叉树的应用

5.5 树与二叉树的应用 5.5.1 哈夫曼树 结点的权:有某种现实含义的数值。 结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积。 树的带权路径长度:树中所有叶结点的带权路径长度之和…

NO9 蓝桥杯单片机串口通信之进阶版

1 回顾 串口通信的代码编写结构还是与中断一样,不同的是: 初始中断函数条件涉及到串口通信相关的寄存器和定时器1相关的寄存器(定时器1用于产生波特率),但初始条件中的中断寄存器只考虑串口通信而不考虑定时器1。 v…

跟着cherno手搓游戏引擎【29】Batch简单合批

思路: CPU和GPU都开辟同样大小的一大块内存(为了存储顶点信息) 索引在程序运行时生成对应规则后绑定到索引缓冲中 动态生成顶点信息(现在改成Drawquad只是确定图形顶点的位置) 然后在Endscene,将CPU的动…

网络安全-文件包含

一、php://input 我们先来看一个简单的代码 <meta charset"utf8"> <?php error_reporting(0); $file $_GET["file"]; if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://&quo…

如何忽略Chrome最小字号的限制

通过控制台调整字体大小时&#xff0c;可以发现即便设置了小于12px的字号&#xff0c;也并不会变小&#xff0c;这是因为Chrome默认最小字号为12px。 在Chrome设置中的外观选项卡中可以发现&#xff0c;默认字体是16px。将最小字号改为0&#xff0c;就能随意设置小于12px的字号…

我在京东做数据分析,一位京东数据分析师的工作日常

有人说&#xff1a;“种下一棵树最好的时间是十年前&#xff0c;其次是现在”。任何时候&#xff0c;我们都应该抓住机遇&#xff0c;说不定就是改变你现状的一个机会。 2020年&#xff0c;我在疫情得到控制后&#xff0c;面试入职京东大数据组&#xff0c;截止目前&#xff0…

libVLC 视频裁剪

使用 libVLC 进行视频裁剪并不是直接支持的功能&#xff0c;因为 libVLC 主要是一个媒体播放库。然而&#xff0c;你可以通过调整播放窗口的大小和设置视频输出的区域来实现一种“视觉上的裁剪”。这意味着视频本身并没有被修改&#xff0c;但可以控制显示给用户的视频区域。 …

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户反馈&#xff0c;项目现…

Mysql数据库:日志管理、备份与恢复

目录 前言 一、MySQL日志管理 1、存放日志和数据文件的目录 2、日志的分类 2.1 错误日志 2.2 通用查询日志 2.3 二进制日志 2.4 慢查询日志 2.5 中继日志 3、日志综合配置 4、查询日志是否开启 二、数据备份概述 1、数据备份的重要性 2、备份类型 2.1 从物理与…

SpringBoot学习之ElasticSearch下载安装和启动(Windows版)(三十)

本文先写windows下的下载安装和启动,后续有时间再补充其他环境下(Mac、Linux、Docker)的,这里我们后续对ElasticSearch简称为ES,读者习惯这一称呼就好。 一,ES下载 可以百度【ElasticSearch官网】或者直接点击这里的ES官网下载地址:​​​​​ Download Elasticsearch…

数字乡村战略实施:科技引领农村经济社会全面发展

随着信息技术的快速发展&#xff0c;数字化已经成为推动经济社会发展的重要力量。在乡村振兴战略的大背景下&#xff0c;数字乡村战略的实施成为了引领农村经济社会全面发展的关键。本文将从数字乡村战略的内涵、实施现状、面临挑战及未来展望等方面&#xff0c;探讨科技如何引…

Mac 装 虚拟机 vmware、centos7等

vmware&#xff1a; https://www.vmware.com/products/fusion.html centos7 清华镜像&#xff1a; 暂时没有官方的 m1 arm架构镜像 centos7 链接: https://pan.baidu.com/s/1oZw1cLyl6Uo3lAD2_FqfEw?pwdzjt4 提取码: zjt4 复制这段内容后打开百度网盘手机App&#xff0c;操…