Home / 榫嶇瑳鍗虫檪閫氳▕ / 榫嶇瑳鐗硅壊 / 寰炲鎴剁鐨勮搴︿締璜囪珖绉诲嫊绔疘M鐨勬秷鎭彲闈犳€у拰閫侀仈姗熷埗

寰炲鎴剁鐨勮搴︿締璜囪珖绉诲嫊绔疘M鐨勬秷鎭彲闈犳€у拰閫侀仈姗熷埗

IM App 鏄垜鍋氶亷 App 椤炲瀷閲屽京闆滃害鏈€楂樼殑涓€椤�锛岄噷闈㈠彲渚涙繁绌舵帰瑷庣殑鎶€琛撻洠榛為潪甯镐箣澶�銆傞€欑瘒鏂囩珷鍜屽ぇ瀹惰亰涓嬪緸绉诲嫊绔鎴剁鐨勮搴︽墍闂滄敞鐨処M娑堟伅鍙潬鎬у拰閫侀仈姗熷埗锛堝洜鐐烘垜鍊嬩汉灏嶇Щ鍕曞鎴剁鐨勭稉(j墨ng)椹楃⿳绱殑姣旇純璞愬瘜鍢涳級銆�

TCP鍗�(xi茅)璀扮殑鍙潬鎬т箣澶栭倓鏈冨嚭鐝�(xi脿n)娑堟伅涓熷け锛�

濡備綍纰轰繚 IM 涓嶄笩娑堟伅鏄€嬬浉灏嶅京闆滅殑瑭遍锛屽緸瀹㈡埗绔櫦(f膩)閫佹暩(sh霉)鎿�(j霉)鍒版湇鍕欏櫒锛屽啀寰炴湇鍕欏櫒鎶甸仈鐩瀹㈡埗绔�锛屾渶绲傚湪 UI 鎴愬姛灞曠ず锛屽叾闁撴秹鍙婄殑鐠�(hu谩n)绡€(ji茅)寰堝锛岄€欓噷鍙彇鍏朵腑涓€鐠�(hu谩n)銆屾帴鏀剁濡備綍纰轰繚娑堟伅涓嶄笩澶便€嶄締鎺㈣◣锛岀矖鐣ヨ亰涓嬫垜鎺ヨЦ閬庣殑鍏╃ó瑷▓鎬濊矾銆�

瑾埌鍙潬鎶甸仈锛岀涓€鍙嶆噳鏈冭伅(li谩n)鎯冲埌 TCP 鐨� reliability銆傛暩(sh霉)鎿�(j霉)鍙潬鎶甸仈鏄€嬮€氱敤鎬х殑鍟忛锛岀劇璜栨槸缍�(w菐ng)绲′簩閫插埗娴佹暩(sh霉)鎿�(j霉)锛岄倓鏄笂灞ょ殑妤�(y猫)鍕欐暩(sh霉)鎿�(j霉)锛岄兘鏈夊彲闈犳€т繚闅滃晱椤岋紝TCP 浣滅偤缍�(w菐ng)绲″熀绀庤ō鏂藉崝(xi茅)璀�锛屽叾鍙潬鎬цō瑷堢殑鍙潬鎬ф槸姣嬪焊缃枒鐨勶紝鎴戝€戝氨寰� TCP 鐨勫彲闈犳€ц璧�銆�

