日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
向消息延遲說bybye:閑魚消息及時到達(dá)方案(詳細(xì))

背景

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的灤南網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

IM消息作為閑魚用戶重要的交易咨詢工具,核心目標(biāo)有兩點,第一是保證用戶的消息不丟失,第二是保證用戶的消息及時送達(dá)接收方。IM消息根據(jù)消息的接收方設(shè)備是否在線,分為離線和在線推送,數(shù)據(jù)顯示目前閑魚每天有超過一半以上的IM消息是走在線通道的,而在線消息的到達(dá)率、及時性是直接影響用戶體驗的,本文將著重分析優(yōu)化在線通道的穩(wěn)定性,保證用戶消息及時到達(dá)。

面臨哪些問題

端內(nèi)長連接中斷

在IM場景中,用戶與云端通信頻繁,且為了實現(xiàn)用戶的消息及時到達(dá),往往采用云端下推消息的方式觸達(dá)用戶,所以用戶在線時設(shè)備與云端會維持一條TCP長連接通道,可以更輕量級的與服務(wù)端進行交互,現(xiàn)代IM即時通訊的下行消息都是通過長連下發(fā)的,閑魚消息使用的是ACCS長連接,ACCS是淘寶無線提供的全雙工、低延時、高安全的通道服務(wù)。但是由于用戶設(shè)備網(wǎng)絡(luò)狀態(tài)的不確定性,可能會發(fā)生各種各樣的網(wǎng)絡(luò)異常情況導(dǎo)致長連接通道中斷,長連接一旦意外中斷,就會導(dǎo)致用戶無法及時收到在線消息,所以我們需要盡可能及時的感知到長連中斷并嘗試重連。

下推的消息未達(dá)

感知長連中斷并重連只能在大多數(shù)時間保證長連接的有效性,但是在長連接無效或不穩(wěn)定期間下推的消息客戶端可能根本收不到,簡單說就是僅僅有重連機制無法保證下行消息必達(dá),可能有以下場景導(dǎo)致下行消息失?。?/p>

  • 服務(wù)端發(fā)送下行消息時長連暢通,消息在傳輸路上通道斷掉,客戶端無法收到
  • 設(shè)備的在線狀態(tài)存在延遲,服務(wù)端下行消息時認(rèn)為設(shè)備在線,實際上設(shè)備已經(jīng)離線,無法收到
  • 客戶端收到了下行消息,但端上后續(xù)處理失敗,比如落庫失敗,消息沒有成功展示給用戶

我們通過數(shù)據(jù)埋點統(tǒng)計得出,accs下行成功率在97%左右

有心急的同學(xué)就要問了,丟了3%的消息嗎?并沒有,這3%的消息不會丟失,只是不保證及時觸達(dá)給用戶。我們的消息同步模型是推拉結(jié)合模式,在用戶拉取消息時會拉取到設(shè)備當(dāng)前位點與服務(wù)端最新位點的所有消息,accs下行失敗的消息會通過主動拉模式獲取到,但客戶端主動拉取消息的觸發(fā)時機有限,主要有以下幾個:

  • 用戶冷啟動app,主動同步消息
  • 用戶主動下拉刷新
  • app后臺切換前臺

收到一條推送消息,客戶端發(fā)現(xiàn)新消息的位點跟本地最新的位點有g(shù)ap,觸發(fā)同步

