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

news2024/11/15 8:20:54

背景

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

原发送流程

在这里插入图片描述

优化后的发送流程

在这里插入图片描述

优化的点

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

添加索引

普通索引:

  • 现象:发送过程出现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.coloradmin.cn/o/1545569.html

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

相关文章

芯课堂 | 华芯微特图形上位机快速上手指南

01.工具准备 1、硬件:SWMDM-QFP100-34SVEA3驱屏板TFT屏800x480(触摸IC-GT911)Jlink; 2、PC端:上位机keil。 02.实验现象 通过屏幕上的按钮控制uart发送。 03.创建文件工程 1、可以通过论坛 https://bbs.synwit.cn 获取…

具有徊滞特性的欠压锁定功能的B3842/43/44是专为脱线和Dc-Dc开关电源应用设计的

B3842/43/44是专为脱线和Dc-Dc开关电源应用设计的恒频电流型Pwd控制器内部包含温度补偿精密基准、供精密占空比调节用的可调振荡器、高增益混放大器、电流传感比较器和适合作功率MOST驱动用的大电流推挽输出颇以及单周期徊滞式限流欠压锁定、死区可调、单脉冲计数拴锁等保护电路…

网页设计必备技能:如何用CSS盒子模型打造完美布局?

在网络设计的世界里,盒子模型是构建网页布局的基石,只有理解了盒子模型,我们才能更好的进行网页布局。 HTML中的每一个元素都可以看成是一个盒子,拥有盒子一样的外形和平面空间,它不可见、不直观,但无处不在…

flutter 弹窗之系列二

自定义弹窗&#xff08;含底部抽屉&#xff09;Dialog class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;overrideState<MyHomePage> createState() > _MyHomePageState(); }class _MyHomePageState…

新能源汽车充电桩主板各模块成本占比解析

汽车充电桩主板是汽车充电桩的重要组件&#xff0c;主要由微处理器模块、通信模块、控制模块、安全保护模块、传感器模块等多个模块构成。深入探究各模块在总成本中的比重&#xff0c;我们可以更好地优化成本结构、提高生产效率&#xff0c;并为未来的技术创新和市场需求变化做…

Spring - AOP/事务 实现原理

AOP 基本概念 官方文档&#xff1a; Aspect Oriented Programming with Spring Spring AOP supports the following AspectJ pointcut designators (PCD) for use in pointcut expressions: within - limits matching to join points within certain types (simply the exec…

2核4g服务器能支持多少人访问?阿里云2核4g服务器在线人数

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

leetCode刷题 18. 删除链表的倒数第 N 个结点

目录 1. 思路 2. 解题方法 3. 复杂度 4. Code 题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&…

IF= 13.4| 当eDNA遇上机器学习法

近日&#xff0c;凌恩生物客户重庆医科大学在《Water Research》&#xff08;IF 13.4&#xff09;发表研究论文“Supervised machine learning improves general applicability of eDNA metabarcoding for reservoir health monitoring”。该研究主要介绍了一种基于eDNA的机器学…

2023混合多比特层-RDHEI Based on the Mixed Multi-Bit Layer Embedding Strategy

RRBE 本文仅供自我学习记录,切勿转载和搬运,如有侵权联系立删! 方法总框架 首先,发送者将载体图像进行两轮的不重叠块分割,分为可用隐藏块(AHB)和不可用隐藏块(UHB),然后通过依次处理可用块的像素信息产生location图来创造空间,接着通过密钥将载体进行加密,最后使用…

怎样在NEXT.JS中设置next-auth并实现登入登出

参考代码link&#xff1a;https://github.com/luomi16/next-auth-demo 在Next.js中使用next-auth来实现登录和登出功能是一种流行且相对简单的方法。next-auth是一个专为Next.js开发的认证库&#xff0c;支持多种认证提供者&#xff0c;如Google、Facebook、Twitter以及基于邮…

档案四性检测可复用组件接口说明

nhdeep提供在归档、移交与接收、长期保存等各环节根据需求进行自主配置和调用的可复用组件&#xff0c;支持客户端和接口调用两种功能使用模式。档案四性检测组件为自建档案管理系统和各种业务系统&#xff08;如OA&#xff09;&#xff0c;提供标准化的档案四性检测功能利用&a…

【分享】CMMI V3.0版本做了哪些改变?哪些企业适合申请CMMI3.0

​ CMM是由美国卡内基梅隆大学软件工程研究所1987年开发成功的&#xff0c;它基于过去所有软件工程过程改进的成果&#xff0c;吸取了以往软件工程的经验教训&#xff0c;提供了一个基于过程改进的框架&#xff1b;CMMI(Capability Maturity Model Integration能力成熟度模型集…

esp单片机下arduino_gfx不相干显示驱动优化对flash空间的占用对比

一般情况下&#xff0c;很多esp32或者esp8266下的tft模块驱动都会包含很多种&#xff0c;而我们只需要其中一种&#xff0c;那就有个疑问这些被编译进的显示驱动到底占用了多少空间&#xff0c;是否需要把他优化掉&#xff1f; 这是默认的驱动列表&#xff1a; 84个文件&…

Android14之深入理解sp模板类(二百零二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

C语言例4-12:从键盘输入一个学生的学号、性别和一门课程的成绩后输出该学生的信息

代码如下&#xff1a; //从键盘输入一个学生的学号、性别和一门课程的成绩后输出该学生的信息 #include<stdio.h> int main(void) {int num; //定义整型变量num存放学生的学号char sex; //定义字符型变量sex存放学生的性别float score; //定义实型变量score存放学…

实现多线程方式你知道几种?

实现多线程通常有以下四种方式&#xff1a; 继承 Thread 类。实现 Runnable 接口。实现 Callable 接口。线程池实现多线程。 继承 Thread 类&#xff1a; public class ThreadDemo extends Thread{Overridepublic void run(){System.out.println("Thread 类实现多线程,…

现在的市场对 C++ 的需求大吗?

先说结论&#xff1a;需求还是很大&#xff0c;但是没有什么初级程序员能干的岗位。 游戏引擎&#xff0c;存储&#xff0c;推荐引擎&#xff0c;infra&#xff0c;各种各样的性能敏感场景。 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;…

Linux系统服务

文章目录 什么是daemon与服务(service)systemd使用unit分类 通过systemctl管理服务通过systemctl管理单一服务(service unit)通过systemctl查看系统上所有的服务通过systemctl管理不同的操作环境(target unit)通过systemctl分析各服务之间的依赖性与systemd的daemon运行过程相关…

基于nodejs+vue铁路订票管理系统python-flask-django-php

该铁路订票管理系统采用前后端分离进行设计&#xff0c;并采用nodejs语言以及express框架进行开发。本系统主要设计并完成了用户登录管理过程、个人信息修改、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等功能。该系统操作简单&#xff0c;界…