Home / Dragon Flute 袨斜屑械薪 屑谐薪芯胁械薪薪褘屑懈 褋芯芯斜褖械薪懈褟屑懈 / 榫嶇瑳鐗硅壊 / 寰炲鎴剁鐨勮搴︿締璜囪珖绉诲嫊绔疘M鐨勬秷鎭彲闈犳€у拰閫侀仈姗熷埗

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

IM App 鏄垜鍋氶亷 App 椤炲瀷閲屽京闆滃害鏈€楂樼殑涓€椤烇紝閲岄潰鍙緵娣辩┒鎺㈣◣鐨勬妧琛撻洠榛為潪甯镐箣澶�銆傞€欑瘒鏂囩珷鍜屽ぇ瀹惰亰涓嬪緸绉诲嫊绔鎴剁鐨勮搴︽墍闂滄敞鐨処M娑堟伅鍙潬鎬у拰閫侀仈姗熷埗锛堝洜鐐烘垜鍊嬩汉灏嶇Щ鍕曞鎴剁鐨勭稉椹楃⿳绱殑姣旇純璞愬瘜鍢涳級銆�

TCP鍗旇鐨勫彲闈犳€т箣澶栭倓鏈冨嚭鐝炬秷鎭笩澶�锛�

濡備綍纰轰繚 IM 涓嶄笩娑堟伅鏄€嬬浉灏嶅京闆滅殑瑭遍锛屽緸瀹㈡埗绔櫦(f膩)閫佹暩鎿氬埌鏈嶅嫏鍣紝鍐嶅緸鏈嶅嫏鍣ㄦ姷閬旂洰妯欏鎴剁锛屾渶绲傚湪 UI 鎴愬姛灞曠ず锛屽叾闁撴秹鍙婄殑鐠�(hu谩n)绡€(ji茅)寰堝锛岄€欓噷鍙彇鍏朵腑涓€鐠�(hu谩n)銆屾帴鏀剁濡備綍纰轰繚娑堟伅涓嶄笩澶便€嶄締鎺㈣◣锛岀矖鐣ヨ亰涓嬫垜鎺ヨЦ閬庣殑鍏╃ó瑷▓鎬濊矾銆�

瑾埌鍙潬鎶甸仈锛岀涓€鍙嶆噳鏈冭伅鎯冲埌 TCP 鐨� reliability銆傛暩鎿氬彲闈犳姷閬旀槸鍊嬮€氱敤鎬х殑鍟忛锛岀劇璜栨槸缍茬怠浜岄€插埗娴佹暩鎿�锛岄倓鏄笂灞ょ殑妤�(y猫)鍕欐暩鎿氾紝閮芥湁鍙潬鎬т繚闅滃晱椤�锛孴CP 浣滅偤缍茬怠鍩虹瑷柦鍗旇锛屽叾鍙潬鎬цō瑷堢殑鍙潬鎬ф槸姣嬪焊缃枒鐨�锛屾垜鍊戝氨寰� TCP 鐨勫彲闈犳€ц璧�銆�

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

绗竴鍊嬪晱椤屾槸锛氱従鍦ㄧ殑 IM App 骞句箮閮芥槸璧� TCP 閫氶亾锛屾棦鐒� TCP 鏈韩鏄叿鍌欏彲闈犳€х殑锛岀偤浠€涔堥倓鏈冨嚭鐝炬秷鎭帴鏀剁锛圧eceiver锛変笩澶辨秷鎭殑鎯呮硜锛岀湅涓嬪湒涓€鐩簡鐒讹細

涓€鍙ヨ┍绺界祼涓婂湒鐨勫惈缇╋細缍茬怠灞ょ殑鍙潬鎬т笉绛夊悓浜庢キ(y猫)鍕欏堡鐨勫彲闈犳€�銆�

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