鍦� TCP 閫欎竴灞�锛屾墍鏈� Sender 鐧�(f膩)閫佺殑鏁�(sh霉)鎿�(j霉)锛屾瘡涓€鍊� byte 閮芥湁妯欒櫉锛圫equence Number锛�锛屾瘡鍊� byte 鍦ㄦ姷閬旀帴鏀剁涔嬪悗閮芥渻琚帴鏀剁杩斿洖涓€鍊嬬⒑瑾嶄俊鎭紙Ack Number锛�锛� 浜岃€呴棞绯荤偤 Ack = Seq + 1銆傜啊鍠締瑾紝濡傛灉 Sender 鐧�(f膩)閫佷竴鍊� Seq = 1锛岄暦搴︾偤 100 bytes 鐨勫寘锛岄偅涔� receiver 鏈冭繑鍥炰竴鍊� Ack = 101 鐨勫寘锛屽鏋� Sender 鏀跺埌浜嗛€欏€婣ck 鍖�锛岃鏄庢暩(sh霉)鎿�(j霉)纰哄琚� Receiver 鏀跺埌浜�锛屽惁鍓� Sender 鏈冮噰鍙栨煇绋瓥鐣ラ噸鐧�(f膩)涓婇潰鐨勫寘銆�

绗竴鍊嬪晱椤屾槸锛氱従(xi脿n)鍦ㄧ殑 IM App 骞句箮閮芥槸璧� TCP 閫氶亾锛屾棦鐒� TCP 鏈韩鏄叿鍌欏彲闈犳€х殑锛岀偤浠€涔堥倓鏈冨嚭鐝�(xi脿n)娑堟伅鎺ユ敹绔紙Receiver锛変笩澶辨秷鎭殑鎯呮硜锛岀湅涓嬪湒涓€鐩簡鐒讹細

涓€鍙ヨ┍绺界祼(ji茅)涓婂湒鐨勫惈缇╋細缍�(w菐ng)绲″堡鐨勫彲闈犳€т笉绛夊悓浜庢キ(y猫)鍕欏堡鐨勫彲闈犳€с€�

鏁�(sh霉)鎿�(j霉)鍙潬鎶甸仈缍�(w菐ng)绲″堡涔嬪悗锛岄倓闇€瑕佷竴灞ゅ堡寰€涓婄Щ浜よ檿鐞嗭紝鍙兘鐨勮檿鐞嗘湁锛氬畨鍏ㄦ€ф牎椹�锛宐inary 瑙f瀽锛宮odel 鍓�(chu脿ng)寤�锛屽 db锛屽瓨鍏� cache锛孶I 灞曠ず锛屼互鍙婁竴浜� edge cases锛堟柗缍�(w菐ng)锛岀敤鎴� logout锛宒isk full锛孫OM锛宑rash锛岄棞姗�銆�銆傦級 绛夌瓑锛岄爡鐩殑 feature 瓒婂锛岀恫(w菐ng)绲″堡寰€涓婄殑铏曠悊鍑洪尟鐨勫彲鑳芥€у氨瓒婂ぇ銆�

鑸夊€嬫渶绨″柈鐨勫牬鏅偤渚嬪瓙锛氭秷鎭彲闈犳姷閬旂恫(w菐ng)绲″堡涔嬪悗锛屽 db 涔嬪墠 App crash锛堜笉绋€濂�锛屾槸 App 閮芥渻 crash锛夛紝闆栫劧鏁�(sh霉)鎿�(j霉)鍦ㄧ恫(w菐ng)绲″堡鍙潬鎶甸仈浜�锛屼絾娌掑瓨閫� db锛屼笅娆$敤鎴舵墦闁� App 娑堟伅鑷劧灏变笩澶变簡锛屽鏋滀笉鍦ㄦキ(y猫)鍕欏堡鍐嶅鍔犲彲闈犳€т繚闅滐紝缍�(w菐ng)绲″堡闈笉鏈冮噸鐧�(f膩)锛岄偅涔堟剰鍛宠憲閫欐娑堟伅灏嶄簬 Receiver 姘搁仩涓熷け浜嗐€�

瀹㈡埗绔柟妗�1锛氭噳鐢ㄥ堡 Ack 娑堟伅

