為什么想要寫這個系列的文章?
2018年年末,由于所在公司的戰(zhàn)略方向轉(zhuǎn)向東南亞一隅,意欲打造一款面向東南亞市場的即時通訊應(yīng)用,并且高層在綜合考量之后決定采用自研技術(shù),于是機(jī)緣巧合之下我被安排到IM項目組,從而再次接觸到了即時通訊技術(shù)。
為什么說是再次呢?因為我之前參與開發(fā)的兩個商業(yè)項目同樣運用到了即時通訊技術(shù),一個是用到 XMPP+Openfire+Smack,另外一個是用到MQTT,只是當(dāng)時由于工作經(jīng)驗的關(guān)系都只停留在環(huán)境的搭建和API的調(diào)用,并沒有很深入地去挖掘更底層的技術(shù)原理。而現(xiàn)在項目采用的則是WebSocket——提供客戶端和服務(wù)端全雙工通信(即雙方可同時向?qū)Ψ桨l(fā)送消息)的一種應(yīng)用層協(xié)議。接觸過的同類技術(shù)多了,自然免不了會去比較三者之間的優(yōu)劣。而我正是以此為切入點,在工作之余對接觸工作以來所涉及過的即時通訊技術(shù)進(jìn)行了全面復(fù)盤。
大到網(wǎng)絡(luò)通信協(xié)議、數(shù)據(jù)傳輸格式的選型,小到消息實時性、一致性的保持,從在線、離線推送到多端同步、消息漫游,即時通訊技術(shù)的博大精深無不令我嘖嘖稱奇,從而得以以更高的架構(gòu)師的角度去審視當(dāng)時是為什么這樣設(shè)計的,做到理論知識與代碼實踐的一一對應(yīng)。也理解了即時通訊技術(shù)作為的底層架構(gòu),為帶有社交屬性的應(yīng)用提供實時互動功能的價值所在。
而隨著現(xiàn)在項目穩(wěn)定迭代到了3.x的版本,即將把IM模塊剝離出來作為獨立SDK接入到新項目,我也得以回顧之前的寫的代碼并進(jìn)行適度優(yōu)化。并想以此為契機(jī),將學(xué)習(xí)過的知識以技術(shù)博客的形式進(jìn)行輸出,強(qiáng)迫自己把知識點組合起來,從而對即時通訊技術(shù)有更透徹的理解,促使自己變得更專業(yè)。之前寫的幾篇技術(shù)文章,只是作為重新回歸撰寫技術(shù)博客的練手之作,而完整出一個系列的文章則一直是我想要達(dá)成的一個成就,希望我能堅持下去。
看這個系列的文章你可以得到什么?
由于我本身是Android開發(fā)者,因此我的文章會更多地以Android開發(fā)或客戶端開發(fā)的角度去講述,對于服務(wù)端高并發(fā)、高可用等場景,因為不屬于我的專業(yè)范圍內(nèi)所以我也不會展開來講。除了會普及一些業(yè)內(nèi)普遍認(rèn)同的、具有通用性的技術(shù)方案外,還會就這些方案在移動設(shè)備上實現(xiàn)的局限性進(jìn)行具體分析。眾所周知,客戶端作為收發(fā)消息的終端設(shè)備,是直接面向用戶的,但是移動設(shè)備又是資源受限的,這意味著在移動設(shè)備上實現(xiàn)體驗良好的即時通訊功能是極富挑戰(zhàn)性的。我會在文章中把我實際開發(fā)中遇到的困難跟你闡述,希望我踩過的坑你不會再次踩到。
由于是第一次寫系列文章,而即時通訊又是一門比較龐大的技術(shù),所以我暫時不會把整個系列所有要寫的東西全部羅列出來,當(dāng)然還是初步列了要切入的幾個點,并計劃就一個點寫對應(yīng)的一篇文章,后面如果看哪一個點可以單獨摘出來講述的話我會繼續(xù)補(bǔ)充,目前規(guī)劃的幾篇文章包括:
- 多進(jìn)程:為什么要把消息服務(wù)拆分到一個獨立的進(jìn)程? (已發(fā)布)
- 數(shù)據(jù)傳輸格式選型:資源受限的移動設(shè)備上數(shù)據(jù)傳輸?shù)睦Ь?/strong>(已發(fā)布)
- 網(wǎng)絡(luò)通信協(xié)議選型:應(yīng)以什么樣的標(biāo)準(zhǔn)去選擇適合你應(yīng)用的網(wǎng)絡(luò)通信協(xié)議?(已發(fā)布)
- 網(wǎng)絡(luò)保活:復(fù)雜多變的移動網(wǎng)絡(luò)下保持全時在線的艱難
- 進(jìn)程?;睿号c日漸封閉的Android系統(tǒng)不斷地抗?fàn)幣c妥協(xié)
-
消息推送:碎片化的Android系統(tǒng)如何提升離線狀態(tài)下消息的可達(dá)性
...
以上基本是接觸客戶端IM開發(fā)會面臨的一些問題,如果你是剛開始IM開發(fā)的新手,相信這些文章會對你有所幫助,希望你在看完每一篇文章之后都能融入自己的思考,并能實際運用到自己的業(yè)務(wù)中去。