可見上述主動同步消息的觸發(fā)很大程度上依賴用戶行為或者有沒有收到新消息,難以保證消息及時到達(dá)。如果是用戶高頻打開的IM軟件,這樣也不會有太大的問題,但是閑魚app的活躍度較低,有時候甚至依賴IM消息拉活,而且一條延遲的消息觸達(dá)可能導(dǎo)致用戶錯過一筆交易,閑魚消息不允許有這樣的延遲發(fā)生?;谏鲜龇治?,我們先描述一個數(shù)據(jù)指標(biāo)來反映現(xiàn)狀,通過上面的描述可知,accs消息并不全都是推下來的,也可能是主動拉下來的,如果是推,必定可以及時到達(dá),如果是拉,則受限于用戶行為。拉的這部分消息,我們定義為accs消息補償?shù)竭_(dá),然后計算accs消息補償?shù)竭_(dá)耗時,消息范圍限定為服務(wù)端accs成功下行但是客戶端通過主動拉取同步到的消息,以往的版本這個數(shù)據(jù)在60分鐘左右。需要注意這個數(shù)據(jù)并不是消息觸達(dá)到用戶的耗時,因為如果在線轉(zhuǎn)離線觸達(dá),拉取到消息的時間取決于用戶行為(用戶何時打開了app),但這個數(shù)據(jù)也能大致反映在線消息的到達(dá)延遲狀況。

接下來本文將從長連接的重連和未達(dá)消息重發(fā)兩個方面詳細(xì)講述我們是如何優(yōu)化在線通道穩(wěn)定性的。

長連接重連

長連接為什么會中斷?

百因必有果,我們先來分析下有哪些原因會導(dǎo)致連接中斷,可能有以下原因:

  • 用戶設(shè)備斷網(wǎng)
  • 設(shè)備發(fā)生了網(wǎng)絡(luò)切換
  • 設(shè)備處于弱網(wǎng)環(huán)境,網(wǎng)絡(luò)不穩(wěn)定
  • 設(shè)備網(wǎng)絡(luò)正常,TCP連接由于NAT超時導(dǎo)致連接被運營商中斷

如果是用戶操作導(dǎo)致網(wǎng)絡(luò)狀態(tài)變化的情況,會有網(wǎng)絡(luò)狀態(tài)變化事件通知,這種情況可以監(jiān)聽事件并主動嘗試重連,但現(xiàn)實中的大多數(shù)情況都是“意料之外”。那么如何有效感知到各種異常狀況呢?

心跳檢測

像大多數(shù)探活場景一樣,最有效的檢測手段就是心跳檢測,客戶端通過定時發(fā)送心跳包,可以感知到連接中斷,從及時性效果來看,心跳間隔越短越好,而頻繁的心跳檢測勢必會帶來用戶流量以及電量的損耗,所以我們的目標(biāo)是如何盡可能少的心跳檢測而又盡量及時地感知到長連中斷的意外情況。

狀態(tài)機+消息心跳隊列:

在心跳協(xié)議設(shè)計上,要注意心跳包的核心目標(biāo)是檢測長連通道是否暢通,客戶端主動上行心跳包且能收到服務(wù)端回包,就認(rèn)為長連通道健康,所以上行消息以及回包的數(shù)據(jù)包應(yīng)盡可能小,一般來說,通過協(xié)議頭標(biāo)識心跳包及響應(yīng)即可

心跳策略

心跳策略是實現(xiàn)我們上述目標(biāo)的核心機制,但關(guān)于心跳策略的詳細(xì)設(shè)計甚至可以單獨寫一篇文章,本文僅簡單列舉幾種心跳策略,有興趣的同學(xué)可以閱讀文末推薦的文章繼續(xù)深入研究。

  • 短心跳檢測 初始狀態(tài)連續(xù) ping 3次 收到 ack 后,可以認(rèn)為進入穩(wěn)定狀態(tài)
  • 常規(guī)固定時長心跳(根據(jù)app狀態(tài)不同,頻率可調(diào)Mid+,Mid-, Long)
  • 自適應(yīng)心跳 根據(jù)設(shè)備網(wǎng)絡(luò)狀態(tài)變化自動適應(yīng)的心跳間隔
  • 冗余心跳,app后臺切前臺,主動心跳一次

消息ack與重發(fā)

