1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        微信消息技術(shù)架構(gòu)演進

        共 1510字,需瀏覽 4分鐘

         ·

        2024-07-22 08:05

        之前我們介紹了美團到家商品庫存系統(tǒng)演進之路,今天繼續(xù)介紹國內(nèi)知名互聯(lián)網(wǎng)產(chǎn)品的技術(shù)架構(gòu)。

        微信DAU超過了13.4億,是國民級應(yīng)用。

        微信之父是張小龍,一個程序員出身的產(chǎn)品經(jīng)理。

        我們今天一起看看微信技術(shù)架構(gòu)的演進,學(xué)習(xí)下優(yōu)秀架構(gòu)是如何長出來的。

        微信是由廣研院開發(fā)出來的,在此之前,廣研院主要是負責(zé)QQ郵箱系統(tǒng)。

        郵箱的核心是消息的收發(fā),這一點和微信很像,所以微信消息收發(fā)的很多技術(shù)架構(gòu)思想都源于郵箱的存儲轉(zhuǎn)發(fā)機制。

        微信作為即時消息軟件,需要滿足消息收發(fā)實時性以及消息的不丟。

        比如用戶A發(fā)送消息給用戶B,首先要將消息發(fā)送到接入層、邏輯層、存儲層。

        connectSvr主要負責(zé)長鏈接的接入,是接入層。

        接入層將消息轉(zhuǎn)發(fā)到sendSvr邏輯層,進行消息處理,包括一些反垃圾、黑名單處理等。

        之后消息會進入msgStore存儲層存起來。

        之后消息就開始向用戶B發(fā)送。

        邏輯層sendSvr同時轉(zhuǎn)發(fā)消息到通知服務(wù)PushSvr,也就是圖中4的部分。

        pushSvr發(fā)送push tips給手機操作系統(tǒng)的push系統(tǒng),比如蘋果的apnsPush。

        正常情況下,可以通過接入層connectSvr與用戶B的長鏈接發(fā)送消息給到B。

        同時因為操作系統(tǒng),比如蘋果iOS,如果APP退到后臺進程,操作系統(tǒng)會釋放所有的資源,比如CPU、網(wǎng)絡(luò)、內(nèi)存等,導(dǎo)致之前建立的長鏈接斷開,也就是圖中的5.1的長鏈接是不可達的,需要依賴5.2的蘋果自身的apns通道發(fā)送通知。

        當(dāng)B用戶收到新消息通知后,會進行消息的拉取。

        手機B會發(fā)起拉取消息請求到接入層ConnectSvr,接入層將請求轉(zhuǎn)發(fā)到邏輯層的ReceiveSvr處理,ReceiveSvr從存儲層MsgStore獲取消息。

        這樣一條從A發(fā)送到B的消息,可以保證在100ms內(nèi)收到,但如果iOS用戶退出了自己的APP,在蘋果apns服務(wù)正常工作的情況下,也是可以保證秒級內(nèi)B收到A的消息的。

        為了實現(xiàn)消息的不丟,最簡單的方案是手機端在收到每條消息后都發(fā)送給服務(wù)端一次ack確認(rèn),但此方案會導(dǎo)致手機端和服務(wù)端交互過多。

        同時在遇到弱網(wǎng)情況時,ack還會丟失。

        為了實現(xiàn)消息的不丟,微信架構(gòu)引入了sequence機制。

        1)每個用戶都有42億的sequence空間,從小到大連續(xù)分配;

        2)每個用戶的每條消息都需要分配一個sequence;

        3)服務(wù)器存儲每個用戶已經(jīng)分配到的最大sequence;

        4)手機端存儲已收取消息的最大sequence;

        當(dāng)手機端和服務(wù)端多有自己的sequence存儲之后,雙方就可以根據(jù)sequence的差異來收取消息了。

        首先,根據(jù)手機端和服務(wù)端之間的sequence差異,可以輕松實現(xiàn)增量下發(fā)手機端未收取下發(fā)去的消息。

        如果在弱網(wǎng)情況下,網(wǎng)絡(luò)丟包的概率很高,由于手機端只有在確切收到消息后才更新本地的sequence,所以即時服務(wù)器的回包丟了,手機端等待超時后重新到服務(wù)器拉取舊的sequence的消息,同樣可以正確的獲取未下發(fā)的消息。

        比如手機端當(dāng)前的seq_cli=100,而服務(wù)端的seq_svr=150,說明100-150之間的消息未能獲取到,所以手機端可以拉取sequence[101-150]的消息,并且將手機端的seq_cli設(shè)置為150。

        以上就是微信架構(gòu)如何實現(xiàn)消息收發(fā)的實時性和消息不丟的方案,返璞歸真,都是非常樸實的解決方案。

        瀏覽 73
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            性爱婷婷 | 做爱免费网站 | 欧美暴操| 欧美精品性爱视频 | 97视频国产 | 日韩高清无码毛片 | 色玖悠悠 | 真实国产乱子伦对白视频完整版 | 红桃精品91一区二区久 | 欧美成人午夜精品三级理论 |