京東京麥商家開放平臺的訊息推送架構演進之路

jsjsjjs發表於2018-01-10

本文來自京東商城京麥平臺組開發工程師曹德然的技術分享,感謝作者。

1、前言

京麥實時訊息推送是京東的京麥商家開放平臺的核心組成部分。從訊息源到訊息中心再到觸達使用者,以及最終根據訊息協議呼起操作頁面,京麥實時訊息推送是一個完整且健康的生態閉環。下面我會詳細的介紹下京麥實時訊息推送是如何在演變中不斷完善的。

京麥訊息框架示意圖:

我將從京麥商家開放平臺的訊息接入、MC系統搭建、訊息配置、訊息觸達、訊息監控五個方面來闡述和分享京麥實時訊息推送架構在2017年的成長。

即時通訊技術學習交流:

– 即時通訊開發交流群:215891622[推薦]

– 移動端IM開發推薦文章:《新手入門一篇就夠:從零開發移動端IM

(本文同步釋出於:http://www.52im.net/thread-1321-1-1.html

2、京東相關技術文章

Netty乾貨分享:京東京麥的生產級TCP閘道器技術實踐總結

從零到卓越:京東客服即時通訊系統的技術架構演進歷程

3、本文分享者

曹德然

2016年加入京東,目前就職於京東商城京麥平臺組,從事京東商家開放平臺的相關開發工作;

熱愛技術,熟悉各種常用開源框架,有豐富的大型分散式系統、高併發系統的開發經驗;

熱衷於對大資料的研究,對Hadoop、HBase以及ES有深入研究和理解。

4、訊息推送的接入

原有的訊息推送接入存在的弊端主要有以下兩點:

1)訊息接入方式多樣化:

京麥訊息包含業務系統類訊息、服務資訊類訊息以及其他各類訊息型別,訊息來源多種多樣。當時為了快速的接入各種訊息源,提供了servlet接入、client接入、JMQ接入等,接入方式多樣化,加上沒有完善的監控系統,這樣就導致了一個很尷尬的問題,我們自己都不清楚我們的訊息系統到底接入了多少種型別的訊息;

2)訊息處理中心與訊息源強依賴:

Anycall是系統訊息的主要入口,從Anycall到原訊息處理後臺是通過servlet呼叫來實現的,系統間的耦合性太強。

我們後期針對新一代訊息推送做的改善如下:

1)所有的系統訊息統一由Anycall進行接入,清晰化訊息型別邊界;

2)京麥訊息的接入方式統一:所有京麥訊息統一通過JMQ非同步化接入,並且根據不同業務通過不同的topic進行隔離,避免資料量大的業務(比如訂單訊息)對其他業務的阻塞;

3)麥圈的打造、咚咚離線訊息的接入等專案的完成,使得京麥訊息的生態不斷豐富,同時也極大的增加了使用者粘性。

5、MC(京麥訊息推送中心)系統的搭建

▲ 原京麥訊息推送系統的接入邏輯圖

如上圖所示,原先京麥訊息推送的主要痛點如下:

1)接入方式不統一;

2)不穩定、大促被降級;

3)訊息處理邏輯複雜,接入新的訊息源困難;

4)沒有完善的訊息追蹤,訊息統計。

▲  新京麥訊息推送系統的接入邏輯圖

基於上述原因,重新打造了一個穩定、專一的訊息處理中心——MC系統(如上圖所示):

1)統一的JMQ接入,在上一部分已經介紹過了;

2)MC系統與其他系統沒有耦合,不在存在由於訊息量過大對京麥其他業務造成影響的問題,實現了在大促時可以提供穩定的服務;

3)MC系統使用了broker分發的模式:模組化可插拔的處理方式,使得新訊息源的接入變的極其簡單,大大的縮短了開發的週期。正是這種broker分發模式的存在,咚咚離線訊息、ISV訊息訂閱等專案實現了快速接入,並提供服務;

4)在MC系統搭建的過程中,全鏈路訊息追蹤、訊息統計也得到了實現(在第五節訊息監控會詳細講解)。

6、推送訊息組裝的統一配置化

▲  新京麥訊息推送系統的訊息組裝處理邏輯圖