閫欏€嬫柟妗堝彲浠ョ啊鍠悊瑙g偤锛屽皣 TCP 鐨� Ack 娴佺▼鍐嶈蛋涓€閬嶏紝鍦ㄦ噳鐢ㄥ堡涔熸(g貌u)寤轰竴鍊� Ack 娑堟伅锛屽湪鎳夌敤灞ゅ彲闈犳€у緱鍒扮⒑瑾嶏紙涓€鑸互瀛樺叆 db 鐐烘簴锛屾洿婧栫⒑瑾槸浜嬪嫏鎻愪氦鎴愬姛鐨勫洖瑾�(di脿o)鍑芥暩(sh霉)锛変箣鍚庡啀鐧�(f膩)閫侀€欏€� Ack 娑堟伅锛孲erver 鏀跺埌鎳夌敤灞� Ack 娑堟伅涔嬪悗鎵嶈獚鐐� Receiver 宸叉敹鍒�锛屽惁鍓囦篃閲囧彇鏌愮ó绛栫暐閲嶇櫦(f膩)娑堟伅銆�

鍏烽珨鍒� IM App 鐣朵腑锛屾帴鏀剁鎺ュ彈鍒� Server 鐨� Message锛屽皣 Message 瀛樺叆 db锛屽湪纰鸿獚鍥炶(di脿o)閲岀櫦(f膩)閫� Ack Receive 娑堟伅锛孲erver 鏀跺埌 Ack Receive 鍗宠獚鐐烘秷鎭凡缍�(j墨ng)鍙潬鎶甸仈锛屽惁鍓囨渻鍦ㄦ煇鍊嬫檪姗熼噸鏂版帹閫侊紙姣斿瀹㈡埗绔噸閫f湇鍕欏櫒鏅傚€� Pull锛屾瘮濡傛湁鏂版秷鎭檪 Server Push锛夈€�

瀹㈡埗绔柟妗�2锛氭噳鐢ㄥ堡 Seq ID

閫欏€嬫柟妗堝拰涓婇潰涓嶅悓锛屼絾涔熸槸鍦ㄦ噳鐢ㄥ堡鎿嶄綔銆傛垜鍊戝€嬫瘡鍊� Message 鍒嗛厤涓€鍊� Seq ID锛岄€欏€� Seq ID 灏嶄簬鍠€嬬敤鎴剁殑鎺ュ彈娑堟伅闅婂垪渚嗚鏄€g簩(x霉)鐨�锛屽鏋� Message A 鍜� Message B 鏄浉閯扮殑锛岄偅涔� MsgBSeqID = MsgASeqID + 1銆傛瘡娆″瓨鍏� db 鐨勬檪鍊欐洿鏂� db 閲岀殑 LastReceivedSeqID锛孡astReceivedSeqID 鍗崇偤涓婁竴姊濆鍏ユ暩(sh霉)鎿�(j霉)搴秷鎭殑 Seq ID銆�

閫欎箞鍋氱殑濂借檿鏄�锛屾瘡娆″緸缍�(w菐ng)绲″堡鏀跺埌娑堟伅鏅傦紝寰� db 閲屽彇鍑� LastReceivedSeqID锛屽鏋� LastReceivedSeqID = 鏂版秷鎭� Seq ID - 1锛岄偅涔堣鏄庢噳鐢ㄥ堡娑堟伅鏅傞€g簩(x霉)鐨勬矑鏈夌櫦(f膩)鐢熶笩澶�銆傞倓鍙互灏嶆敹鍒扮殑鎵归噺娑堟伅鍋氶爯妾㈡脯锛屾鏌ユ秷鎭殜鍒楅噷鐨� Seq ID 鏄惁鐐鸿伅(li谩n)绯荤殑锛屽彧瑕佸瓨鍦ㄤ换浣曚竴绋笉閫g簩(x霉)鐨� Seq ID 鎯呮硜锛屽氨瑾槑鐧�(f膩)閫佷簡涓熷け锛屾鏅傛帴鏀剁鍙互鐢� LastReceivedSeqID 寰� Server 閲嶆柊鐛插彇婧栫⒑鐨勬帴鍙楁秷鎭殜鍒�銆�

