Docker環境下SpringBoot程序內存溢出(OOM)問題深度解析與實戰調優

文章目錄

      • 一、問題背景與現象還原
        • **1. 業務背景**
        • **2. 故障特征**
        • **3. 核心痛點**
        • **4. 解決目標**
      • 二、核心矛盾點分析
        • **1. JVM 與容器內存協同失效**
        • **2. 非堆內存泄漏**
        • **3. 容器內存分配策略缺陷**
      • 三、系統性解決方案
        • **1. Docker 容器配置**
        • 2. JVM參數優化(容器感知配置)
        • **3. Spring Boot 與 Tomcat 優化**
        • 4. 內存泄漏排查工具鏈
          • 4.1. arthas全局內存儀表盤(`dashboard`)
          • 4.2. arthas內存變化趨勢監測(`memory`)
          • 4.3 arthas方法調用追蹤(`trace`)
          • 4.4 arthas參數與返回值觀察(`watch`)
        • 5.代碼層面優化
          • 5.1 內存檢測
          • 5.2 對象引用主動置空與生命周期管理
          • 5.3 資源釋放標準化
          • 5.4 集合類內存優化
      • 四、典型故障場景復盤
        • 案例:MyBatis緩存導致Metaspace溢出
        • 案例:Netty堆外內存泄漏
      • 五、生產環境最佳實踐
      • 六、兜底方案
        • 6.1 通過Semaphore 限制并發量
        • 6.2 實時計算內存使用情況,攔截內存溢出異常
        • 6.3 完整代碼
      • 七、總結與思考

一、問題背景與現象還原

某SpringBoot數據平臺在支撐ClickHouse海量數據導出時頻繁崩潰,核心矛盾如下:

1. 業務背景
  • 單次導出需并發查詢十余張視圖(2億~2000萬行級數據)
  • 用戶頻繁選擇全字段導出超寬時間范圍篩選,導致單任務數據量激增
2. 故障特征
  • 提交超大請求后,系統在物理內存僅用3.4G/8G時即拋出OOM
  • 報錯集中在非堆內存區域(如DirectBuffer、Metaspace),導致Druid連接池、Tomcat線程崩潰
  • 進程完全卡死,必須人工重啟恢復
3. 核心痛點
  • 全量數據內存駐留式處理,單任務消耗GB級內存
  • 缺乏內存預警,用戶無感知觸發崩潰,日均3-5次運維介入
  • 服務中斷影響全局業務,技術債務亟待解決
4. 解決目標

① 代碼/JVM層優化降低常規內存消耗
② 極端場景下主動熔斷任務,提示用戶優化查詢條件

初始啟動命令:

docker run -d \--restart=always \-e JAVA_OPTS="-Xms1024m -Xmx4096m -Duser.timezone=Asia/Shanghai" \-e spring.profiles.active=prd \-p 9999:8080 \-v /app/logs:/app/logs \--name 服務名 \鏡像:標簽

二、核心矛盾點分析

1. JVM 與容器內存協同失效
  • 現象-Xmx4096m 僅設置堆內存上限,但未明確容器總內存限制,導致非堆內存(元空間、直接內存、線程棧等)超出容器默認限制,觸發 OOM Killer 終止進程。

  • 驗證方法

    docker stats --no-stream anesthesia-research  # 查看容器實際內存限制與使用情況
    cat /sys/fs/cgroup/memory/memory.stat         # 分析容器內存分布(包括緩存和RSS)
    
2. 非堆內存泄漏
  • 元空間泄漏:動態類加載未釋放(如頻繁反射、Spring AOP 代理類生成)。
  • 直接內存泄漏:NIO 緩沖區未釋放(如 Netty、大文件操作未調用 Cleaner)。
  • 線程棧累積:默認線程棧大小 1MB,高并發場景下總占用可能超過容器剩余內存。
3. 容器內存分配策略缺陷
  • 未啟用容器感知:舊版 Java 或未配置 -XX:+UseContainerSupport,導致 JVM 按宿主機內存分配堆,擠占非堆內存空間。
  • 靜態分配堆內存-Xmx 固定值無法動態適配容器內存變化,易導致整體內存超限。

三、系統性解決方案

1. Docker 容器配置
  • 明確內存限制

    docker run
    

    中增加容器總內存約束(預留 25% 給非堆內存):

    docker run -d \-m 12g \                         # 容器總內存限制為 12GB(需大于 JVM 堆內存)--memory-swap=12g \              # 禁用 Swap 避免性能下降--restart=always \...其他參數...
    
  • 監控容器級內存:

    docker stats 服務名  # 實時觀察內存占用
    