訊息過濾、訊息組裝、訊息儲存、訊息推送是京麥訊息中心的四大核心。訊息組裝是根據不同訊息的不同配置來進行的,而這些配置是在開發側的config配置中心來配置的,因此產品或者運營想從Anycall新接入一種系統訊息所做的工作量是極其大的。

基於這個原因,我們將所有的配置環節統一到了一個頁面。配置資訊的獲取新增三層快取(Guava Cache+redis+DB)來應對海量呼叫。統一配置頁面的存在使得業務類系統訊息的接入變的簡單快捷。

另一個比較大的優化是呼起協議配置化。之前訊息的呼起協議是寫死在訊息體裡面,極其的不靈活,甚至很多系統訊息無法對接呼起協議直接將連結暴露在訊息體裡,使用者的體驗是很不好的。為此,呼起協議對接統一協議管理中心(後面文章會詳細介紹),所有的呼起協議會根據訊息裡攜帶的protocolID從統一協議管理中心獲取。呼起協議的中心化、配置化使得訊息在系統流轉的過程中不再需要關注具體的呼起協議,簡化了訊息在系統中的處理邏輯。而且協議中心化之後,協議的內容可以直接呈現給產品和運營,整個訊息呼起的過程變得更加的清晰。

7、訊息推送的觸達(向客戶端擴散)邏輯

▲  新京麥訊息推送系統的訊息觸達邏輯圖

京麥訊息觸達分為線上通知和離線通知:

1)線上通知是通過服務端和客戶端的TCP長連線來實現的;

2)離線通知在最開始只有IOS的apns推送,Android系統無法很好的進行離線通知的推送一直是一大痛點。

針對Android系統無法很好的進行離線通知的推送的問題(俗稱Android網路、程式保活黑科技這些東西,詳見:《應用保活終極總結(一):Android6.0以下的雙程式守護保活實踐》、《應用保活終極總結(二):Android6.0及以上的保活實踐(程式防殺篇)》、《應用保活終極總結(三):Android6.0及以上的保活實踐(被殺復活篇)》),我們開發了Android推送的開源包,對接了華為、小米、魅族三大廠商,實現了Android離線通知的推送。

8、完整的訊息推送路徑監控

▲  新京麥訊息推送系統的訊息監控邏輯圖

全鏈路訊息追蹤系統,整合從訊息源到最終的訊息推送,整個鏈路各個節點訊息的流轉狀況,並且非同步化儲存。從上圖可以看到系統中的處理方式是,分別訂閱JMQ的同一個topic實現將訊息日誌分別儲存在ES和HBase,存ES保證了我可以在訊息管理後臺對所有訊息進行清晰透明化的追蹤查詢,存HBase是為了可以將資料長久的儲存並且進一步的分析。

訊息統計是依託於京東大資料平臺來實現的。將HBase裡的資料匯入到京東資料集市,從而對訊息資料進行各個維度的統計分析。

9、本文小結

京麥實時訊息推送架鬆經過一年的成長,在穩定、監控、內容豐富程度上有了長足的發展。下一步的規劃是完整的訊息失敗重試機制、提高訊息送達率、訊息推送產品化等。

京麥是一個年輕且充滿活力的團隊,京麥訊息系統伴隨著京麥的成長,不斷的完善優化。

附錄:更多相關技術文章

[1] 有關推送技術的文章:

iOS的推送服務APNs詳解:設計思路、技術原理及缺陷等

信鴿團隊原創:一起走過 iOS10 上訊息推送(APNS)的坑

Android端訊息推送總結:實現原理、心跳保活、遇到的問題等

掃盲貼:認識MQTT通訊協議

一個基於MQTT通訊協議的完整Android推送Demo

IBM技術經理訪談:MQTT協議的制定歷程、發展現狀等

求教android訊息推送:GCM、XMPP、MQTT三種方案的優劣

移動端實時訊息推送技術淺析

掃盲貼:淺談iOS和Android後臺實時訊息推送的原理和區別

絕對乾貨:基於Netty實現海量接入的推送服務技術要點

移動端IM實踐:谷歌訊息推送服務(GCM)研究(來自微信)

為何微信、QQ這樣的IM工具不使用GCM服務推送訊息?

極光推送系統大規模高併發架構的技術實踐分享

