高併發訂單寫入優化: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 |
| 訂單順序要求 | 單分區隊列 + 單消費者,或引入序列號排序 | 嚴格順序寫入 |
生產級替代方案對比
| 方案 | 優點 | 缺點 | 適用場景 |
| 本文隊列 + 線程 | 零依賴、輕量、可控 | 需自建重試/監控/HA | 中小型、無中間件環境 |
| Redis List + Lua 腳本 | 分布式、持久化、高性能 | 引入 Redis 依賴 | 微服務、集群部署 |
| Kafka/RocketMQ | 專業消息中間件、順序/事務/重放 | 運維成本高、延遲 ms 級 | 大規模、核心交易鏈路 |
| Disruptor | 單機極致性能、無鎖環形隊列 | API 複雜、非持久化 | 極高吞吐、低延遲場景 |
總結
ConcurrentLinkedQueue + 生產消費者是「寫入緩衝」的最小可行性實現。生產環境請根據業務量級、一致性要求、運維能力,在上述方案中權衡選型。**核心原則:同步變異步、串行變並行、阻塞變非阻塞。**
- 上一篇文章: DetachedCriteria 動態構建查詢條件:CriteriaBuilder 通用封裝實戰
- 下一篇文章: Java IO 流體系全景圖:從控制台到文件、網絡的數據搬運指南
Copyright ©
程式碼之家 All Rights Reserved