推送平臺技術優(yōu)化迭代

技術優(yōu)化迭代

問題點
  1. etcd 發(fā)號器安全性問題 。
    解決方案 :
    使用其他 分段式id 生成方案替換。 詳情參考 j39 分布式id技術選型
    http://wiki.internal.taqu.cn/docs/wiki/id_gen(設計者:喻詩文)

  2. 現(xiàn)在短信多渠道推送一般是remainder切換來做的 。沒有優(yōu)先級 ,也沒有兜底的概念。,某一時間不可用了。 兜底渠道可以頂上 ,或者 具有動態(tài)切換切換優(yōu)先級的能力都是可以的。
    解決方案 :
    應用,推送類型 ,業(yè)務類型 3個維度 ,推送渠道優(yōu)先級 。 設計 推送渠道優(yōu)先級表 ,根據(jù)優(yōu)先級動態(tài)變更 ,推送渠道優(yōu)先級 。
    建議 mysql 存儲 應用,推送類型 ,業(yè)務類型 ,推送渠道優(yōu)先級 數(shù)據(jù) , etcd 作為開關 ,決定是否刷新本地緩存 。 具體實現(xiàn) 各個設計者 負責 。

  3. 將方法路由信息 ,實現(xiàn)類和方法 告知調用方 ,本身就不是一個好的方式 。使用反射的性能消耗也會比普通方法調用要高很多 。不利于提升整體性能
    解決方案 :
    通過接口 解決反射調用代碼 ,有利于提升整體性能。

  4. 現(xiàn)在內部還使用了redis 作為 高優(yōu)先級隊列,低優(yōu)先級隊列,以及群發(fā)隊列的實現(xiàn),本身redis 不支持 至少一次消費,或者精確一次消費 ,推送任務 ,如果pod down了 ,這個pushtask永遠不會完成,redis 也沒有辦法作為消息兜底,內存就那么點,個推渠道短暫掛掉了。消息現(xiàn)在都是丟失。如果可以 通過kafka 緩存 消息 ,通過消息兜底機制,保存最新一段時間消息推送 ,個人覺得有利于提高推送成功率。
    解決方案 :
    用kafka替換redis 高優(yōu)先級 ,低優(yōu)先級隊列 , 可以做到消息兜底 , 以及 至少一次消費 精確一次消費等事情的。
    工作可以分成兩塊
    消息兜底機制 (設計者: 喻詩文)
    對接kafka 。(設計者: 范銳)

  1. 推送指標添加
    1 實時性指標 - 消息進入j5 系統(tǒng) ,以及到 j5 通過渠道推送 的時間 , 消息實時性 性能指標 有缺失
    2 吞吐量相關指標 - 進入j5系統(tǒng)消息量 ,從j5系統(tǒng)推送出消息量 ,以及之間的差值。
    3 業(yè)務相關指標 - 目前j5 消息無法知曉 ,消息投遞者是誰 。投遞系統(tǒng)是誰。更不用提業(yè)務相關指標收集 ,比如某次運營活動消息的推送量,實時性 ,真實到達率等等。

  2. 部分不合理流程優(yōu)化 ,sql 優(yōu)化 。 比如說 select count 是否合理 ,是否有走索引。 是否可以通過redis 替換。等等。

  3. info日志的百分比收集 ,推送日志多,其實是必然的。 通過開關,開啟或者關閉,有時候會錯失掉某些日志。業(yè)務方反應沒有收到,但我們這邊也沒有報錯。 如果量較大的推送。 做到百分之50的收集 ,就能減少不少的日志空間了。同時也可以反饋業(yè)務方。

目前架構設計
attach_1661557167e70c97.png

其實 從架構體系上 這次迭代開發(fā),架構上是沒有變化,只是將某些組件做了替換以及增強 。未來可能會根據(jù)實際的需求,逐漸去演化。
我希望未來推送平臺每一個組件都是職責單一的,可以擴展的 ,具備高可用的特性的,易于監(jiān)控,開發(fā),維護。 同時具備還具備較高的性能上 (吞吐量,實時性)。

attach_1668cc260cbeed18.png
推送服務接入層

當前業(yè)務方直接通過tqmq傳遞類名,方法名 ,通過反射的方式調用指定類下的方法。這種方式耦合了業(yè)務方以及推送平臺,我更加希望通過soa 接口的方式去做這一層,推送平臺的內部的類,方法,接口以及組件的改變和替換都不會影響和其他系統(tǒng)對接的協(xié)議。同時可以提供統(tǒng)一接口避免了沒有約定消息傳遞而導致業(yè)務方以為消息推出去,其實傳參沒傳對的問題,消息沒有傳出去,因為這一層soa接口會做基本驗證,告知業(yè)務方,最后會通過app標識 ,業(yè)務標識 將消息異步發(fā)送指定對列

推送服務層

每個應用監(jiān)聽自己的隊列,獲取消息 ,生成推送任務push_task ,組裝推送數(shù)據(jù) pushdata(比如說范圍推送的cid獲取 ,驗證,建議將所有業(yè)務相關驗證放在這一層),實時消息通過mq的方式 交給推送網(wǎng)關 ,定時消息通過mq交給定時服務

推送網(wǎng)關

根據(jù)pushdata 對應的業(yè)務類型 ,根據(jù)不同策略,選擇不同渠道 進行推送,做好服務降級 ,切換渠道的準備,做好消息優(yōu)先級,消息兜底的準備。 這一層 其實整個平臺的靈魂。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容