千萬級Push鏈路演進(jìn)之路
背景:該業(yè)務(wù)場景常見于促銷活動通知,有時候運營配置某些活動后,要全量的通知給用戶。在該項目中,push通知鏈路共有三個階段,伴隨用戶量和業(yè)務(wù)復(fù)雜度的上升,不斷地對該鏈路進(jìn)行優(yōu)化。
階段一:初期,滾動拉取用戶數(shù)據(jù),采用線程池或for循環(huán),調(diào)用推送接口。進(jìn)行模板組裝和SDK調(diào)用

瓶頸:
- 性能效率方面:
- 資源占用高:若用
for循環(huán)調(diào)用推送接口,需依次處理每個用戶,用戶量大時耗時久,易引發(fā)系統(tǒng)長時間資源占用,拖慢其他業(yè)務(wù)。 - 吞吐量受限:線程池若線程數(shù)設(shè)置不合理,或無有效任務(wù)隊列、拒絕策略,高并發(fā)下會線程競爭、任務(wù)積壓,降低推送吞吐量,無法及時觸達(dá)大量用戶。
- 資源占用高:若用
- 穩(wěn)定性與可靠性方面:
- 異常影響范圍大:滾動拉取用戶和循環(huán)推送中,單個用戶處理出錯,若未妥善隔離,可能讓整個循環(huán)中斷或影響其他用戶處理,降低推送成功率與系統(tǒng)穩(wěn)定性。
- 缺乏容災(zāi)重試:未對失敗推送任務(wù)有效重試、降級,遇到網(wǎng)絡(luò)抖動等臨時問題,會大量丟失推送,影響活動觸達(dá)效果,且難定位恢復(fù)故障。
- 業(yè)務(wù)靈活性與擴(kuò)展性方面:
- 耦合度高:模板組裝、SDK 調(diào)用和用戶拉取推送流程耦合,后續(xù)要換推送 SDK 或改模板,需改動大量代碼,增加維護(hù)成本與升級風(fēng)險。
- 難適配復(fù)雜場景:業(yè)務(wù)復(fù)雜后,如按用戶分層、分時段推送,現(xiàn)有簡單循環(huán)難擴(kuò)展,要大改流程才能支持,限制業(yè)務(wù)創(chuàng)新優(yōu)化。
階段二:引入mq和模塊劃分

成效:
但這種升級后仍存在瓶頸:
最終版本:以40w用戶舉例,實際可以支持千萬級用戶pus

優(yōu)勢:
- 效率與資源優(yōu)化:
- 任務(wù)拆分與 Batch 處理:通過 “活動消費者拆分用戶 ID 區(qū)間任務(wù)(1000 個用戶為 1 個任務(wù),再拆 100 個為 1 個 list )” + “線程池 + MQ 的 batch 消息”,大幅減少網(wǎng)絡(luò)請求次數(shù)。比如 1k 數(shù)據(jù),原單條推送需 10s,Batch 處理僅需 100ms ,提升推送效率。
- 多節(jié)點并行:用戶提取消費者多個節(jié)點并行,結(jié)合節(jié)點多線程(如 4C8G 機(jī)器 30 線程),將推送耗時從階段二的高耗時,優(yōu)化到分鐘級,極大提升并發(fā)處理能力與時效性。
- 冪等性保障:引入 Redis 判斷是否發(fā)送過,推送成功更新 Redis ,避免同一用戶重復(fù)推送,解決階段二可能的重復(fù)推送問題,保證推送冪等性,減少無效處理,提升系統(tǒng)可靠性與用戶體驗。
- 任務(wù)流程精細(xì)化:細(xì)化推送流程各環(huán)節(jié)(從活動創(chuàng)建發(fā) MQ ,到活動消費者拆分任務(wù)、用戶提取消費者分批處理,再到推送服務(wù)消費者線程池處理),通過 “獲取最大用戶 ID → 拆分區(qū)間 → Batch 處理 → 多節(jié)點并行”,讓大規(guī)模用戶推送任務(wù)分配更合理,充分利用資源,適配高并發(fā)場景。
最后,此版本以可滿足當(dāng)時項目的用戶體量和時效要求
本文來自博客園,作者:難得,轉(zhuǎn)載請注明原文鏈接:http://www.rzrgm.cn/zhangbLearn/p/18996683

浙公網(wǎng)安備 33010602011771號