鑸夊€嬫渶绨″柈鐨勫牬鏅偤渚嬪瓙锛氭秷鎭彲闈犳姷閬旂恫绲″堡涔嬪悗锛屽 db 涔嬪墠 App crash锛堜笉绋€濂囷紝鏄� App 閮芥渻 crash锛�锛岄洊鐒舵暩鎿氬湪缍茬怠灞ゅ彲闈犳姷閬斾簡锛屼絾娌掑瓨閫� db锛屼笅娆$敤鎴舵墦闁� App 娑堟伅鑷劧灏变笩澶变簡锛屽鏋滀笉鍦ㄦキ(y猫)鍕欏堡鍐嶅鍔犲彲闈犳€т繚闅�锛岀恫绲″堡闈笉鏈冮噸鐧�(f膩)锛岄偅涔堟剰鍛宠憲閫欐娑堟伅灏嶄簬 Receiver 姘搁仩涓熷け浜�銆�

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

閫欏€嬫柟妗堝彲浠ョ啊鍠悊瑙g偤锛屽皣 TCP 鐨� Ack 娴佺▼鍐嶈蛋涓€閬�锛屽湪鎳夌敤灞や篃妲嬪缓涓€鍊� Ack 娑堟伅锛屽湪鎳夌敤灞ゅ彲闈犳€у緱鍒扮⒑瑾嶏紙涓€鑸互瀛樺叆 db 鐐烘簴锛屾洿婧栫⒑瑾槸浜嬪嫏鎻愪氦鎴愬姛鐨勫洖瑾垮嚱鏁革級涔嬪悗鍐嶇櫦(f膩)閫侀€欏€� Ack 娑堟伅锛孲erver 鏀跺埌鎳夌敤灞� Ack 娑堟伅涔嬪悗鎵嶈獚鐐� Receiver 宸叉敹鍒�锛屽惁鍓囦篃閲囧彇鏌愮ó绛栫暐閲嶇櫦(f膩)娑堟伅銆�

鍏烽珨鍒� IM App 鐣朵腑锛屾帴鏀剁鎺ュ彈鍒� Server 鐨� Message锛屽皣 Message 瀛樺叆 db锛屽湪纰鸿獚鍥炶閲岀櫦(f膩)閫� Ack Receive 娑堟伅锛孲erver 鏀跺埌 Ack Receive 鍗宠獚鐐烘秷鎭凡缍撳彲闈犳姷閬�锛屽惁鍓囨渻鍦ㄦ煇鍊嬫檪姗熼噸鏂版帹閫侊紙姣斿瀹㈡埗绔噸閫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 鍗崇偤涓婁竴姊濆鍏ユ暩鎿氬韩娑堟伅鐨� Seq ID銆�

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

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

鏈枃灏忕祼

娑堟伅鐨勫彲闈犳姷閬斿彲浠ユ娊璞$偤鏇翠竴鑸剰缇╀笂鐨勫彲闈犳€у晱椤�锛屽伐绋嬩笂绺芥渻纰板埌闇€瑕佽В姹哄悇绋舰寮忓彲闈犳€у晱椤岀殑鍫存櫙锛屼互缍撳吀瑷堢畻姗熺悊璜栨垨鑰呭韪愮偤鍩虹渚嗗垎鏋愭噳鐢ㄥ堡鐨勫伐绋嬪晱椤�锛屽彲浠ヨ垑涓€鍙嶄笁锛岃棩鍒扮梾闄ゃ€�

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

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

路 涓€鏄暩鎿氬彲闈犳姷閬旓紙娌掓湁浠讳綍涓枔鏁告摎琚笩澶憋級锛�

路 浜屾槸姝g⒑鎶甸仈锛堟矑鏈変簜搴忔垨鑰呮暩鎿氭洿鏀癸級銆�

鍏跺鐞嗚珫涓� TCP 涔熶笉鏄� 100% 鍙潬锛堟暩鎿氭湁鍙兘鍦ㄥ偝杓告檪鏀硅畩鑰岀劇娉曡妾㈡脯鍒帮級锛岃€屾槸 100% 宸ョ▼涓婂彲闈狅紙鏁告摎鏀硅畩鑰屼笉琚娓埌鏅傚€嬫サ灏忔鐜囩殑浜嬩欢锛夛紝閫欐槸鍙﹀涓€鍊嬫湁鎰忔€濈殑瑭遍銆