在這里插入圖片描述
在這里插入圖片描述

2. JVM參數優化(容器感知配置)
-e JAVA_OPTS="-XX:+UseContainerSupport          # 啟用容器內存感知(關鍵!)-XX:MaxRAMPercentage=75.0         # 動態分配堆內存占容器總內存的 75%(12G → 9G)-XX:InitialRAMPercentage=75.0     # 初始化堆75%(物理機)-XX:MaxMetaspaceSize=1g      # 限制元空間內存(防止類加載泄漏)-XX:MaxDirectMemorySize=2g        # 限制直接內存(NIO 場景必配)-Xss256k                          # 減少線程棧內存(適合高并發)-XX:+ExitOnOutOfMemoryError-XX:+HeapDumpOnOutOfMemoryError    # 自動生成堆轉儲文件-XX:NativeMemoryTracking=summary"
  • 關鍵調整:移除-Xmx,采用容器感知的百分比分配策略,允許JVM動態適配內存限制
  • 線程優化:將默認1MB線程棧縮小至256k,降低高并發場景下的內存消耗

優化后的啟動命令:

docker run -d    --restart=always  -m 12g  --memory-swap=16g     -e JAVA_OPTS="-XX:+UseContainerSupport 
-XX:MaxRAMPercentage=75.0 
-XX:MaxMetaspaceSize=1g 
-XX:MaxDirectMemorySize=2g  
-Xss256k  
-XX:+UseG1GC--XX:+ExitOnOutOfMemoryError  
-XX:NativeMemoryTracking=summary  
-XX:+UnlockDiagnosticVMOptions  
-XX:+StartAttachListener  
-Duser.timezone=Asia/Shanghai"     
-e spring.profiles.active=prd     
-p 9999:8080     -v /app/logs:/app/logs     --name 服務名 鏡像:標簽
3. Spring Boot 與 Tomcat 優化
  • Tomcat 線程池調整

    (減少線程數及內存占用):

    -e SERVER_TOMCAT_THREADS_MAX=50 \      # 最大工作線程數(默認 200)
    -e SERVER_TOMCAT_ACCEPT_COUNT=50 \     # 等待隊列長度(默認 100)
    -e SPRING_MAIN_LAZY_INITIALIZATION=true  # 延遲初始化 Bean 減少啟動內存
    
  • 日志框架優化

    :限制 Logback 異步隊列大小,避免日志堆積:

    <!-- logback-spring.xml -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"><queueSize>1024</queueSize>  <!-- 默認 256,過大易導致內存膨脹 -->
    </appender>
    
