首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

高併發訂單寫入優化:ConcurrentLinkedQueue + 生產消費者模式實戰

     編輯:Java 綜合教學

高併發訂單寫入優化:ConcurrentLinkedQueue + 生產消費者模式實戰

場景:小型服務器、突發大量訂單請求、直接入庫導致超時丟單。解決思路:**「寫入緩衝 + 異步消費」**,將同步阻塞轉為異步非阻塞。

核心組件

  • ConcurrentLinkedQueue<String>:無鎖線程安全隊列,CAS 實現,高併發入隊/出隊性能優於 BlockingQueue。
  • 多生產者線程:模擬多用戶並發下單,queue.add(orderInfo)。
  • 單消費者線程:循環 queue.poll() 批量入庫。

完整代碼實現

// 共享隊列
public class OrderBuffer {
    public static final ConcurrentLinkedQueue<String> QUEUE = new ConcurrentLinkedQueue<>();
}

// 消費者:持久化線程
public class OrderPersister extends Thread {
    @Override public void run() {
        while (true) {
            String order = QUEUE.poll(); // 非阻塞取出
            if (order != null) {
                // TODO: 批量組裝 SQL / 調用 DAO 入庫
                System.out.println("持久化: " + order);
            } else {
                LockSupport.parkNanos(10_000_000); // 10ms 空閒退讓,降低 CPU
            }
        }
    }
}

// 生產者:模擬用戶下單
public class OrderProducer extends Thread {
    private final String prefix;
    private int seq = 1;
    public OrderProducer(String prefix) { this.prefix = prefix; }
    @Override public void run() {
        while (true) {
            try {
                QUEUE.add(prefix + "-" + seq++);
            } catch (Exception e) { e.printStackTrace(); }
        }
    }
}

// 啟動器
public class Main {
    public static void main(String[] args) {
        // 3 個生產者模擬 3 類用戶
        new OrderProducer("UserA").start();
        new OrderProducer("UserB").start();
        new OrderProducer("UserC").start();
        // 1 個消費者
        new OrderPersister().start();
    }
}

關鍵優化點

生產級替代方案對比

痛點優化方案效果
單消費者成為瓶頸多消費者 + 分片(按 orderId % N 路由到不同隊列)水平擴展寫入吞吐
隊列無界風險 OOM改用 ArrayBlockingQueue(capacity) + 拒絕策略(丟棄/降級/阻塞)背壓保護,防雪崩
消費者異常導致數據丟失入庫失敗重入隊 + 死信隊列 + 監控告警最終一致性保障
頻繁 poll 空轉 CPU 高LockSupport.parkNanos 或 BlockingQueue.take() 阻塞等待空閒期 CPU 接近 0
訂單順序要求單分區隊列 + 單消費者,或引入序列號排序嚴格順序寫入

總結

ConcurrentLinkedQueue + 生產消費者是「寫入緩衝」的最小可行性實現。生產環境請根據業務量級、一致性要求、運維能力,在上述方案中權衡選型。**核心原則:同步變異步、串行變並行、阻塞變非阻塞。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點適用場景
本文隊列 + 線程零依賴、輕量、可控需自建重試/監控/HA中小型、無中間件環境
Redis List + Lua 腳本分布式、持久化、高性能引入 Redis 依賴微服務、集群部署
Kafka/RocketMQ專業消息中間件、順序/事務/重放運維成本高、延遲 ms 級大規模、核心交易鏈路
Disruptor單機極致性能、無鎖環形隊列API 複雜、非持久化極高吞吐、低延遲場景