Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 499, comments - 13, trackbacks - 0, articles - 1

          為了更好地分類閱讀52im.net 總計1000多篇精編文章,我將在每周三推送新的一期技術(shù)文集,本次是第4 期。

          [- 1 -] 不為人知的網(wǎng)絡編程(一):淺析TCP協(xié)議中的疑難雜癥(上篇)

          [鏈接] http://www.52im.net/thread-1003-1-1.html

          [摘要] 可能大家都知道TCP是三次交互完成連接的建立,四次交互來斷開一個連接,那為什么是三次握手和四次揮手呢?反過來不行嗎?


          [- 2 -] 不為人知的網(wǎng)絡編程(二):淺析TCP協(xié)議中的疑難雜癥(下篇)

          [鏈接] http://www.52im.net/thread-1004-1-1.html

          [摘要] 接上篇《不為人知的網(wǎng)絡編程(一):淺析TCP協(xié)議中的疑難雜癥(上篇)》,我們提到第6個疑問:TCP的頭號疼癥TIME_WAIT狀態(tài),下面我們繼續(xù)這個問題的解答。


          [-3 -] 不為人知的網(wǎng)絡編程(三):關閉TCP連接時為什么會TIME_WAIT、CLOSE_WAIT

          [鏈接] http://www.52im.net/thread-1007-1-1.html

          [摘要] 這次就和大家分享一下我們的netframework服務總會拋出一個“connet reset by peer”的原因吧。


          [-4 -] 不為人知的網(wǎng)絡編程(四):深入研究分析TCP的異常關閉

          [鏈接] http://www.52im.net/thread-1014-1-1.html

          [摘要] 大家都明白是“網(wǎng)絡被對端重置了”,但究竟什么情況下會導致這種情況呢?本文就對TCP的各種關閉情況做了進一步的測試研究。


          [- 5 -] 不為人知的網(wǎng)絡編程(五):UDP的連接性和負載均衡

          [鏈接] http://www.52im.net/thread-1018-1-1.html

          [摘要] 本文將從實踐出發(fā),討論UDP在實際應用中的連接性和負載均衡問題。


          [- 6 -] 不為人知的網(wǎng)絡編程(六):深入地理解UDP協(xié)議并用好它

          [鏈接] http://www.52im.net/thread-1024-1-1.html

          [摘要]本文接上篇《不為人知的網(wǎng)絡編程(五):UDP的連接性和負載均衡》,將從實踐出發(fā),討論如何深入地理解UDP協(xié)議并在實踐中用好它。


          [- 7 -] 不為人知的網(wǎng)絡編程(七):如何讓不可靠的UDP變的可靠?

          [鏈接] http://www.52im.net/thread-1293-1-1.html

          [摘要] 在 UDP 之上做一層可靠,很多朋友認為這是很不靠譜的事情,也有朋友認為這是一個大殺器,可以解決實時領域里大部分問題。涉及到實時傳輸我們都會先考慮 RUDP,RUDP 應用在我們APP核心傳輸體系的各個方面,但不同的系統(tǒng)場景我們設計了不同的 RUDP 方式,所以基于那些激烈的討論和我們使用的經(jīng)驗,我決定扒一扒 RUDP,來給大家分享如何讓UDP變的可靠的實踐經(jīng)驗。


          [- 8 -] 不為人知的網(wǎng)絡編程(八):從數(shù)據(jù)傳輸層深度解密HTTP

          [鏈接] http://www.52im.net/thread-2456-1-1.html

          [摘要] 市面上講HTTP協(xié)議的文章很多,但深入到傳輸層從2進制的角度來解析,則相當少見。保證全篇讀完之后,你對HTTP的理解會上升一個臺階!


          [- 9 -] 不為人知的網(wǎng)絡編程(九):理論聯(lián)系實際,全方位深入理解DNS

          [鏈接] http://www.52im.net/thread-2740-1-1.html

          [摘要] 當我們發(fā)現(xiàn)可以上QQ但不能瀏覽網(wǎng)頁時,我們會想到可能是域名服務器掛掉了;當我們用別人提供的hosts文件瀏覽到一個“不存在”的網(wǎng)頁時,我們會了解到域名解析系統(tǒng)的脆弱。然而關于DNS還有一大堆故事值得我們?nèi)A聽,去思考。


          [- 10 -] 不為人知的網(wǎng)絡編程(十):深入操作系統(tǒng),從內(nèi)核理解網(wǎng)絡包的接收過程(Linux篇)

          [鏈接] http://www.52im.net/thread-3247-1-1.html

          [摘要] 這篇文章將用圖解的方式,從操作系統(tǒng)這一層來深度理解一下網(wǎng)絡包的接收過程。


          [- 11 -] 不為人知的網(wǎng)絡編程(十一):從底層入手,深度分析TCP連接耗時的秘密

          [鏈接] http://www.52im.net/thread-3265-1-1.html

          [摘要] TCP的開銷到底有多大,能否進行量化。一條TCP連接的建立需要耗時延遲多少,是多少毫秒,還是多少微秒?能不能有一個哪怕是粗略的量化估計?我今天只分享我在工作實踐中遇到的比較高發(fā)的各種情況。


          [- 12 -] 不為人知的網(wǎng)絡編程(十二):徹底搞懂TCP協(xié)議層的KeepAlive保活機制

          [鏈接] http://www.52im.net/thread-3506-1-1.html

          [摘要] 次借本文想把TCP協(xié)議的KeepAlive保活機制給詳細的整理出來,以便大家能深入其中一窺究竟。


          [- 13 -] 不為人知的網(wǎng)絡編程(十三):深入操作系統(tǒng),徹底搞懂127.0.0.1本機網(wǎng)絡通信

          [鏈接] http://www.52im.net/thread-3590-1-1.html

          [摘要] 今天咱們就把 127.0.0.1 本機網(wǎng)絡通信相關問題搞搞清楚!


          [- 14 -] 不為人知的網(wǎng)絡編程(十四):拔掉網(wǎng)線再插上,TCP連接還在嗎?一文即懂!

          [鏈接] http://www.52im.net/thread-3846-1-1.html

          [摘要] 本篇文章,我們就從系統(tǒng)層面深入地探討一個有趣的TCP技術(shù)問題:拔掉網(wǎng)線后,再插上,原本的這條TCP連接還在嗎?或者說它還“好”嗎?

          我是Jack Jiang,我為自已帶鹽!

          https://github.com/JackJiang2011/MobileIMSDK/

          posted @ 2022-11-01 12:14 Jack Jiang 閱讀(104) | 評論 (0)編輯 收藏

          本文作者網(wǎng)易云信高級前端開發(fā)工程師李寧,本文有修訂。

          1、引言

          在IM客戶端的使用場景中,基于本地數(shù)據(jù)的全文檢索功能扮演著重要的角色,最常用的比如:查找聊天記錄、聯(lián)系人等。

          類似于IM中的聊天記錄查找、聯(lián)系人搜索這類功能,有了全文檢索能力后,確實能大大提高內(nèi)容查找的效率,不然,讓用戶手動翻找,確實降低了用戶體驗。

          本文將要分享的是,網(wǎng)易云信基于Electron的PC端是如何實現(xiàn)IM客戶端全文檢索能力的。

          學習交流:

          (本文已同步發(fā)布于:http://www.52im.net/thread-4065-1-1.html

          2、關于作者

          李寧:網(wǎng)易云信高級前端開發(fā)工程師,負責音視頻 IM SDK 的應用開發(fā)、組件化開發(fā)及解決方案開發(fā),對 React、PaaS 組件化設計、多平臺的開發(fā)與編譯有豐富的實戰(zhàn)經(jīng)驗。

          3、系列文章

          本文是系列文章中的第6篇,本系列總目錄如下:

          4、什么是全文檢索

          所謂全文檢索,就是要在大量內(nèi)容中找到包含某個單詞出現(xiàn)位置的技術(shù)。

          在傳統(tǒng)的關系型數(shù)據(jù)庫中,只能通過LIKE條件查詢來實現(xiàn),這樣有幾個弊端:

          • 1)無法使用數(shù)據(jù)庫索引,需要遍歷全表,性能較差;
          • 2)搜索效果差,只能首尾位模糊匹配,無法實現(xiàn)復雜的搜索需求;
          • 3)無法得到內(nèi)容與搜索條件的相關性。

          我們在 IM 的 iOS、安卓以及桌面端中都實現(xiàn)了基于 SQLite 等庫的本地數(shù)據(jù)全文檢索功能,但是在 Web 端和 基于Electron的PC端上缺少了這部分功能。

          因為在 Web 端,由于瀏覽器環(huán)境限制,能使用的本地存儲數(shù)據(jù)庫只有 IndexDB,暫不在討論的范圍內(nèi)。但在基于Electron的PC端上,雖然也是內(nèi)置了 Chromium 的內(nèi)核,但是因為可以使用 Node.js 的能力,于是乎選擇的范圍就多了一些。本文內(nèi)容我們具體以基于Electron的IM客戶端為例,來討論全文檢索技術(shù)實現(xiàn)。

          PS:如果你不了解什么是Electron技術(shù),讀一下這篇《快速了解Electron:新一代基于Web的跨平臺桌面技術(shù)》。

          我們先來具體看下該如何實現(xiàn)全文檢索。

          要實現(xiàn)全文檢索,離不開以下兩個知識點:

          • 1)倒排索引;
          • 2)分詞。

          這兩個技術(shù)是實現(xiàn)全文檢索的技術(shù)以及難點,其實現(xiàn)的過程相對比較復雜,在聊全文索引的實現(xiàn)前,我們具體學習一下這兩個技術(shù)的原理。

          5、什么是倒排索引

          先簡單介紹下倒排索引,倒排索引的概念區(qū)別于正排索引:

          • 1)正排索引:是以文檔對象的唯一 ID 作為索引,以文檔內(nèi)容作為記錄的結(jié)構(gòu);
          • 2)倒排索引:是以文檔內(nèi)容中的單詞作為索引,將包含該詞的文檔 ID 作為記錄的結(jié)構(gòu)。

          以倒排索引庫 search-index 舉個實際的例子:

          在我們的 IM 中,每條消息對象都有 idClient 作為唯一 ID,接下來我們輸入「今天天氣真好」,將其每個中文單獨分詞(分詞的概念我們在下文會詳細分享),于是輸入變成了「今」、「天」、「天」、「氣」、「真」、「好」。再通過 search-index 的 PUT 方法將其寫入庫中。

          最后看下上述例子存儲內(nèi)容的結(jié)構(gòu):

          如是圖所示:可以看到倒排索引的結(jié)構(gòu),key 是分詞后的單個中文、value 是包含該中文消息對象的 idClient 組成的數(shù)組。

          當然:search-index 除了以上這些內(nèi)容,還有一些其他內(nèi)容,例如 Weight、Count 以及正排的數(shù)據(jù)等,這些是為了排序、分頁、按字段搜索等功能而存在的,本文就不再細細展開了。

          6、什么是分詞

          6.1基本概念

          分詞就是將原先一條消息的內(nèi)容,根據(jù)語義切分成多個單字或詞句,考慮到中文分詞的效果以及需要在 Node 上運行,我們選擇了Nodejieba作為基礎分詞庫。

          以下是 jieba 分詞的流程圖:

          以“去北京大學玩”為例,我們選擇其中最為重要的幾個模塊分析一下。

          6.2加載詞典

          jieba 分詞會在初始化時先加載詞典,大致內(nèi)容如下:

          6.3構(gòu)建前綴詞典

          接下來會根據(jù)該詞典構(gòu)建前綴詞典,結(jié)構(gòu)如下:

          其中:“北京大”作為“北京大學”的前綴,它的詞頻是0,這是為了便于后續(xù)構(gòu)建 DAG 圖。

          6.4構(gòu)建 DAG 圖

          DAG 圖是 Directed Acyclic Graph 的縮寫,即有向無環(huán)圖。

          基于前綴詞典,對輸入的內(nèi)容進行切分。

          其中:

          • 1)“去”沒有前綴,因此只有一種切分方式;
          • 2)對于“北”,則有“北”、“北京”、“北京大學”三種切分方式;
          • 3)對于“京”,也只有一種切分方式;
          • 4)對于“大”,有“大”、“大學”兩種切分方式;
          • 5)對于“學”和“玩”,依然只有一種切分方式。

          如此,可以得到每個字作為前綴詞的切分方式。

          其 DAG 圖如下圖所示:

          6.5最大概率路徑計算

          以上 DAG 圖的所有路徑如下:

          • 去/北/京/大/學/玩
          • 去/北京/大/學/玩
          • 去/北京/大學/玩
          • 去/北京大學/玩

          因為每個節(jié)點都是有權(quán)重(Weight)的,對于在前綴詞典里的詞語,它的權(quán)重就是它的詞頻。因此我們的問題就是想要求得一條最大路徑,使得整個句子的權(quán)重最高。

          這是一個典型的動態(tài)規(guī)劃問題,首先我們確認下動態(tài)規(guī)劃的兩個條件。

          1)重復子問題:

          對于節(jié)點 i 和其可能存在的多個后繼節(jié)點 j 和 k:

          • 1)任意通過i到達j的路徑的權(quán)重 = 該路徑通過i的路徑權(quán)重 + j的權(quán)重,即 R(i -> j) = R(i) + W(j);
          • 2)任意通過i到達k的路徑的權(quán)重 = 該路徑通過i的路徑權(quán)重 + k的權(quán)重,即 R(i -> k) = R(i) + W(k)。

          即對于擁有公共前驅(qū)節(jié)點 i 的 j 和 k,需要重復計算到達 i 路徑的權(quán)重。

          2)最優(yōu)子結(jié)構(gòu):

          設整個句子的最優(yōu)路徑為 Rmax,末端節(jié)點為 x,多個可能存在的前驅(qū)節(jié)點為 i、j、k。

          得到公式如下:

          Rmax = max(Rmaxi, Rmaxj, Rmaxk) + W(x)

          于是問題變成了求解 Rmaxi、Rmaxj 以及 Rmaxk,子結(jié)構(gòu)里的最優(yōu)解即是全局最優(yōu)解的一部分。

          如上,最后計算得出最優(yōu)路徑為“去/北京大學/玩”。

          6.6HMM 隱式馬爾科夫模型

          對于未登陸詞,jieba 分詞采用 HMM(Hidden Markov Model 的縮寫)模型進行分詞。

          它將分詞問題視為一個序列標注問題,句子為觀測序列,分詞結(jié)果為狀態(tài)序列。

          jieba 分詞作者在 issue 中提到,HMM 模型的參數(shù)基于網(wǎng)上能下載到的 1998 人民日報的切分語料,一個 MSR 語料以及自己收集的 TXT 小說、用 ICTCLAS 切分,最后用 Python 腳本統(tǒng)計詞頻而成。

          該模型由一個五元組組成,并有兩個基本假設。

          五元組:

          • 1)狀態(tài)值集合;
          • 2)觀察值集合;
          • 3)狀態(tài)初始概率;
          • 4)狀態(tài)轉(zhuǎn)移概率;
          • 5)狀態(tài)發(fā)射概率。

          基本假設:

          • 1)齊次性假設:即假設隱藏的馬爾科夫鏈在任意時刻 t 的狀態(tài)只依賴于其前一時刻 t-1 的狀態(tài),與其它時刻的狀態(tài)及觀測無關,也與時刻 t 無關;
          • 2)觀察值獨立性假設:即假設任意時刻的觀察值只與該時刻的馬爾科夫鏈的狀態(tài)有關,與其它觀測和狀態(tài)無關。

          狀態(tài)值集合即{ B: begin, E: end, M: middle, S: single },表示每個字所處在句子中的位置,B 為開始位置,E 為結(jié)束位置,M 為中間位置,S 是單字成詞。

          觀察值集合就是我們輸入句子中每個字組成的集合。

          狀態(tài)初始概率表明句子中的第一個字屬于 B、M、E、S 四種狀態(tài)的概率,其中 E 和 M 的概率都是0,因為第一個字只可能 B 或者 S,這與實際相符。

          狀態(tài)轉(zhuǎn)移概率表明從狀態(tài) 1 轉(zhuǎn)移到狀態(tài) 2 的概率,滿足齊次性假設,結(jié)構(gòu)可以用一個嵌套的對象表示:

          P = {

              B: {E: -0.510825623765990, M: -0.916290731874155},

              E: {B: -0.5897149736854513, S: -0.8085250474669937},

              M: {E: -0.33344856811948514, M: -1.2603623820268226},

              S: {B: -0.7211965654669841, S: -0.6658631448798212},

          }

          P['B']['E'] 表示從狀態(tài) B 轉(zhuǎn)移到狀態(tài) E 的概率(結(jié)構(gòu)中為概率的對數(shù),方便計算)為 0.6,同理,P['B']['M'] 表示下一個狀態(tài)是 M 的概率為 0.4,說明當一個字處于開頭時,下一個字處于結(jié)尾的概率高于下一個字處于中間的概率,符合直覺,因為二個字的詞比多個字的詞要更常見。

          狀態(tài)發(fā)射概率表明當前狀態(tài),滿足觀察值獨立性假設,結(jié)構(gòu)同上,也可以用一個嵌套的對象表示:

          P = {

              B: {'突': -2.70366861046, '肅': -10.2782270947, '適': -5.57547658034},

              M: {'要': -4.26625051239, '合': -2.1517176509, '成': -5.11354837278},

              S: {……},

              E: {……},

          }

          P['B']['突'] 的含義就是狀態(tài)處于 B,觀測的字是“突”的概率的對數(shù)值等于 -2.70366861046。

          最后,通過Viterbi算法,輸入觀察值集合,將狀態(tài)初始概率、狀態(tài)轉(zhuǎn)移概率、狀態(tài)發(fā)射概率作為參數(shù),輸出狀態(tài)值集合(即最大概率的分詞結(jié)果)。關于Viterbi算法,本文不再詳細展開,有興趣的讀者可以自行查閱。

          7、技術(shù)實現(xiàn)

          上節(jié)中介紹的全文檢索這兩塊技術(shù),是我們架構(gòu)的技術(shù)核心。基于此,我們對IM 的 Electron 端技術(shù)架構(gòu)做了改進。以下將詳細介紹之。

          7.1架構(gòu)圖詳解

          考慮到全文檢索只是 IM 中的一個功能,為了不影響其他 IM 的功能,并且能更快的迭代需求,所以采用了如下的架構(gòu)方案。

          架構(gòu)圖如下:

          如上圖所示,右邊是之前的技術(shù)架構(gòu),底層存儲庫使用了 indexDB,上層有讀寫兩個模塊。

          讀寫模塊的具體作用是:

          • 1)當用戶主動發(fā)送消息、主動同步消息、主動刪除消息以及收到消息的時候,會將消息對象同步到 indexDB;
          • 2)當用戶需要查詢關鍵字的時候,會去 indexDB 中遍歷所有的消息對象,再使用 indexOf 判斷每一條消息對象是否包含所查詢的關鍵字(類似 LIKE)。

          那么,當數(shù)據(jù)量大的時候,查詢的速度是非常緩慢的。

          左邊是加入了分詞以及倒排索引數(shù)據(jù)庫的新的架構(gòu)方案,這個方案不會對之前的方案有任何影響,只是在之前的方案之前加了一層。

          現(xiàn)在,讀寫模塊的工作邏輯:

          • 1)當用戶主動發(fā)送消息、主動同步消息、主動刪除消息以及收到消息的時候,會將每一條消息對象中的消息經(jīng)過分詞后同步到倒排索引數(shù)據(jù)庫;
          • 2)當用戶需要查詢關鍵字的時候,會先去倒排索引數(shù)據(jù)庫中找出對應消息的 idClient,再根據(jù) idClient 去 indexDB 中找出對應的消息對象返回給用戶。

          7.2架構(gòu)優(yōu)點

          該方案有以下4個優(yōu)點:

          • 1)速度快:通過 search-index 實現(xiàn)倒排索引,從而提升了搜索速度;
          • 2)跨平臺:因為 search-index 與 indexDB 都是基于 levelDB,因此 search-index 也支持瀏覽器環(huán)境,這樣就為 Web 端實現(xiàn)全文檢索提供了可能性;
          • 3)獨立性:倒排索引庫與 IM 主業(yè)務庫 indexDB 分離;
          • 4)靈活性:全文檢索以插件的形式接入。

          針對上述第“3)”點:當 indexDB 寫入數(shù)據(jù)時,會自動通知到倒排索引庫的寫模塊,將消息內(nèi)容分詞后,插入到存儲隊列當中,最后依次插入到倒排索引數(shù)據(jù)庫中。當需要全文檢索時,通過倒排索引庫的讀模塊,能快速找到對應關鍵字的消息對象的 idClient,根據(jù) idClient 再去 indexDB 中找到消息對象并返回。

          針對上述第“4)”點:它暴露出一個高階函數(shù),包裹 IM 并返回新的經(jīng)過繼承擴展的 IM,因為 JS 面向原型的機制,在新的 IM 中不存在的方法,會自動去原型鏈(即老的 IM)當中查找,因此,使得插件可以聚焦于自身方法的實現(xiàn)上,并且不需要關心 IM 的具體版本,并且插件支持自定義分詞函數(shù),滿足不同用戶不同分詞需求的場景

          7.3使用效果

          使用了如上架構(gòu)后,經(jīng)過我們的測試,在數(shù)據(jù)量 20W 的級別上,搜索時間從最開始的十幾秒降到一秒內(nèi),搜索速度快了 20 倍左右。

          8、本文小結(jié)

          本文中,我們便基于Nodejiebasearch-index在 Electron 上實現(xiàn)了IM聊天消息的全文檢索,加快了聊天記錄的搜索速度。

          當然,后續(xù)我們還會針對以下方面做更多的優(yōu)化,比如以下兩點:

          1)寫入性能 :在實際的使用中,發(fā)現(xiàn)當數(shù)據(jù)量大了以后,search-index 依賴的底層數(shù)據(jù)庫 levelDB 會存在寫入性能瓶頸,并且 CPU 和內(nèi)存的消耗較大。經(jīng)過調(diào)研,SQLite 的寫入性能相對要好很多,從觀測來看,寫入速度只與數(shù)據(jù)量成正比,CPU 和內(nèi)存也相對穩(wěn)定,因此,后續(xù)可能會考慮用將 SQLite 編譯成 Node 原生模塊來替換 search-index。

          2)可擴展性 :目前對于業(yè)務邏輯的解耦還不夠徹底。倒排索引庫當中存儲了某些業(yè)務字段。后續(xù)可以考慮倒排索引庫只根據(jù)關鍵字查找消息對象的 idClient,將帶業(yè)務屬性的搜索放到 indexDB 中,將倒排索引庫與主業(yè)務庫徹底解耦。

          以上,就是本文的全部分享,希望我的分享能對大家有所幫助。

          9、參考資料

          [1]微信移動端的全文檢索優(yōu)化之路

          [2]微信移動端的全文檢索多音字問題解決方案

          [3]微信iOS端的最新全文檢索技術(shù)優(yōu)化實踐

          [4]蘑菇街基于Electron開發(fā)IM客戶端的技術(shù)實踐

          [5]融云基于Electron的IM跨平臺SDK改造實踐總結(jié)

          [6]閑魚IM基于Flutter的移動端跨端改造實踐

          (本文已同步發(fā)布于:http://www.52im.net/thread-4065-1-1.html

          posted @ 2022-10-27 11:18 Jack Jiang 閱讀(94) | 評論 (0)編輯 收藏

          為了更好地分類閱讀52im.net 總計1000多篇精編文章,我將在每周三推送新的一期技術(shù)文集,本次是第3 期。

          第 

          [標題] 高性能網(wǎng)絡編程(一):單臺服務器并發(fā)TCP連接數(shù)到底可以有多少

          [鏈接] http://www.52im.net/thread-561-1-1.html

          [摘要] 到底一臺服務器能夠支持多少TCP并發(fā)連接呢?這就是本文要討論的問題。


          第 

          [標題] 高性能網(wǎng)絡編程(二):上一個10年,著名的C10K并發(fā)連接問題

          [鏈接] http://www.52im.net/thread-566-1-1.html

          [摘要] 了解C10K問題及其解決思路,通過舉一反三,或許可以為你以后面對類似問題提供更多可借鑒的思想和解決問題的實踐思路。


          第 

          [標題] 高性能網(wǎng)絡編程(三):下一個10年,是時候考慮C10M并發(fā)問題了

          [鏈接] http://www.52im.net/thread-568-1-1.html

          [摘要] 本文將討論單機服務器實現(xiàn)C10M(即單機千萬并發(fā)連接)的可能性及其思路。


          第 

          [標題] 高性能網(wǎng)絡編程(四):從C10K到C10M高性能網(wǎng)絡應用的理論探索

          [鏈接] http://www.52im.net/thread-578-1-1.html

          [摘要] 本文內(nèi)容由京東的資深架構(gòu)師閆國旗分享,以分享者多年的實踐和總結(jié),進一步探討解決C10M問題的理論可行性。


          第 

          [標題] 高性能網(wǎng)絡編程(五):一文讀懂高性能網(wǎng)絡編程中的I/O模型

          [鏈接] http://www.52im.net/thread-1935-1-1.html

          [摘要] 本文旨在為大家提供有用的高性能網(wǎng)絡編程的I/O模型概覽以及網(wǎng)絡服務進程模型的比較,以揭開設計和實現(xiàn)高性能網(wǎng)絡架構(gòu)的神秘面紗。


          第 

          [標題] 高性能網(wǎng)絡編程(六):一文讀懂高性能網(wǎng)絡編程中的線程模型

          [鏈接] http://www.52im.net/thread-1939-1-1.html

          [摘要] 限于篇幅原因,請將本文與《高性能網(wǎng)絡編程(五):一文讀懂高性能網(wǎng)絡編程中的I/O模型》連起來讀,這樣會讓知識更連貫。


          第 

          [標題] 高性能網(wǎng)絡編程(七):到底什么是高并發(fā)?一文即懂!

          [鏈接]http://www.52im.net/thread-3120-1-1.html

          [摘要] 在面視即時通訊相關工作的時候,高并發(fā)也是必談問題,那到底什么是高并發(fā)?嗯,真要說出個所以然來,還真有點懵...本文就與大家一起探討學習一下。


          第 

          [標題] 從根上理解高性能、高并發(fā)(一):深入計算機底層,理解線程與線程池

          [鏈接] http://www.52im.net/thread-3272-1-1.html

          [摘要] 返璞歸真、回歸本質(zhì),這些技術(shù)特征背后的底層原理到底是什么?如何能通俗易懂、毫不費力真正透徹理解這些技術(shù)背后的原理,正是《從根上理解高性能、高并發(fā)》系列文章所要分享的。


          第 

          [標題] 從根上理解高性能、高并發(fā)(二):深入操作系統(tǒng),理解I/O與零拷貝技術(shù)

          [鏈接] http://www.52im.net/thread-3280-1-1.html

          [摘要] 對于即時通訊IM這種系統(tǒng)的開發(fā)來說,網(wǎng)絡通信知識確實非常重要,但回歸到技術(shù)本質(zhì),實現(xiàn)網(wǎng)絡通信本身的這些技術(shù)特征:包括上篇提到的線程池、零拷貝、多路復用、事件驅(qū)動等等,它們的本質(zhì)是什么?底層原理又是怎樣?這就是整理本系列文章的目的,希望對你有用。


          第 10 

          [標題] 從根上理解高性能、高并發(fā)(三):深入操作系統(tǒng),徹底理解I/O多路復用

          [鏈接] http://www.52im.net/thread-3287-1-1.html

          [摘要] 本篇將以更具象的文件這個話題入手,帶你一步步理解高性能、高并發(fā)服務端編程時無法回避的I/O多路復用及相關技術(shù)。


          第 11 

          [標題] 從根上理解高性能、高并發(fā)(四):深入操作系統(tǒng),徹底理解同步與異步

          [鏈接] http://www.52im.net/thread-3296-1-1.html

          [摘要] 本篇將從基礎著眼,為你講解什么是同步和異步,以及這兩個極為重要的概念在高并發(fā)、高性能技術(shù)中編程中到底意味著什么。


          第 12 

          [標題] 從根上理解高性能、高并發(fā)(五):深入操作系統(tǒng),理解高并發(fā)中的協(xié)程

          [鏈接] http://www.52im.net/thread-3306-1-1.html

          [摘要] 了解和掌握協(xié)程技術(shù)對于很多程序員(尤其海量網(wǎng)絡通信應用的后端程序員)來說是相當有必要的,本文正是為你解惑協(xié)程技術(shù)原理而寫。


          第 13 

          [標題] 從根上理解高性能、高并發(fā)(六):通俗易懂,高性能服務器到底是如何實現(xiàn)的

          [鏈接] http://www.52im.net/thread-3315-1-1.html

          [摘要] 本篇是本系列文章的完結(jié)篇,你將能了解到,一個典型的服務器端是如何利用前5篇中講解的各單項技術(shù)從而實現(xiàn)高性能高并發(fā)的。


          第 14 

          [標題] 從根上理解高性能、高并發(fā)(七):深入操作系統(tǒng),一文讀懂進程、線程、協(xié)程

          [鏈接]http://www.52im.net/thread-3357-1-1.html

          [摘要] 本篇是本系列文章的臨時續(xù)篇,本篇將由淺入深,總結(jié)進程、線程、協(xié)程這3個技術(shù)概念,將3者的技術(shù)原理、用途、關系進行了系統(tǒng)梳理和總結(jié),希望有助于解決你這方面的技術(shù)困惑。

          我是Jack Jiang,我為自已帶鹽!

          https://github.com/JackJiang2011/MobileIMSDK/

          posted @ 2022-10-24 12:04 Jack Jiang 閱讀(110) | 評論 (0)編輯 收藏

          本文由融云技術(shù)團隊分享,有修訂和改動。

          1、引言

          Electron 憑借其相對更低的研發(fā)成本投入、強大的跨平臺支持、擁有基數(shù)龐大的 Javascript 開發(fā)者受眾等優(yōu)勢,在 PC 端跨平臺桌面開發(fā)領域異軍突起,大受歡迎。

          本文分享的是融云基于Electron的IM跨平臺PC端SDK改造過程中所總結(jié)的一些實踐經(jīng)驗,希望對你有用。

          * 友情提示:如果您對Electron的基礎概念還不太了解,建議您先從本系列文章的首篇《快速了解新一代跨平臺桌面技術(shù)——Electron》和第2篇《Electron初體驗(快速開始、跨進程通信、打包、踩坑等)》開始閱讀,否則可能難以理解本文的有關內(nèi)容。

          學習交流:

          (本文已同步發(fā)布于:http://www.52im.net/thread-4060-1-1.html

          2、系列文章

          本文是系列文章中的第5篇,本系列總目錄如下:

          3、本次改造的技術(shù)目標

          針對本次改造,我們需要達到以下4個技術(shù)目標:

          • 1)需提供與傳統(tǒng)桌面通訊軟件相匹配的能力支持;
          • 2)需實現(xiàn)瀏覽器與Electron不同運行時代碼的高度復用;
          • 3)便于開發(fā)者構(gòu)建多窗口、多進程的復雜桌面端應用;
          • 4)需同步適配同一IM端SDK的多個版本。

          以下,我們將逐條討論這4個目標所有實現(xiàn)的具體技術(shù)內(nèi)容。

          4、技術(shù)目標1:需提供與傳統(tǒng)桌面通訊軟件相匹配的能力支持

          相較于 B/S 架構(gòu)的 Web 網(wǎng)頁應用,我們期望能夠在 Electron 環(huán)境下向開發(fā)者提供更為豐富的本地化能力,以及比 Websocket(或Comet)更高效的Socket實時雙工通信通道。

          借助這些原本在瀏覽器環(huán)境下不便實現(xiàn)的技術(shù)能力,來整體提高用戶對于桌面端產(chǎn)品的使用體驗,將 Electron 作為一個 C/S 架構(gòu)軟件運行平臺的潛力發(fā)揮到最大。(白話就是,我們希望借助Electron這個框架,將原本W(wǎng)eb端的一些雞肋能力,做到像原生富客戶端一樣)

          5、技術(shù)目標2:瀏覽器與Electron不同運行時代碼的高度復用

          由于 Electron 與標準 Web 應用擁有幾乎相同的技術(shù)生態(tài),因此多數(shù)產(chǎn)品會要求前端代碼工程兼顧瀏覽器與 Electron。

          也就是說,一套代碼既要打包為傳統(tǒng)桌面端應用(利用Electron),又可發(fā)布為瀏覽器中運行的 Web 網(wǎng)頁應用。

          基于此,我們提供的 IM SDK 需要在兩種不同的運行時環(huán)境下做到差異最小化,避免開發(fā)者編寫冗余的平臺兼容代碼。(白話就是,盡可能在基于Electron的桌面端和純Web網(wǎng)頁端之間重用更多的代碼,不然又得多擼一個全新的Electron端,這得多費勁)

          6、技術(shù)目標3:便于開發(fā)者構(gòu)建多窗口、多進程的復雜桌面端應用

          Electron 通過對 IPC 能力的封裝為桌面端應用開發(fā)提供了較完善的跨進程通訊方案,借助此能力,開發(fā)者構(gòu)建的桌面端應用也逐漸趨于復雜。

          比較典型的如桌面端IM產(chǎn)品:通常用一個獨立窗口做基礎的 IM 聊天業(yè)務,一個窗口做歷史聊天記錄查詢業(yè)務。

          當有音視頻會議業(yè)務場景時,還需要再開一個窗口做會議業(yè)務。

          甚至有開發(fā)者提出了與每個聊天對象都保持一個獨立聊天窗口的需求(產(chǎn)品形態(tài)如 QQ)。

          在這類需求下,長連接狀態(tài)維持、消息同步變得異常復雜,原因在于以下3個方面。

          • 1)若每個進程窗口都維持獨立長連接,難免會出現(xiàn)某一進程連接與其他進程連接狀態(tài)不同步。且開發(fā)者需在各進程同時維護連接狀態(tài),復雜度較高。同時還會造成服務的并發(fā)能力下降。
          • 2)若僅有單一主窗口進行連接維持,其他窗口通過 IPC 能力將主窗口作為連接代理,則需要在主進程、各渲染進程中維護復雜的跨進程通訊業(yè)務代碼,從而推高項目整體的復雜度。
          • 3)目前的 Electron 開發(fā)者絕大多數(shù)來自于 Web 開發(fā)者,既有編程思維是建立在瀏覽器頁面內(nèi)單進程單線程的應用模型下構(gòu)建起來的,對于處理此類多進程模型的產(chǎn)品開發(fā)缺乏相關的經(jīng)驗積累。

          為降低類似需求場景的業(yè)務實現(xiàn)復雜度,我們需要在 PaaS 能力層面上解決多進程連接共享、多進程消息同步問題,讓開發(fā)者在既有編程思維模式下將每個業(yè)務實現(xiàn)的更為順暢。

          7、技術(shù)目標4:需同步適配同一IM端SDK的多個版本

          我們的既有Web端 IM SDK 存在一個端多個不同版本的情況(主要是為了兼容老用戶,舊版本很難一刀切直接扔掉,只能新老版末同時并存)。

          各版本都有不同數(shù)量的客戶積累,且各版本 API 接口設計迥異,跨版本升級成本較高。

          考慮到使用不同版本的客戶未來將業(yè)務向 Electron 遷移的可能性,我們期望通過架構(gòu)設計的改進來避免既有客戶做過多的集成代碼修改,在確保既有客戶不因版本升級而流失的前提下降低 Web 研發(fā)團隊自身的多版本 SDK 維護成本。

          8、本次改造的落地實踐

          針對上面章節(jié)中確定的技術(shù)目標,我們將從以下3個方向著手落地實踐:

          • 1)剝離各版本的共同業(yè)務與對外差異性 API 定義;
          • 2)Electron 與瀏覽器平臺下 IM SDK 的區(qū)分;
          • 3)解決多進程消息同步、多進程連接共享問題。
            以下,我們將逐條分享這3個方面的具體實踐內(nèi)容。

          9、落地實踐1:剝離各版本的共同業(yè)務與對外差異性API定義

          我們的 IM SDK 各版本分別為不同的代碼倉庫獨立維護,互無干系。(白話就是,所有端的IM SDK都是獨立開發(fā),從頭造輪子)

          這導致所有的功能(包括即將開發(fā)的 Electron 桌面解決方案)都可能要在各個版本倉庫上單獨實現(xiàn),不僅開發(fā)成本高,還會導致實現(xiàn)質(zhì)量無法保證、或代碼實現(xiàn)不統(tǒng)一,同時也推高了產(chǎn)研后續(xù)流程的測試、上線等環(huán)節(jié)的成本。

          ▲ IM SDK 不同版本獨立維護

          基于前述技術(shù)目標4的要求,在既有現(xiàn)狀下繼續(xù)開發(fā),就意味著需要在兩個版本的基礎上做不同實現(xiàn),既不符合程序員的代碼審美,也影響團隊整體的研發(fā)效率。(白話就是,如果又要從頭造輪子實在太難受)

          為更好地達成技術(shù)目標4,團隊決定優(yōu)先通過重構(gòu)將既有業(yè)務分層,即各個版本所必須的業(yè)務代碼抽象下沉為 IM Engine 包,并為各個版本 IM SDK 分別實現(xiàn)不同的API Layer以便與既有線上版本接口對齊,這樣既可以降低團隊的研發(fā)成本,也可以滿足既有線上客戶后續(xù)的升級需求。

          ▲ 重構(gòu)代碼實現(xiàn)業(yè)務分層

          完成業(yè)務分層后,對于 IM SDK 有依賴的其他產(chǎn)品如 RTC SDK,也都可以擺脫對 IM SDK 接口的依賴而直接調(diào)用 Engine 層接口,業(yè)務層在拓展 RTC 業(yè)務時,也就無需再考慮 IM SDK 的版本問題。

          ▲ 業(yè)務分層后的結(jié)構(gòu)將保證拓展性

          做分層的另一個考慮還為了達成技術(shù)目標2,將與業(yè)務層的交互限制在 API 層,在 Engine 中處理 Electron 與瀏覽器兩種運行時下的代碼差異,業(yè)務層只需關心 IM SDK 的接口調(diào)用而無需關心底層差異,確保業(yè)務層在兩種運行時下只需要維護極少甚至無需維護兼容代碼,便于業(yè)務層更專注于業(yè)務開發(fā)。

          10、落地實踐2:Electron 與瀏覽器平臺下 IM SDK 的區(qū)分

          在將 Engine 與業(yè)務層隔離后(見上一節(jié)),需要考慮 Engine 在不同的運行時下的關鍵能力差異,并依據(jù)能力差異落實 Engine 的底層設計。

          Electron 環(huán)境下的連接、消息存儲等能力由 c++ 模塊編寫提供(即后面提到的 CppProto.node):

          在瀏覽器與 Electron 平臺下,從連接管理、到消息收發(fā)等實現(xiàn)方式迥異,團隊需要對 Engine 包繼續(xù)分層,通過 AEngine 抽象類來定義 IM Engine 的能力接口,并抽象 APIContext 類用來管理 AEngine 的能力調(diào)用。

          考慮到純 Web 應用構(gòu)建尺寸問題,Electron 的能力實現(xiàn)代碼不應被打包到標準 Web 頁面內(nèi),因此還需要將 Electron 平臺下的實現(xiàn)代碼單獨抽離出來作為一個獨立包(即ElectronSolution),作為可選模塊由開發(fā)者選擇安裝使用。

          ▲ Electron相關的代碼抽離為可選模塊

          如上圖所示,CppEngine 在 ElectronSolution 包中定義,其需要由開發(fā)者在 Electron 應用創(chuàng)建 BrowserWindow 實例時通過 webPreferences.preload 配置屬性向渲染進程窗口預掛載。

          APIContext 在初始化 AEngine 實例時,優(yōu)先檢測 CppEngine 是否已定義。當發(fā)現(xiàn)有 CppEngine 定義時,則初始化 CppEngine 提供更豐富的本地化能力,否則初始化 JSEngine。

          就像下面的代碼的展現(xiàn)的邏輯:

          const engine: AEngine = typeofCppEngine !== 'undefined'

            ? newCppEngine()

            : newJSEngine()

          11、落地實踐3:解決多進程消息同步、多進程連接共享問題

          ElectronSolution 包截止目前的設計中,所有代碼都運行在渲染進程內(nèi)。

          這意味著每個進程彼此獨立,都在維護獨立的進程狀態(tài),無法滿足目標 3 中多進程狀態(tài)同步、連接共享的需求。

          為了解決該問題,需要將 CppProto.node 模塊放到主進程,在主進程中實現(xiàn)連接管理、消息收發(fā)等能力,多個渲染進程通過 IPC 通信共享主進程狀態(tài)。

          ▲ 多個渲染進程通過 IPC 通信共享主進程狀態(tài)

          為了達成技術(shù)目標3的要求,ElectronSolution 需要拆分為兩個子包,即Main 與 Renderer。

          具體就是:

          • 1)Main 包運行在主進程內(nèi),負責維持 CppProto.node 模塊的調(diào)用,實現(xiàn)底層連接管理、消息管理等功能,同時通過 Electron 提供的 ipcMain 與各渲染進程維持通信;
          • 2)Renderer 包中定義 CppEngine 類,繼承自 Engine 包內(nèi)的 AEngine 抽象類,依然通過 webPreferences.preload 用來作為主進程的代理,通過 ipcRenderer 與主進程維持通信。

          ▲ 拆分為Main與Renderer兩個子包

          修改完成后,ElectronSolution 包的整體結(jié)構(gòu)基本確定。

          以下列出 ElectronSolution 包關鍵目錄結(jié)構(gòu)供參考:

          node_modules/@rongcloud/electron-solution

          ├── index.js

          ├── main

          │   ├── addon

          │   │   ├── binding

          │   │   │   └── electron-v{electron-version}-{platform}-{arch}.node

          │   │   └── index.js

          │   ├── dist

          │   │   └── index.js

          │   ├── index.js

          │   └── package.json

          └── renderer

          │   ├── dist

          │   │   └── index.js

          │   ├── index.js

          │   └── package.json

          └── package.json

          基于上述架構(gòu)變動,當業(yè)務層需要在多個渲染進程中實現(xiàn) IM 能力時,僅需要關注在各個進程中的 IM SDK 接口調(diào)用,由 ElectronSolution 處理多進程之間的狀態(tài)同步問題。

          當開發(fā)者期望由既有 Web 業(yè)務向 Electron 平臺遷移時,開發(fā)者也無需修改既有的 Web 業(yè)務代碼,僅需要增量編寫主進程代碼相關功能實現(xiàn),將 ElectronSolution 安裝并集成到 Electron 桌面端應用中即可。

          最終,我們形成了以下這樣的IM SDK整體結(jié)構(gòu):

          12、未來的規(guī)劃

          除了上述IM相關業(yè)務,后續(xù)我們還打算在Electron平臺下提升RTC的場景能力。

          目前,Electron 平臺下由 Chromium 原始提供的 WebRTC 能力對于開發(fā)桌面級音視頻應用軟件來說相對薄弱,我們有計劃探索借助 node.js 的拓展能力,提供更為底層的 WebRTC 能力拓展如音效、音質(zhì)、視頻特效等。

          13、參考資料

          [1] 快速了解新一代跨平臺桌面技術(shù)——Electron

          [2] Electron初體驗(快速開始、跨進程通信、打包、踩坑等)

          [3] WebSocket從入門到精通,半小時就夠!

          [4] Comet技術(shù)詳解:基于HTTP長連接的Web端實時通信技術(shù)

          [5] 一套海量在線用戶的移動端IM架構(gòu)設計實踐分享(含詳細圖文)

          [6] Web端即時通訊技術(shù)盤點:短輪詢、Comet、Websocket、SSE

          [7] 搞懂現(xiàn)代Web端即時通訊技術(shù)一文就夠:WebSocket、socket.io、SSE

          (本文已同步發(fā)布于:http://www.52im.net/thread-4060-1-1.html

          posted @ 2022-10-20 11:53 Jack Jiang 閱讀(83) | 評論 (0)編輯 收藏

          為了更好地分類閱讀52im.net 總計1000多篇精編文章,我將在每周三推送新的一期技術(shù)周刊,本次是第期。

          第 

          [標題] 腦殘式網(wǎng)絡編程入門(一):跟著動畫來學TCP三次握手和四次揮手

          [鏈接] http://www.52im.net/thread-1729-1-1.html

          [摘要]網(wǎng)絡編程中TCP協(xié)議的三次握手和四次揮手的問題,在面試中是最為常見的知識點之一。本篇文章嘗試使用動畫圖片的方式,來對這個知識點進行“腦殘式”講解(哈哈),期望讀者們可以更加簡單、直觀地理解TCP網(wǎng)絡通信交互的本質(zhì)。


          第 

          [標題] 腦殘式網(wǎng)絡編程入門(二):我們在讀寫Socket時,究竟在讀寫什么?

          [鏈接] http://www.52im.net/thread-1732-1-1.html

          [摘要] 套接字socket是大多數(shù)程序員都非常熟悉的概念,它是計算機網(wǎng)絡編程的基礎,TCP/UDP收發(fā)消息都靠它。本篇文章依然嘗試使用動畫圖片的方式,來對這個知識點進行“腦殘式”講解(哈哈),期望讀者們可以更加簡單、直觀地理解Socket通信的數(shù)據(jù)讀寫本質(zhì)。


          第 

          [標題] 腦殘式網(wǎng)絡編程入門(三):HTTP協(xié)議必知必會的一些知識

          [鏈接] http://www.52im.net/thread-1751-1-1.html

          [摘要]無論是即時通訊應用還是傳統(tǒng)的信息系統(tǒng),Http協(xié)議都是我們最常打交道的網(wǎng)絡應用層協(xié)議之一,它的重要性可能不需要再強調(diào)。但是實際上很多人(包括我自己),雖然每天都會跟http的代碼打交道,但對http了解的并不夠深入。本文就我自己的學習心得,分享一下我認為需要知道的http常見的相關知識點。


          第 

          [標題] 腦殘式網(wǎng)絡編程入門(四):快速理解HTTP/2的服務器推送(Server Push)

          [鏈接] http://www.52im.net/thread-1795-1-1.html

          [摘要] 服務器推送(server push)是 HTTP/2 協(xié)議里面唯一一個需要開發(fā)者自己配置的功能。其他功能都是服務器和瀏覽器自動實現(xiàn),不需要開發(fā)者關心。本文詳細介紹新一代HTTP/2服務器推送技術(shù)(server push)的原理和配置方法等。


          第 

          [標題] 腦殘式網(wǎng)絡編程入門(五):每天都在用的Ping命令,它到底是什么?

          [鏈接] http://www.52im.net/thread-1973-1-1.html

          [摘要] Ping命令很簡單,但作為為數(shù)不多的網(wǎng)絡檢測工具,卻非常有用,是開發(fā)網(wǎng)絡應用時最常用到的命令。雖然“Ping”這個動作這么簡單,但你知道Ping命令背后后的邏輯嗎?這就是本文要告訴你!


          第 

          [標題] 腦殘式網(wǎng)絡編程入門(六):什么是公網(wǎng)IP和內(nèi)網(wǎng)IP?NAT轉(zhuǎn)換又是什么鬼?

          [鏈接] http://www.52im.net/thread-2082-1-1.html

          [摘要] 搞網(wǎng)絡通信應用開發(fā)的程序員,可能會經(jīng)常聽到外網(wǎng)IP(即互聯(lián)網(wǎng)IP地址)和內(nèi)網(wǎng)IP(即局域網(wǎng)IP地址),但他們的區(qū)別是什么?又有什么關系呢?另外,內(nèi)行都知道,提到外網(wǎng)IP和內(nèi)網(wǎng)IP就不得不提NAT路由轉(zhuǎn)換這種東西,那這又是什么鬼?本文就來簡單講講這些到底都是怎么回事。


          第 

          [標題] 腦殘式網(wǎng)絡編程入門(七):面視必備,史上最通俗計算機網(wǎng)絡分層詳解

          [鏈接] http://www.52im.net/thread-2851-1-1.html

          [摘要] 輸入URL,到頁面呈現(xiàn)出來,其中經(jīng)歷了什么?這道面試題的背后,涉及到了很多網(wǎng)絡原理的知識,我們這篇文章不會全部分享到,而是先把由來和網(wǎng)絡層次劃分弄清楚,就完成了這篇文章的目的。


          第 

          [標題] 腦殘式網(wǎng)絡編程入門(八):你真的了解127.0.0.1和0.0.0.0的區(qū)別?

          [鏈接] http://www.52im.net/thread-2928-1-1.html

          [摘要] 對于后端程序員來說,127.0.0.1和0.0.0.0這兩個IP地址再熟悉不過了,看起來好像就那么回事,但真正較起真來,這兩個IP地址到底有什么作用以及到底有什么不同?貌似誰可以輕松回答,但張嘴卻又不知從何說起。本文將系統(tǒng)地總結(jié)127.0.0.1和0.0.0.0這兩個IP地址的作用,以及它們之間的區(qū)別,希望能為你解惑。


          第 

          [標題] 腦殘式網(wǎng)絡編程入門(九):面試必考,史上最通俗大小端字節(jié)序詳解

          [鏈接] http://www.52im.net/thread-3101-1-1.html

          [摘要] 程序員在寫應用層程序時,一般不需要考慮字節(jié)序問題,因為字節(jié)序跟操作系統(tǒng)和硬件環(huán)境有關,而我們編寫的程序要么不需要跨平臺(比如只運行在windows),要么需要跨平臺時會由Java這種跨平臺語言在虛擬機層屏蔽掉了。但典型情況,當你編寫網(wǎng)絡通信程序,比如IM聊天應用時,就必須要考慮字節(jié)序問題,因為你的數(shù)據(jù)在這樣的場景下要跨機器、跨網(wǎng)絡通信,必須解決不同系統(tǒng)、不同平臺的字節(jié)序問題。


          第 10 

          [標題] 網(wǎng)絡編程入門從未如此簡單(一):假如你來設計網(wǎng)絡,會怎么做?

          [鏈接] http://www.52im.net/thread-3330-1-1.html

          [摘要] 本篇主要以通俗易懂的文風,引導你理解計算機網(wǎng)絡是如何演化成今日的樣子,文中穿插了集線器、交換楊、路由器等設備的使用背景以及技術(shù)原理,由淺入深,非常適合入門者閱讀。


          第 11 

          [標題] 網(wǎng)絡編程入門從未如此簡單(二):假如你來設計TCP協(xié)議,會怎么做?

          [鏈接] http://www.52im.net/thread-3339-1-1.html

          [摘要] 本篇將運用通俗易懂的語言,配上細致精確的圖片動畫,循序漸進地引導你理解TCP協(xié)議的主要特性和技術(shù)原理,讓TCP協(xié)議的學習不再如此枯燥和生澀,非常適合入門者閱讀。


          第 12 

          [標題] 網(wǎng)絡編程入門從未如此簡單(三):什么是IPv6?漫畫式圖文,一篇即懂!

          [鏈接] http://www.52im.net/thread-3868-1-1.html

          [摘要] 本篇文章將利用簡潔生動的文字,配上輕松幽默的漫畫,助你從零開始快速建立起對IPv6技術(shù)的直觀理解,非常適合入門者閱讀。

          我是Jack Jiang,我為自已帶鹽!

          https://github.com/JackJiang2011/MobileIMSDK/

          posted @ 2022-10-18 13:06 Jack Jiang 閱讀(141) | 評論 (0)編輯 收藏

          關于MobileIMSDK

          MobileIMSDK 是一套專門為移動端開發(fā)的開源IM即時通訊框架,超輕量級、高度提煉,一套API優(yōu)雅支持UDP 、TCP 、WebSocket 三種協(xié)議,支持iOS、Android、H5、標準Java平臺,服務端基于Netty編寫。

          工程開源地址是:

          關于RainbowChat

          ► 詳細產(chǎn)品介紹:http://www.52im.net/thread-19-1-1.html
          ► iOS端更新記錄:http://www.52im.net/thread-2735-1-1.html
          ► 全部運行截圖:iOS端全部運行截圖 (另:Android端運行截圖 點此查看
          ► 在線體驗下載:App Store安裝地址 (另:Android端下載體驗 點此查看

           

          RainbowChat是一套基于開源IM聊天框架 MobileIMSDK 的產(chǎn)品級移動端IM系統(tǒng)。RainbowChat源于真實運營的產(chǎn)品,解決了大量的屏幕適配、細節(jié)優(yōu)化、機器兼容問題(可自行下載體驗:專業(yè)版下載安裝)。

          RainbowChat可能是市面上提供im即時通訊聊天源碼的,唯一一款同時支持TCP、UDP兩種通信協(xié)議的IM產(chǎn)品(通信層基于開源IM聊天框架  MobileIMSDK 實現(xiàn))。

          v6.0 版更新內(nèi)容

          此版更新內(nèi)容新增“一鍵已讀、搜索”等功能!】(更多歷史更新日志):

          • 1)[新增] 搜索功能(支持好友、群聊、聊天記錄搜索(與微信邏輯一樣));
          • 2)[新增] “聊天信息”界面中新增“查找聊天記錄”功能;
          • 3)[新增] “群聊信息”界面中新增“查找聊天記錄”功能;
          • 4)[新增] 首頁消息界面中,增加了“一鍵已讀”功能;
          • 5)[bug] 解決了iOS16+“靈動島”手機下,聊天界面功能面板和輸入法顯示的沖突;
          • 6)[優(yōu)化] 優(yōu)化了聊天界面中查看位置、名片消息回來時會自動滾動到最后一行的問題。

          此版主要新增功能運行截圖更多截圖點此查看):

          posted @ 2022-10-12 15:01 Jack Jiang 閱讀(96) | 評論 (0)編輯 收藏

               摘要: 本文由vivo技術(shù)團隊Yang Kun分享,原題“electron 應用開發(fā)優(yōu)秀實踐”,即時通訊網(wǎng)有修訂。1、引言在上篇《Electron初體驗(快速開始、跨進程通信、打包、踩坑等)》的分享中,我們已經(jīng)對Electron跨端框架的開發(fā)有了大概的了解。本篇將基于vivo技術(shù)團隊的技術(shù)實踐,詳細闡述了vivo在使用Electron進行跨端桌面開發(fā)時的技術(shù)棧選型考量,同時分享了在...  閱讀全文

          posted @ 2022-10-08 10:16 Jack Jiang 閱讀(160) | 評論 (0)編輯 收藏

          為了更好地分類閱讀總計1000多篇精編文章,我將在每周三推送新的一期技術(shù)文集,本次是第1 期。

          [標題] 網(wǎng)絡編程懶人入門(一):快速理解網(wǎng)絡通信協(xié)議(上篇)

          [鏈接] http://www.52im.net/thread-1095-1-1.html

          [摘要] 互聯(lián)網(wǎng)的核心是一系列協(xié)議,總稱為"互聯(lián)網(wǎng)協(xié)議"(Internet Protocol Suite)。它們對電腦如何連接和組網(wǎng),做出了詳盡的規(guī)定。理解了這些協(xié)議,就理解了互聯(lián)網(wǎng)的原理。本篇將帶你從理論上快速理解這些協(xié)議。


          [標題] 網(wǎng)絡編程懶人入門(二):快速理解網(wǎng)絡通信協(xié)議(下篇)

          [鏈接] http://www.52im.net/thread-1103-1-1.html

          [摘要] 接上篇,本篇將以普通人實際上網(wǎng)為例子,通俗易懂地講解網(wǎng)絡通信協(xié)議到底是什么。本篇帶了有些基礎的計網(wǎng)理論知識,但力求通俗不枯燥。


          [標題]網(wǎng)絡編程懶人入門(三):快速理解TCP協(xié)議一篇就夠

          [鏈接]http://www.52im.net/thread-1107-1-1.html

          [摘要] TCP 是互聯(lián)網(wǎng)的核心協(xié)議之一,鑒于它的重要性,本文將單獨介紹它的基礎知識,希望能加深您對TCP協(xié)議的理解。


          [標題]網(wǎng)絡編程懶人入門(四):快速理解TCP和UDP的差異

          [鏈接]http://www.52im.net/thread-1160-1-1.html

          [摘要] 對于即時通訊開者新手來說,在開始著手編寫IM或消息推送系統(tǒng)的代碼前,最頭疼的問題莫過于到底該選TCP還是UDP作為傳輸層協(xié)議。本文延續(xù)《網(wǎng)絡編程懶人入門》系列文章的風格,通過快速對比分析 TCP 和 UDP 的區(qū)別,來幫助即時通訊初學者快速了解這些基礎的知識點,從而在IM、消息推送等網(wǎng)絡通信應用場景中能準確地選擇合適的傳輸層協(xié)議。


          [標題]網(wǎng)絡編程懶人入門(五):快速理解為什么說UDP有時比TCP更有優(yōu)勢

          [鏈接]http://www.52im.net/thread-1277-1-1.html

          [摘要] 隨著網(wǎng)絡技術(shù)飛速發(fā)展,網(wǎng)速已不再是傳輸?shù)钠款i,UDP協(xié)議以其簡單、傳輸快的優(yōu)勢,在越來越多場景下取代了TCP,如網(wǎng)頁瀏覽、流媒體、實時游戲、物聯(lián)網(wǎng)。本文作為《網(wǎng)絡編程懶人入門》系列文章的第5篇,將為您快速梳理UDP協(xié)議在某些場景下對比TCP協(xié)議所具有的優(yōu)勢。


          [標題]網(wǎng)絡編程懶人入門(六):史上最通俗的集線器、交換機、路由器功能原理入門

          [鏈接]http://www.52im.net/thread-1629-1-1.html

          [摘要] 本文旨在簡單地說明集線器、交換機與路由器的區(qū)別,因而忽略了很多細節(jié),三者實際的發(fā)展過程和工作原理并非文中所寫的這么簡單。如果你看完本文能大概了解到三者的異同,本文的目的就達到了。


          [標題] 網(wǎng)絡編程懶人入門(七):深入淺出,全面理解HTTP協(xié)議

          [鏈接] http://www.52im.net/thread-1677-1-1.html

          [摘要] 對于移動端即時通訊(尤其IM應用)來說,現(xiàn)今主流的數(shù)據(jù)通信總結(jié)下來無外乎就是長連接+短連接的方式,而短連接在應用上講就是本文將要介紹的HTTP協(xié)議的應用,而正確地理解HTTP協(xié)議對于寫好IM來說,是相當有益的(關于移動端的HTTP具體應用情況,可以閱讀《現(xiàn)代移動端網(wǎng)絡短連接的優(yōu)化手段總結(jié):請求速度、弱網(wǎng)適應、安全保障http://www.52im.net/thread-1413-1-1.html》)。


          [標題] 網(wǎng)絡編程懶人入門(八):手把手教你寫基于TCP的Socket長連接

          [鏈接] http://www.52im.net/thread-1722-1-1.html

          [摘要] TCP 是互聯(lián)網(wǎng)的核心協(xié)議之一,鑒于它的重要性,希望通過閱讀上面介紹的幾篇理論文章,再針對本文的動手實踐,能真正加深您對TCP協(xié)議的理解。


          [標題] 網(wǎng)絡編程懶人入門(九):通俗講解,有了IP地址,為何還要用MAC地址?

          [鏈接] http://www.52im.net/thread-2067-1-1.html

          [摘要] 標題雖然是為了解釋有了 IP 地址,為什么還要用 MAC 地址,但是本文的重點在于理解為什么要有 IP 這樣的東西。本文對讀者的定位是知道 MAC 地址是什么,IP 地址是什么。


          10 

          [標題] 網(wǎng)絡編程懶人入門(十):一泡尿的時間,快速讀懂QUIC協(xié)議

          [鏈接]http://www.52im.net/thread-2816-1-1.html

          [摘要] 一般的穩(wěn)定網(wǎng)絡傳輸都是通過TCP,但是在網(wǎng)絡基建本身就已經(jīng)越來越完善的情況下,TCP設計本身的問題便暴露了出來,特別是在弱網(wǎng)環(huán)境下,讓我們不得不考慮一些新的可能性。


          11 

          [標題] 網(wǎng)絡編程懶人入門(十一):一文讀懂什么是IPv6

          [鏈接]http://www.52im.net/thread-2979-1-1.html

          [摘要] 本文將用淺顯易懂的文字,帶你了解到底什么是IPv6。


          12 

          [標題]網(wǎng)絡編程懶人入門(十二):快速讀懂Http/3協(xié)議,一篇就夠!

          [鏈接]http://www.52im.net/thread-3020-1-1.html

          [摘要] 多年來,為了跟上互聯(lián)網(wǎng)的發(fā)展,以及WWW上交換的內(nèi)容種類增加,HTTP進行了幾次重大升級,而HTTP/3就是目前的最新版本。本文將從HTTP/3的基本概念、技術(shù)原理、應用場景和如何使用它等方面進行介紹,確保在有限的篇幅內(nèi),能讓你通俗地理解它。


          13 

          [標題]網(wǎng)絡編程懶人入門(十三):一泡尿的時間,快速搞懂TCP和UDP的區(qū)別

          [鏈接]http://www.52im.net/thread-3793-1-1.html

          [摘要] 不同于其它長篇大論,本文盡量以簡潔精煉的文字,幫你總結(jié)歸納TCP和UDP協(xié)議的主要區(qū)別,方便那些想掌握這方面知識又不愿意耗費太多時間去系統(tǒng)地學習網(wǎng)絡理論基礎的同學快速理解!


          14 

          [標題]網(wǎng)絡編程懶人入門(十四):到底什么是Socket?一文即懂!

          [鏈接] http://www.52im.net/thread-3821-1-1.html

          [摘要] 本系列文章前面那些主要講解的是計算機網(wǎng)絡的理論基礎,但對于即時通訊IM這方面的應用層開發(fā)者來說,跟計算機網(wǎng)絡打道的其實是各種API接口。本篇文章就來聊一下網(wǎng)絡應用程序員最熟悉的Socket這個東西,拋開生澀的計算機網(wǎng)絡理論,從應用層的角度來理解到底什么是Socket。

          我是Jack Jiang,我為自已帶鹽!

          https://github.com/JackJiang2011/MobileIMSDK/

          posted @ 2022-10-08 10:16 Jack Jiang 閱讀(110) | 評論 (0)編輯 收藏

               摘要: 本文由蘑菇街前端技術(shù)團隊分享,原題“Electron 從零到一”,有修訂和改動。1、引言在上篇《快速了解新一代跨平臺桌面技術(shù)——Electron》,我們已經(jīng)對Electron跨端框架有了基本的認識。本篇將帶你簡單上手Electron框架開發(fā)跨平臺桌面端,內(nèi)容包括一個快速開始例子、跨進程通信原理、打包和分發(fā)、以及一些典型的技術(shù)踩坑等。希望能帶給你啟發(fā)。...  閱讀全文

          posted @ 2022-09-22 11:10 Jack Jiang 閱讀(187) | 評論 (0)編輯 收藏

          關于MobileIMSDK

          MobileIMSDK 是一套專門為移動端開發(fā)的開源IM即時通訊框架,超輕量級、高度提煉,一套API優(yōu)雅支持UDP 、TCP 、WebSocket 三種協(xié)議,支持iOS、Android、H5、標準Java平臺,服務端基于Netty編寫。

          工程開源地址是:

          關于RainbowChat

          ► 詳細產(chǎn)品介紹:http://www.52im.net/thread-19-1-1.html
          ► iOS端更新記錄:http://www.52im.net/thread-2735-1-1.html
          ► 全部運行截圖:iOS端全部運行截圖 (另:Android端運行截圖 點此查看
          ► 在線體驗下載:App Store安裝地址 (另:Android端下載體驗 點此查看

           

          RainbowChat是一套基于開源IM聊天框架 MobileIMSDK 的產(chǎn)品級移動端IM系統(tǒng)。RainbowChat源于真實運營的產(chǎn)品,解決了大量的屏幕適配、細節(jié)優(yōu)化、機器兼容問題(可自行下載體驗:專業(yè)版下載安裝)。

          RainbowChat可能是市面上提供im即時通訊聊天源碼的,唯一一款同時支持TCP、UDP兩種通信協(xié)議的IM產(chǎn)品(通信層基于開源IM聊天框架  MobileIMSDK 實現(xiàn))。

          v5.0 版更新內(nèi)容

          此版更新內(nèi)容【新增“掃一掃”等功能更多歷史更新日志):

          • 1)[新增] “掃一掃”界面及功能邏輯;
          • 2)[新增] “我的二維碼”界面及功能邏輯;
          • 3)[新增] “群聊二維碼”界面及功能邏輯;
          • 4)[優(yōu)化] 相關界面中的彈出菜單UI細節(jié)優(yōu)化。

          此版主要新增功能運行截圖更多截圖點此查看):

          posted @ 2022-09-14 22:59 Jack Jiang 閱讀(102) | 評論 (0)編輯 收藏

          僅列出標題
          共50頁: First 上一頁 16 17 18 19 20 21 22 23 24 下一頁 Last 
          Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 鄂托克旗| 凉城县| 宜兴市| 浮梁县| 新营市| 万宁市| 普陀区| 石泉县| 天长市| 沅陵县| 安康市| 明水县| 亚东县| 玛纳斯县| 昌平区| 葫芦岛市| 余干县| 高唐县| 延川县| 夏津县| 鄂伦春自治旗| 西藏| 宽甸| 商洛市| 吉安县| 乌什县| 宿州市| 阿尔山市| 房产| 科技| 黔西县| 都昌县| 应城市| 滁州市| 浏阳市| 正蓝旗| 铁岭县| 偃师市| 贡嘎县| 都匀市| 远安县|