為了解決上面的問題,引入消息ack與重發(fā)機制,整體思路是客戶端在收到accs消息并處理成功后,給服務(wù)端回一個ack,服務(wù)端下行accs消息時將消息加入重試隊列,收到ack后更新消息到達(dá)狀態(tài),并終止重試。

整體設(shè)計流程圖:

該方案的難點即重試處理器的實現(xiàn)設(shè)計,接下來我們將重點講述這部分的詳細(xì)設(shè)計

重試隊列存儲設(shè)計

我們采用阿里云表格存儲TimeLine模型來存儲下行消息的到達(dá)狀態(tài),阿里云表格存儲是阿里云自研的多模型結(jié)構(gòu)化數(shù)據(jù)存儲,提供海量結(jié)構(gòu)化數(shù)據(jù)存儲以及快速的查詢和分析服務(wù)。表格存儲的分布式存儲和強大的索引引擎能夠支持PB級存儲、千萬TPS以及毫秒級延遲的服務(wù)能力。而Timeline 模型是針對消息數(shù)據(jù)場景所設(shè)計的數(shù)據(jù)模型,它能滿足消息數(shù)據(jù)場景對消息保序、海量消息存儲、實時同步的特殊需求,在IM、Feed流等消息場景應(yīng)用廣泛。

我們給每個用戶設(shè)備定義一個TimeLine,timeline-id定義為userId_deviceId,sequenceId自定義為消息位點,存儲結(jié)構(gòu)如下:

每通過accs成功下行一條消息,則插入到接收用戶設(shè)備的TimeLine中,收到ack后根據(jù)消息id更新消息到達(dá)狀態(tài),同時由于重試動作只發(fā)生在下行消息后較短的一段時間內(nèi),所以我們設(shè)置一個比較短的全局過期時間即可,避免數(shù)據(jù)膨脹。

延遲重試設(shè)計

  • 每通過accs下發(fā)一條消息,先插入到Timeline中,初始狀態(tài)為未達(dá),然后生產(chǎn)一條延遲N秒的延遲消息
  • 每次消費到延遲消息后,讀取tablestore中該消息的到達(dá)狀態(tài),如到達(dá)則終止延遲,否則繼續(xù)
  • 每次重試先判斷設(shè)備是否在線,如果設(shè)備不在線,轉(zhuǎn)發(fā)離線通道并終止重試,如果設(shè)備在線,則重推未到達(dá)的消息,并再次延遲N秒消費
  • 每條消息的重試生命周期中用的同一條延遲消息,最多重試消費M次,超過次數(shù)不再重試并打日志埋點,后續(xù)可以監(jiān)控這種情況并基于這個數(shù)據(jù)進行優(yōu)化

延遲重發(fā)策略

延遲重發(fā)策略是指在重發(fā)流程中,如何選擇合適的延遲時間來使得重發(fā)的效率最高。不同用戶在不同時間、地點所處的網(wǎng)絡(luò)環(huán)境差別較大,網(wǎng)絡(luò)恢復(fù)到穩(wěn)定態(tài)所需要的時間也有差異,需要選用合適的延遲策略來保證重發(fā)效率,最優(yōu)的延遲策略的目標(biāo)是在最短的時間內(nèi),使用最少的重發(fā)次數(shù)將消息投遞成功。

固定延遲時間

要想找到最優(yōu)的延遲策略,必須從數(shù)據(jù)中通過分析得到答案,天馬行空的想象往往離實際相差甚遠(yuǎn),我們先采用固定的延遲時間(10s)最大重試6次來分析一波數(shù)據(jù)

我們通過這組數(shù)據(jù)可以看到,有約85%的消息在40s內(nèi)重發(fā)可以投遞成功,還有12%的消息在達(dá)到最大重試次數(shù)后依舊沒有收到ack,在4次重試之后,第5次成功只有2.03%,第6次只有0.92%,繼續(xù)重發(fā)的收益已經(jīng)變得很低,6次以后還有部分消息沒有收到ack,這部分消息如果用固定延遲時間策略,性價比很低,頻繁重發(fā)浪費系統(tǒng)資源,我們繼續(xù)改進策略。