從HTTP到MQTT:一個基於位置服務的APP資料通訊實踐概述

魅族2500萬長連線的實時訊息推送架構的技術實踐分享

專訪魅族架構師:海量長連線的實時訊息推送系統的心得體會

深入的聊聊Android訊息推送這件小事

基於WebSocket實現Hybrid移動應用的訊息推送實踐(含程式碼示例)

一個基於長連線的安全可擴充套件的訂閱/推送服務實現思路

實踐分享:如何構建一套高可用的移動端訊息推送系統?

Go語言構建千萬級線上的高併發訊息推送系統實踐(來自360公司)

騰訊信鴿技術分享:百億級實時訊息推送的實戰經驗

百萬線上的美拍直播彈幕系統的實時推送技術實踐之路

京東京麥商家開放平臺的訊息推送架構演進之路

>> 更多同類文章 ……

[2] 有關IM/推送的通訊格式、協議的選擇:

簡述傳輸層協議TCP和UDP的區別

為什麼QQ用的是UDP協議而不是TCP協議?

移動端即時通訊協議選擇:UDP還是TCP?

如何選擇即時通訊應用的資料傳輸格式

強列建議將Protobuf作為你的即時通訊應用資料傳輸格式

全方位評測:Protobuf效能到底有沒有比JSON快5倍?

移動端IM開發需要面對的技術問題(含通訊協議選擇)

簡述移動端IM開發的那些坑:架構設計、通訊協議和客戶端

理論聯絡實際:一套典型的IM通訊協議設計詳解

58到家實時訊息系統的協議設計等技術實踐分享

詳解如何在NodeJS中使用Google的Protobuf

技術掃盲:新一代基於UDP的低延時網路傳輸層協議——QUIC詳解

>> 更多同類文章 ……

[3] 有關IM/推送的心跳保活處理:

應用保活終極總結(一):Android6.0以下的雙程式守護保活實踐

應用保活終極總結(二):Android6.0及以上的保活實踐(程式防殺篇)

應用保活終極總結(三):Android6.0及以上的保活實踐(被殺復活篇)

Android程式保活詳解:一篇文章解決你的所有疑問

Android端訊息推送總結:實現原理、心跳保活、遇到的問題等

深入的聊聊Android訊息推送這件小事

為何基於TCP協議的移動端IM仍然需要心跳保活機制?

微信團隊原創分享:Android版微信後臺保活實戰分享(程式保活篇)

微信團隊原創分享:Android版微信後臺保活實戰分享(網路保活篇)

移動端IM實踐:實現Android版微信的智慧心跳機制

移動端IM實踐:WhatsApp、Line、微信的心跳策略分析

>> 更多同類文章 ……

[4] 有關即時通訊架構設計:

淺談IM系統的架構設計

簡述移動端IM開發的那些坑:架構設計、通訊協議和客戶端

一套海量線上使用者的移動端IM架構設計實踐分享(含詳細圖文)

一套原創分散式即時通訊(IM)系統理論架構方案

從零到卓越:京東客服即時通訊系統的技術架構演進歷程

蘑菇街即時通訊/IM伺服器開發之架構選擇

騰訊QQ1.4億線上使用者的技術挑戰和架構演進之路PPT

微信後臺基於時間序的海量資料冷熱分級架構設計實踐

微信技術總監談架構:微信之道——大道至簡(演講全文)

如何解讀《微信技術總監談架構:微信之道——大道至簡》

快速裂變:見證微信強大後臺架構從0到1的演進歷程(一)

17年的實踐:騰訊海量產品的技術方法論

移動端IM中大規模群訊息的推送如何保證效率、實時性?

現代IM系統中聊天訊息的同步和儲存方案探討

>> 更多同類文章 ……

[5] 開源移動端即時通訊技術框架資料:

開源移動端IM技術框架MobileIMSDK:快速入門

開源移動端IM技術框架MobileIMSDK:常見問題解答

開源移動端IM技術框架MobileIMSDK:壓力測試報告

>> 更多同類文章 ……

[6] 更多即時通訊技術好文分類:

http://www.52im.net/forum.php?mod=collection&op=all

(本文同步釋出於:http://www.52im.net/thread-1321-1-1.html


相關文章