4. 內存泄漏排查工具鏈
工具使用場景命令示例
jmap生成堆轉儲分析大對象jmap -dump:format=b,file=heap.bin <pid>
arthas動態診斷內存泄漏點dashboard + heapdump
NMT追蹤Native Memory分配詳情jcmd <pid> VM.native_memory detail
Prometheus監控容器/JVM內存趨勢配置jmx_exporter+Grafana看板
4.1. arthas全局內存儀表盤(dashboard

執行命令實時查看內存全景:

dashboard -i 2000  # 每2秒刷新一次

關鍵指標解讀:

  • Heap:堆內存使用率(重點關注eden_spacetenured_gen
  • Non-Heap:元空間、代碼緩存區等非堆內存
  • GC次數與耗時gc.ps_scavenge.count(Young GC次數)、gc.ps_marksweep.time(Full GC耗時)

在這里插入圖片描述

4.2. arthas內存變化趨勢監測(memory

持續追蹤內存增長:

memory -t 60 -n 5  # 每60秒采樣一次,顯示前5名增長對象

典型內存泄漏特征:heapeden_space持續上漲且無鋸齒狀回收曲線

4.3 arthas方法調用追蹤(trace

定位高內存消耗的接口:

trace com.example.UserController getUserInfo  # 追蹤接口方法調用鏈路

輸出包含:

  • 每個子調用的耗時與內存分配(通過-j參數顯示內存變化)
  • 關聯的SQL查詢或外部服務調用(如發現拼接10萬參數的SQL)
4.4 arthas參數與返回值觀察(watch

監控接口入參和返回值對內存的影響:

watch com.example.OrderService createOrder "{params,returnObj}" -x 3  # 展開3層對象結構

典型場景:

  • 大對象參數(如List包含10萬元素)
  • 緩存未釋放的返回對象(如未設置TTL的緩存)
5.代碼層面優化
5.1 內存檢測

檢測靜態方法:

@Slf4j
public class MemoryMonitor {/*** 安全閾值(建議80%)*/private static final double MEMORY_THRESHOLD = 80;public static void isMemoryCritical() {MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();long maxMB = memoryBean.getHeapMemoryUsage().getMax() / (1024 * 1024);long usedMB = memoryBean.getHeapMemoryUsage().getUsed() / (1024 * 1024);double usedPercent = ((double) usedMB / maxMB) * 100;String formatted = String.format("%.2f%%", usedPercent);log.info("當前內存使用情況:最大內存={} MB,已使用內存={} MB", maxMB, usedMB);log.info("當前內存使用百分比={}", formatted); if (usedPercent > MEMORY_THRESHOLD){throw new MemoryThresholdException("內存使用超過安全閾值,請及時處理!");}}
}

專屬異常:

/*** MemoryThresholdException : 內存閾值異常** @author zyw* @create 2025-04-11  10:44*/public class MemoryThresholdException extends RuntimeException {public MemoryThresholdException(String message) {super(message);}
}
5.2 對象引用主動置空與生命周期管理
  1. 顯式置空無用對象
    通過將不再使用的對象引用設為 null,加速 GC 標記回收:

    List<Object> dataCache = new ArrayList<>();
    // 大數據處理完成后清理
    dataCache.clear();  // 清空集合內容
    dataCache = null;   // 釋放集合對象引用
    
  2. 局部變量作用域控制
    縮小對象生命周期范圍,避免長生命周期的變量持有短生命周期對象:

    public void processData() {// 大對象在方法內部創建,方法結束自動回收byte[] buffer = new byte[1024 * 1024]; // ...處理邏輯...
    }  // buffer 超出作用域后自動回收
    
5.3 資源釋放標準化
  1. Try-With-Resources 自動關閉
    對實現 AutoCloseable 接口的資源(文件、數據庫連接等),強制使用自動關閉語法:

    try (Connection conn = dataSource.getConnection();PreparedStatement stmt = conn.prepareStatement(sql)) {// 執行查詢...
    }  // 自動調用 close() 釋放資源
    
  2. 線程局部變量清理
    避免 ThreadLocal 內存泄漏,使用后必須調用 remove()

    ThreadLocal<UserSession> userSession = new ThreadLocal<>();
    try {userSession.set(new UserSession());// ...業務邏輯...
    } finally {userSession.remove();  // 強制清理線程綁定數據
    }
    
5.4 集合類內存優化
  1. 靜態集合使用弱引用
    替換靜態 HashMapWeakHashMap,避免緩存對象無法回收:

    // 使用弱引用緩存(Key 無強引用時自動回收)
    Map<Long, UserSession> cache = new WeakHashMap<>();
    
  2. 大容量集合分塊處理
    分批處理數據流,避免一次性加載到內存:

    try (BufferedReader reader = new BufferedReader(new FileReader("large.log"))) {String line;while ((line = reader.readLine()) != null) {processLine(line);  // 逐行處理,不緩存全部數據}
    }
    

四、典型故障場景復盤

案例:MyBatis緩存導致Metaspace溢出

某分頁查詢接口在高并發場景下頻繁生成動態代理類,最終觸發OutOfMemoryError: Metaspace。通過以下步驟定位:

  1. 日志分析:發現Metaspace使用量持續增長至512MB上限
  2. 堆轉儲驗證:使用MAT工具分析發現org.apache.ibatis.reflection.javassist.JavassistProxyFactory類實例過多
  3. 解決方案:調整MyBatis的localCacheScope為STATEMENT,禁用全局緩存
案例:Netty堆外內存泄漏

某個TCP長連接服務運行24小時后出現OutOfMemoryError: Direct buffer memory,根本原因為未正確釋放ByteBuf:

// 錯誤寫法:未調用release()
ByteBuf buf = Unpooled.directBuffer(1024);
// 正確寫法
try (ByteBuf buf = PooledByteBufAllocator.DEFAULT.directBuffer(1024)) {// 業務邏輯
} finally {buf.release(); 
}

通過-XX:MaxDirectMemorySize限制直接內存,并通過io.netty.leakDetectionLevel=paranoid開啟泄漏檢測。

五、生產環境最佳實踐

  1. 防御性編程

    • 所有資源類對象(連接池、文件句柄)必須顯式關閉
    • 使用WeakHashMap替代強引用緩存,避免內存駐留
  2. 監控體系構建

    # 容器級監控
    docker stats --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"# JVM級監控
    jstat -gc <pid> 500  # 每500ms輸出GC統計
    
  3. 混沌工程驗證

    • 使用stress-ng工具模擬內存壓力:
    stress-ng --vm 2 --vm-bytes 80% --timeout 10m
    
    • 驗證JVM的-XX:+ExitOnOutOfMemoryError是否正常觸發進程退出

六、兜底方案

6.1 通過Semaphore 限制并發量

配置:

/*** 限制并發數為1 (這里測試階段暫設為1,可根據實際硬件配置權衡性能設置)*/
private final Semaphore semaphore = new Semaphore(1);

使用:

        try {// 獲取信號量,限制并發semaphore.acquire();} catch (InterruptedException e) {log.error("《==獲取信號量時被中斷,導出id:{},異常信息:{}", recordId, e.getMessage());} finally {// 釋放信號量semaphore.release(); }
6.2 實時計算內存使用情況,攔截內存溢出異常
@Slf4j
public class MemoryMonitor {/*** 安全閾值(建議80%)*/private static final double MEMORY_THRESHOLD = 80;public static final String MEMORY_THRESHOLD_MESSAGE = "內存使用超過安全閾值,請縮小模板導出篩選范圍或減少導出的變量!";public static void isMemoryCritical() {MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();long maxMB = memoryBean.getHeapMemoryUsage().getMax() / (1024 * 1024);long usedMB = memoryBean.getHeapMemoryUsage().getUsed() / (1024 * 1024);double usedPercent = ((double) usedMB / maxMB) * 100;String formatted = String.format("%.2f%%", usedPercent);log.info("當前內存使用情況:最大內存={} MB,已使用內存={} MB", maxMB, usedMB);log.info("當前內存使用百分比={}", formatted);if (usedPercent > MEMORY_THRESHOLD){throw new MemoryThresholdException(MEMORY_THRESHOLD_MESSAGE);}}// 模擬內存溢出測試public static void main(String[] args) {List<byte[]> list = new ArrayList<>();for (int i = 0; i < 50; i++) {isMemoryCritical();// 每次分配100MB內存list.add(new byte[1024 * 1024 * 100]);}}
}
6.3 完整代碼
/*** 限制并發數為1 (這里測試階段暫設為1,可根據實際硬件配置權衡性能設置)*/
private final Semaphore semaphore = new Semaphore(1);@Async("asyncThreadPool")    
public void generateResearchDirectionFilesByTemplate(Long recordId, String fileName) {try {// 獲取信號量,限制并發semaphore.acquire();// 異步執行的業務邏輯log.info("《==異步生成Excel文件中,導出申請id:{}==》", recordId);long l1 = System.currentTimeMillis();ExportRecords record = exportRecordsService.getById(recordId);try {String fileUrl = filePath + "/" + recordId + "/" + fileName + "-" + LocalDate.now() + ".xlsx";// 獲取模板詳情及寫入數據Workbook workbook = exportAlgorithm(record.getProjectId(), record.getTemplateId());long l2 = System.currentTimeMillis();log.info("寫入Excle耗時:{}", l2 - l1);// 上傳到MINIO// 將 Workbook 轉換為字節數組輸入流ByteArrayOutputStream baos = new ByteArrayOutputStream();workbook.write(baos);byte[] workbookBytes = baos.toByteArray();ByteArrayInputStream bis = new ByteArrayInputStream(workbookBytes);PutObjectArgs args = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileUrl).stream(bis, bis.available(), -1).contentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet").build();minioClient.putObject(args);// 錄入文件idrecord.setFileUrl(fileUrl);// 導出狀態更新record.setFileStatus(StatusConstant.EXPORT_SUCCESSFULLY);long l4 = System.currentTimeMillis();log.info("《==異步生成Excel文件成功,導出id:{}==》,總耗時:{}", recordId, (l4 - l1));record.setTimeConsuming((l4 - l1));record.setErrorLog("無");} catch (ExcleException | MemoryThresholdException e) { // 自定義異常攔截預期報錯record.setFileStatus(StatusConstant.EXPORT_FAILURE);record.setErrorMessage(e.getMessage());} catch (OutOfMemoryError e) {  // 攔截預期之外的內存溢出異常record.setFileStatus(StatusConstant.EXPORT_FAILURE);record.setErrorMessage(MemoryMonitor.MEMORY_THRESHOLD_MESSAGE);} catch (Exception e) {   // 程序報錯攔截e.printStackTrace();record.setFileStatus(StatusConstant.EXPORT_FAILURE);if (Objects.isNull(e.getMessage())) {record.setErrorLog("無報錯日志");} else {record.setErrorLog(e.getMessage().length() <= 500 ? e.getMessage() : e.getMessage().substring(0, 500));}long l5 = System.currentTimeMillis();record.setTimeConsuming((l5 - l1));log.info("《==異步生成Excel文件失敗,導出id:{},異常信息:{}", recordId, e.getMessage());record.setErrorMessage(AnesthesiaResultCode.EXPORT_PROGRAM_ERROR.getMessage());} finally {// 修改導出記錄下載狀態exportRecordsService.updateById(record);// 內存清理System.gc();}} catch (InterruptedException e) {log.error("《==獲取信號量時被中斷,導出id:{},異常信息:{}", recordId, e.getMessage());} finally {semaphore.release(); // 釋放信號量}
}

七、總結與思考

在容器化Java應用的運維中,內存管理需要從四個維度綜合考量:

  1. 容器資源配額:合理設置Swap空間,平衡性能與穩定性
  2. JVM內存模型:理解堆/非堆內存的分配策略,避免參數沖突
  3. 應用代碼質量:通過靜態掃描(SonarQube)和動態分析(Arthas)預防泄漏
  4. 監控告警體系:建立容器/JVM/APM三層監控,實現異常早發現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77869.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77869.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77869.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PGCCC】Postgres MVCC 內部:更新與插入的隱性成本

為什么 Postgres 中的更新操作有時感覺比插入操作慢&#xff1f;答案在于 Postgres 如何在后臺管理數據版本。 Postgres 高效處理并發事務能力的核心是多版本并發控制&#xff08;MVCC&#xff09;。 在本文中&#xff0c;我將探討 MVCC 在 Postgres 中的工作原理以及它如何影響…

Docker使用、容器遷移

Docker 簡介 Docker 是一個開源的容器化平臺&#xff0c;用于打包、部署和運行應用程序及其依賴環境。Docker 容器是輕量級的虛擬化單元&#xff0c;運行在宿主機操作系統上&#xff0c;通過隔離機制&#xff08;如命名空間和控制組&#xff09;確保應用運行環境的一致性和可移…

c#清理釋放內存

雖然c#具有內存管理和垃圾回收機制&#xff0c;但是在arcobjects二次開發嵌入到arcgis data reviewet還會報內存錯誤。需要強制清理某變量內存方法如下: 1設置靜態函數ReleaseCom函數 public static void ReleaseCom(object o) { try{System.Runtime.InteropServices.Marsh…

Linux:進程:進程控制

進程創建 在Linux中我們使用fork函數創建新進程&#xff1a; fork函數 fork函數是Linux中的一個系統調用&#xff0c;用于創建一個新的進程&#xff0c;創建的新進程是原來進程的子進程 返回值&#xff1a;如果子進程創建失敗&#xff0c;返回值是-1。如果子進程創建成功&a…

day1-小白學習JAVA---JDK安裝和環境變量配置(mac版)

JDK安裝和環境變量配置 我的電腦系統一、下載JDK1、oracle官網下載適合的JDK安裝包&#xff0c;選擇Mac OS對應的版本。 二、安裝三、配置環境變量1、終端輸入/usr/libexec/java_home -V查詢所在的路徑&#xff0c;復制備用2、輸入ls -a3、檢查文件目錄中是否有.bash_profile文…

Python項目--基于機器學習的股票預測分析系統

1. 項目介紹 在當今數字化時代&#xff0c;金融市場的數據分析和預測已經成為投資決策的重要依據。本文將詳細介紹一個基于Python的股票預測分析系統&#xff0c;該系統利用機器學習算法對歷史股票數據進行分析&#xff0c;并預測未來股票價格走勢&#xff0c;為投資者提供決策…

計算機視覺與深度學習 | 基于YOLOv8與光流法的目標檢測與跟蹤(Python代碼)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 目標檢測與跟蹤 關鍵實現邏輯檢測-跟蹤協作機制?特征點選擇策略?運動…

Java集合及面試題學習

知識來源沉默王二、小林coding、javaguide 1、ArrayList list.add("66") list.get(2) list.remove(1) list.set(1,"55") List<String> listnew ArrayList<>(); 底層是動態數組 添加元素流程&#xff1a;判斷是否擴容&#xf…

OSPF --- LSA

文章目錄 一、OSPF LSA&#xff08;鏈路狀態通告&#xff09;詳解1. LSA通用頭部2. OSPFv2 主要LSA類型a. Type 1 - Router LSAb. Type 2 - Network LSAc. Type 3 - Summary LSAd. Type 4 - ASBR Summary LSAe. Type 5 - AS External LSAf. Type 7 - NSSA External LSA 3. LSA泛…

Spring Boot 框架介紹及 Spring Boot 與 Spring 實現對比

在日常 Java Web 開發中&#xff0c;Spring 框架幾乎是繞不開的技術體系。傳統的 Spring 項目因其靈活強大而被廣泛應用&#xff0c;但隨著項目規模擴大與業務復雜度提升&#xff0c;XML 配置繁瑣、部署復雜等問題逐漸顯現。為此&#xff0c;Spring Boot 應運而生。 Spring Boo…

基于CNN卷積神經網絡和GEI步態能量提取的視頻人物步態識別算法matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 GEI步態能量提取 4.2 CNN卷積神經網絡原理 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) 2.算法運行軟件版本 matlab2024b/matlab2022a 3.部分核心程序 &…

創建型模式:建造者模式

什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一種創建型設計模式&#xff0c;它將一個復雜對象的構建過程與其表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。簡單來說&#xff0c;建造者模式允許您一步一步創建復雜對象&#xff0c;而…

Linux `init 5` 相關命令的完整使用指南

Linux init 5 相關命令的完整使用指南—目錄 一、init 系統簡介二、init 5 的含義與作用三、不同 Init 系統下的 init 5 行為1. SysVinit&#xff08;如 CentOS 6、Debian 7&#xff09;2. systemd&#xff08;如 CentOS 7、Ubuntu 16.04&#xff09;3. Upstart&#xff08;如 …

RabbitMQ常見面試題回答重點

文章目錄 什么是消息隊列&#xff1f;為什么需要消息隊列消息隊列的模型消息隊列常見名詞如何保證消息不丟失&#xff1f;&#xff08;可靠性&#xff09;如何保證消息不重復/業務冪等性如何保證消息有序性如何處理消息堆積消息隊列設計為推送還是拉取 / 推拉模式優點無法路由的…

欣佰特攜數十款機器人相關前沿產品,亮相第二屆人形機器人和具身智能行業盛會

2025年4月15日至16日&#xff0c;備受關注的第二屆中國人形機器人與具身智能產業大會已在北京成功舉行。作為國內前沿科技及產品服務領域的重要參與者&#xff0c;欣佰特科技攜眾多前沿產品精彩亮相&#xff0c;全方位展示了其在人形機器人與具身智能領域的創新產品。 在本次大…

Docker安裝 (centos)

1.安裝依賴包&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2.刪除已有的 Docker 倉庫文件&#xff08;如果有&#xff09;&#xff1a; sudo rm -f /etc/yum.repos.d/docker-ce.repo 3.添加阿里云的 Docker 倉庫&#xff1a; sudo yum…

Vue接口平臺學習十——接口用例頁面2

效果圖及簡單說明 左邊選擇用例&#xff0c;右側就顯示該用例的詳細信息。 使用el-collapse折疊組件&#xff0c;將請求到的用例詳情數據展示到頁面中。 所有數據內容&#xff0c;綁定到caseData中 // 頁面綁定的用例編輯數據 const caseData reactive({title: "",…

服務器數據遷移指南

服務器數據遷移是將數據從一臺服務器轉移到另一臺服務器的過程&#xff0c;可能是為了硬件升級、云遷移、數據中心搬遷或服務整合。 以下是數據遷移的關鍵步驟和注意事項&#xff1a; 遷移前準備 制定遷移計劃 確定遷移范圍(全量/增量) 評估數據量和網絡帶寬 制定時間表和回…

25.解決中醫知識問答刪除歷史對話功能后端處理請求時拋出異常

ChatTest.vue:176 DELETE http://localhost:8080/api/chat/conversations/20 500 (Internal Server Error) deleteConversation ChatTest.vue:176 onClick ChatTest.vue:22 ChatTest.vue:185 刪除失敗 AxiosError {message: Request failed with status code 500, name: Axio…

記錄seatunnel排查重復數據的案例分析

文章目錄 背景分析檢查現象檢查B集群是否有異常&#xff0c;導致重復消費的分析同步任務 修復問題發現flink job 一直報異常修復問題 背景 使用seatunnel 同步數據從A 集群kafka 同步到B集群kafka,現象是發現兩邊數據不一致&#xff0c;每天10w級別會多幾十條數據 分析 檢查…