固定延遲+固定步長遞增

考慮到部分用戶的網(wǎng)絡(luò)短時間無法恢復(fù),頻繁的短間隔重發(fā)價值不大,我們采用4次固定短間隔延遲N秒后,之后每次延遲時間都是上一次延遲時間遞增固定步長M秒的策略,直到收到ack、用戶設(shè)備離線或者達(dá)到了最大延遲時間MAX(N)。這種策略一定程度上可以解決固定延遲時間重發(fā)策略的問題,但如果用戶短時間網(wǎng)絡(luò)無法恢復(fù),每次重發(fā)都要重新遞增,也不是一種最優(yōu)解。

自適應(yīng)延遲

設(shè)計流程圖:

如上圖,我們最終衍生出了自適應(yīng)延遲策略,自適應(yīng)延遲是指根據(jù)用戶的網(wǎng)絡(luò)狀況,采取自動調(diào)整的延遲時間,以期望達(dá)到最高的重發(fā)效率,新消息先通過4次固定N秒的短延遲來探測設(shè)備的網(wǎng)絡(luò)狀況,一旦網(wǎng)絡(luò)恢復(fù),我們將設(shè)備的N值清空,設(shè)備N值是指根據(jù)上幾次重發(fā)經(jīng)驗,當(dāng)前設(shè)備網(wǎng)絡(luò)能回復(fù)ack所需要的最短時間,默認(rèn)情況該值為空,代表用戶設(shè)備網(wǎng)絡(luò)正常。4次重發(fā)后依舊收不到ack,我們嘗試讀取設(shè)備N值,如果為空,則取初始值,以后每次延遲都遞增固定步長M,并在重發(fā)后更新當(dāng)前設(shè)備的N值,直到消息收到ack或者達(dá)到了最大延遲時間MAX(N)。

新老版本兼容性

需要注意的是老版本的app是不會回ack的,如果下發(fā)給老版本設(shè)備的消息也加入重試隊列,那此類消息將一直重試到最大次數(shù)才會終止,無端消耗資源,所以我們設(shè)計在accs長連建立之后,客戶端主動上行一條設(shè)備信息,其中包含app的版本號,服務(wù)端存儲一定時間,在將消息加入重試隊列之前,先校驗接收者設(shè)備app的版本號,符合要求再加入重試隊列。

方案效果

消息重連重發(fā)方案上線后,我們上面定義的指標(biāo)accs補償?shù)竭_(dá)時間從60分鐘大幅降低至15分鐘,降幅達(dá)75%,從而印證了我們的技術(shù)分析,同時用戶有關(guān)消息延遲的輿情反饋每周不超過2個,可見消息重發(fā)機制對保證用戶消息及時到達(dá)成效顯著。

未來展望

消息在線通道穩(wěn)定性優(yōu)化至此已告一段落,未來我們將繼續(xù)優(yōu)化閑魚消息的使用體驗,包括基礎(chǔ)功能的完善以及基礎(chǔ)體驗的提升。

  • 基礎(chǔ)功能方面,我們在近期的版本中已經(jīng)支持了消息撤回、草稿功能,后續(xù)將逐步支持發(fā)送定位,會話分組、備注,消息搜索等功能;
  • 基礎(chǔ)體驗方面,我們對閑魚消息的UI樣式做了優(yōu)化升級,并優(yōu)化了app消息tab頁的cpu及內(nèi)存使用,后續(xù)將繼續(xù)從流量、電量、性能方面繼續(xù)優(yōu)化消息的使用體驗。

文章名稱:向消息延遲說bybye:閑魚消息及時到達(dá)方案(詳細(xì))
網(wǎng)站URL:http://www.dlmjj.cn/article/ccesidi.html