閫欎箞鍋氱殑濂借檿鏄伩鍏嶄簡姣忔閮介渶瑕佺櫦(f膩)閫佷竴姊� Ack 娑堟伅锛屽铏曟槸鎳夌敤灞ら倧杓京闆滀箣鍚�锛屼竴鏃﹀嚭鐝�(xi脿n) Seq ID 涓嶉€g簩(x霉)鐨勬儏娉�锛屾渻閬庡害渚濊炒浜� refetch锛岄洠浠ュ垎鏋愬晱椤屽嚭鐝�(xi脿n)鐨勫師鍥�锛宺efetch 涓€鏃﹂亷浜庨牷绻�锛屽叾娴侀噺鎼嶈€楁サ鏈夊彲鑳藉ぇ浜� Ack 娑堟伅鐨勬暩(sh霉)鎿�(j霉)閲�銆�

鏈枃灏忕祼(ji茅)

娑堟伅鐨勫彲闈犳姷閬斿彲浠ユ娊璞$偤鏇翠竴鑸剰缇╀笂鐨勫彲闈犳€у晱椤岋紝宸ョ▼涓婄附鏈冪鍒伴渶瑕佽В姹哄悇绋舰寮忓彲闈犳€у晱椤岀殑鍫存櫙锛屼互缍�(j墨ng)鍏歌▓绠楁鐞嗚珫鎴栬€呭韪愮偤鍩虹渚嗗垎鏋愭噳鐢ㄥ堡鐨勫伐绋嬪晱椤�锛屽彲浠ヨ垑涓€鍙嶄笁锛岃棩鍒扮梾闄ゃ€�

鍦ㄥ伐绋嬩笂瀵﹁笎鍙潬鎬�锛岄渶瑕佺窔浜嗚В宸ョ▼鐨勬瘡涓€鍊嬬挵(hu谩n)绡€(ji茅)浠ュ強鏁�(sh霉)鎿�(j霉)濡備綍鍦ㄥ悇鍊嬬挵(hu谩n)绡€(ji茅)娴佸嫊锛屾帴涓嬩締鎵嶆槸鍒嗘瀽姣忎竴鍊嬬挵(hu谩n)绡€(ji茅)鏁�(sh霉)鎿�(j霉)鍑洪尟鐨勫彲鑳芥€�銆傛椹楀彲闈犳€х殑妯欐簴鏅傘€屽叆琚嬬偤瀹夈€�锛屽瓨鍏� db 鎴栬€呬互鍏朵粬鏂瑰紡鎸佷箙鍖栧埌 disk 鐣朵腑锛岄€欐ǎ鎵嶈兘淇濊瓑瀹㈡埗绔瘡娆¢兘鑳芥纰鸿畝鍙栧埌娑堟伅銆�

鍙﹀锛屽彲闈犳€у彲浠ョ悊瑙g偤鍏╂柟闈細

路 涓€鏄暩(sh霉)鎿�(j霉)鍙潬鎶甸仈锛堟矑鏈変换浣曚腑闁撴暩(sh霉)鎿�(j霉)琚笩澶憋級锛�

路 浜屾槸姝g⒑鎶甸仈锛堟矑鏈変簜搴忔垨鑰呮暩(sh霉)鎿�(j霉)鏇存敼锛�銆�

鍏跺鐞嗚珫涓� TCP 涔熶笉鏄� 100% 鍙潬锛堟暩(sh霉)鎿�(j霉)鏈夊彲鑳藉湪鍌宠几鏅傛敼璁婅€岀劇娉曡妾㈡脯鍒帮級锛岃€屾槸 100% 宸ョ▼涓婂彲闈狅紙鏁�(sh霉)鎿�(j霉)鏀硅畩鑰屼笉琚娓埌鏅傚€嬫サ灏忔鐜囩殑浜嬩欢锛�锛岄€欐槸鍙﹀涓€鍊嬫湁鎰忔€濈殑瑭遍銆