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

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会导致业务流程中断,导致业务没有执行完整
  • 原因:业务流程太长
  • 预估可能会出现的系统问题,合理的设计做补偿措施,就算出错了也要有办法能够补偿回来

使用缓存

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

相关文章:

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

背景 公司群发通知模块性能存在问题,我进行全面的系统调优,系统处理能力大幅提升。 原发送流程 优化后的发送流程 优化的点 说明:以下问题基本都是压测过程遇到的,有些问题普通的功能测试暴露不了。优化目标:保证高…...

5、Jenkins持续集成-Maven和Tomcat的安装与配置

文章目录 一、Maven的安装与配置1、安装maven并配置环境2、全局工具配置关联jdk和maven3、添加Jenkins全局变量4、修改settings.xml文件5、测试是否配置成功二、Tomcat的安装与配置1、安装tomcat8+2、配置Tomcat用户角色权限3、测试是否配置成功一、Maven的安装与配置 在Jenki…...

Qt教程 — 3.7 深入了解Qt 控件: Layouts部件

目录 2 如何使用Layouts部件 2.1 QBoxLayout组件-垂直或水平布局 2.2 QGridLayout组件-网格布局 2.3 QFormLayout组件-表单布局 在Qt中,布局管理器(Layouts)是用来管理窗口中控件位置和大小的重要工具。布局管理器可以确保窗口中的控件在…...

自动驾驶的几种名词

1. 自适应巡航控制(ACC) 自适应巡航控制(Adaptive Cruise Control,ACC)是一种汽车驾驶辅助系统,它可以根据前方车辆的速度和距离自动调整车辆的速度,以保持与前车的安全距离。ACC系统由控制层和…...

华为全套企业管理资料合集(21专题)

华为全套企业管理资料合集-知识星球下载 1.绩效考核 华为内训绝密资料:绩效管理与绩效考核.ppt 华为绩效管理与绩效考核制度.docx 华为公司实用性各种绩效图表汇总.doc 华为公司考勤管理制度.doc 华为IPD模式中跨部门团队成员的考核激励制度.doc 2.企业管理 华为公司人力资源…...

LeetCode Python - 74. 搜索二维矩阵

目录 题目描述解法方法一:二分查找方法二:从左下角或右上角搜索 运行结果方法一方法二 题目描述 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给…...

如何安全地添加液氮到液氮罐中

液氮是一种极低温的液体,它在许多领域广泛应用,但在处理液氮时需谨慎小心。添加液氮到液氮罐中是一个常见的操作,需要遵循一些安全准则以确保操作人员的安全和设备的完整性。 选择合适的液氮容器 选用专业设计用于存储液氮的容器至关重要。…...

LGBM算法 原理

简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛,通常被…...

【WPF应用5】WPF中的TextBlock控件:属性与事件详解及示例

在WPF(Windows Presentation Foundation)开发中,TextBlock控件是一个常用的元素,用于显示静态或动态文本内容。它提供了丰富的属性和事件,使得开发者能够灵活地控制文本的显示样式和响应用户的交互行为。本文将详细介绍…...

【C语言基础】:内存操作函数

文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…...

3.24作业

基于UDP的网络聊天室 项目需求: 如果有用户登录,其他用户可以收到这个人的登录信息如果有人发送信息,其他用户可以收到这个人的群聊信息如果有人下线,其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器端代码 #in…...

Excel双击单元格后弹窗输入日期

Step1. 在VBE界面新建一个窗体(Userform1),在窗体的工具箱的空白处右键,选中添加附件,勾选Calendar control 8.0,即可完成日历的添加。 PS:遗憾的是, Office 64 位没有官方的日期选择器控件。唯一的解决方案是使用Excel 的第三方日历。 参考链接:How to insert calen…...

原生 HTML/CSS/JS 实现右键菜单和二级菜单

文章来源:www.huhailong.vip 站点 文章源地址:https://www.huhailong.vip/article/1764653112011841538 Demo效果演示地址 先看效果图 {{{width“auto” height“auto”}}} 需要注意的就是边界检测处理,到极端点击底部和右侧时如果不做处理会…...

[项目前置]如何用webbench进行压力测试

测试软件 采用webbench进行服务器性能测试。 Webbench是知名的网站压力测试工具,它是由Lionbridge公司开发。 webbench的标准测试可以向我们展示服务器的两项内容: 每秒钟相应请求数 和 每秒钟传输数据量 webbench测试原理是,创建指定数…...

网络七层模型:理解网络通信的架构(〇)

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

format(C++20)

1. std::format format_01.cpp // g format_01.cpp -stdc20 #include <iostream> #include <string> #include <format>void test_01() {// 使用字符串填充std::cout << std::format("Hello {}!\n", "World"); // Hello World!…...

Ftrans安全数据摆渡系统 构建便捷的内外网数据交换通道

安全数据摆渡系统是一种设计用于解决内外网环境下&#xff0c;数据传输、管理、共享问题的安全系统&#xff0c;通过加密、访问控制等策略&#xff0c;提供安全可靠的数据传输和共享服务&#xff0c;尤其适用于对网络安全建设要求高的行业&#xff0c;比如研发型企业、党政机构…...

【云开发笔记No.14】持续交付、持续部署、持续交付流水线

一、持续交付 持续交付&#xff08;Continuous Delivery&#xff09;是一种软件开发方法论&#xff0c;它强调在开发过程中&#xff0c;软件可以在任何时间以最小的努力被部署到生产环境。其核心是确保代码更改在经过一系列自动化测试后&#xff0c;能够快速、安全地集成到主代…...

蓝桥杯练习07小兔子爬楼梯

小兔子爬楼梯 介绍 小兔子想去月球上旅行&#xff0c;假设小兔子拥有一个阶梯子&#xff0c;当你爬完层就可以到达月球&#xff0c;小兔子每次可以跳1或者2个台阶&#xff0c;小兔子有多少种跳法可以到达月球呢&#xff1f; 给定n是一个正整数&#xff0c;代表梯子的阶数&…...

Docker in Docker原理与实战

Docker in Docker (DinD) 是一种在Docker容器内部运行Docker的技术。它允许在一个Docker容器内部创建和管理其他的Docker容器&#xff0c;实现了一个容器内部的容器编排环境。本文将介绍Docker in Docker的原理&#xff0c;并给出一个实际的应用场景。 Docker in Docker的原理…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...