Jack Jiang

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

          本文原題“從小白到高手,你需要理解同步與異步”,轉(zhuǎn)載請聯(lián)系作者。

          1、系列文章引言

          1.1 文章目的

          作為即時通訊技術(shù)的開發(fā)者來說,高性能、高并發(fā)相關(guān)的技術(shù)概念早就了然與胸,什么線程池、零拷貝、多路復(fù)用、事件驅(qū)動、epoll等等名詞信手拈來,又或許你對具有這些技術(shù)特征的技術(shù)框架比如:Java的Netty、Php的workman、Go的gnet等熟練掌握。但真正到了面視或者技術(shù)實(shí)踐過程中遇到無法釋懷的疑惑時,方知自已所掌握的不過是皮毛。

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

          1.2 文章源起

          我整理了相當(dāng)多有關(guān)IM、消息推送等即時通訊技術(shù)相關(guān)的資源和文章,從最開始的開源IM框架MobileIMSDK,到網(wǎng)絡(luò)編程經(jīng)典巨著《TCP/IP詳解》的在線版本,再到IM開發(fā)綱領(lǐng)性文章《新手入門一篇就夠:從零開發(fā)移動端IM》,以及網(wǎng)絡(luò)編程由淺到深的《網(wǎng)絡(luò)編程懶人入門》、《腦殘式網(wǎng)絡(luò)編程入門》、《高性能網(wǎng)絡(luò)編程》、《不為人知的網(wǎng)絡(luò)編程》系列文章。

          越往知識的深處走,越覺得對即時通訊技術(shù)了解的太少。于是后來,為了讓開發(fā)者門更好地從基礎(chǔ)電信技術(shù)的角度理解網(wǎng)絡(luò)(尤其移動網(wǎng)絡(luò))特性,我跨專業(yè)收集整理了《IM開發(fā)者的零基礎(chǔ)通信技術(shù)入門》系列高階文章。這系列文章已然是普通即時通訊開發(fā)者的網(wǎng)絡(luò)通信技術(shù)知識邊界,加上之前這些網(wǎng)絡(luò)編程資料,解決網(wǎng)絡(luò)通信方面的知識盲點(diǎn)基本夠用了。

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

          1.3 文章目錄

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

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

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

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

          《從根上理解高性能、高并發(fā)(五):高并發(fā)高性能服務(wù)器到底是如何實(shí)現(xiàn)的 (稍后發(fā)布..)》

          1.4 本篇概述

          接上篇《深入操作系統(tǒng),徹底理解I/O多路復(fù)用》,本篇是高性能、高并發(fā)系列的第4篇文章,本篇將從基著眼,為你講解什么是同步和異步,以及這兩個極為重要的概念在高并發(fā)、高性能技術(shù)中編程中到底意味著什么。

          本文已同步發(fā)布于“即時通訊技術(shù)圈”公眾號,歡迎關(guān)注。公眾號上的鏈接是:點(diǎn)此進(jìn)入

          2、本文作者

          應(yīng)作者要求,不提供真名,也不提供個人照片。

          本文作者主要技術(shù)方向?yàn)榛ヂ?lián)網(wǎng)后端、高并發(fā)高性能服務(wù)器、檢索引擎技術(shù),網(wǎng)名是“碼農(nóng)的荒島求生”,公眾號“碼農(nóng)的荒島求生”。感謝作者的無私分享。

          3、寫在前面

          相信很多同學(xué)遇到同步異步這兩個詞的時候大腦瞬間就像紅綠燈失靈的十字路口一樣陷入一片懵逼的狀態(tài)。

          是的,這兩個看上去很像實(shí)際上也很像的詞匯曾經(jīng)給博主造成過很大的困擾,這兩個詞背后所代表的含義到底是什么呢?

          我們先從工作場景講起。

          4、同步與異步場景1:苦逼的程序員

          4.1 同步

          假設(shè)現(xiàn)在老板分配給了你一個很緊急并且很重要的任務(wù),讓你下班前必須完成(萬惡的資本主義)。為了督促進(jìn)度,老板搬了個椅子坐在一邊盯著你寫代碼。

          你心里肯定已經(jīng)罵上了:“WTF,你有這么閑嗎?盯著老子,你就不能去干點(diǎn)其他事情嗎?

          老板仿佛接收到了你的腦電波一樣:“我就在這等著,你寫完前我哪也不去,廁所也不去。

          這個例子中老板交給你任務(wù)后就一直等待,什么都不做直到你寫完,這個場景就是所謂的同步。

          4.2 異步

          第二天,老板又交給了你一項(xiàng)任務(wù)。

          不過這次就沒那么著急啦,這次老板輕描淡寫,“小伙子可以啊,不錯不錯,你再努力干一年,明年我就財務(wù)自由了,今天的這個任務(wù)不著急,你寫完告訴我一聲就行”。

          這次老板沒有盯著你寫代碼,而是轉(zhuǎn)身刷視頻去了,你寫完后簡單的和老板報告一聲“我寫完了”。

          在這個例子中老板交代完任務(wù)后不再一直等著什么都不做而是就去忙其它事情,你完成任務(wù)后簡單的告訴老板任務(wù)完成,這就是所謂的異步。

          4.3 小結(jié)一下

          針對上面的場景,我們小結(jié)一下:在異步這種場景下重點(diǎn)是在你寫代碼的同時老板在刷劇,這兩件事在同時進(jìn)行,而不是一方等待另一方,因此這就是為什么一般來說異步比同步高效的本質(zhì)所在,不管同步異步應(yīng)用在什么場景下。

          我們可以看到同步這個詞往往和任務(wù)的“依賴”、“關(guān)聯(lián)”、“等待”等關(guān)鍵詞相關(guān),而異步往往和任務(wù)的“不依賴”,“無關(guān)聯(lián)”,“無需等待”,“同時發(fā)生”等關(guān)鍵詞相關(guān)。

          By the way,如果遇到一個在身后盯著你寫代碼的老板,三十六計走為上策。

          5、同步與異步場景2:打電話與發(fā)郵件

          5.1 同步

          作為一名苦逼的程序員是不能只顧埋頭搬磚的,平時工作中的溝通免除不了,其中一種高效的溝通方式是吵架。。。啊不,是電話。

          通常打電話時都是一個人在說另一個人聽,一個人在說的時候另一個人等待,等另一個人說完后再接著說,因此在這個場景中你可以看到,“依賴”、“關(guān)聯(lián)”、“等待”這些關(guān)鍵詞出現(xiàn)了,因此打電話這種溝通方式就是所謂的同步。

          5.2 異步

          另一種碼農(nóng)常用的溝通方式是郵件。

          郵件是另一種必不可少溝通方式,因?yàn)闆]有人傻等著你寫郵件什么都不做,因此你可以慢慢悠悠的寫,當(dāng)你在寫郵件時收件人可以去做一些像摸摸魚啊、上個廁所、和同時抱怨一下為什么十一假期不放兩周之類有意義的事情。

          同時當(dāng)你寫完郵件發(fā)出去后也不需要干巴巴的等著對方回復(fù)什么都不做,你也可以做一些像摸魚之類這樣有意義的事情(^_^)。

          在這里,你寫郵件別人摸魚,這兩件事又在同時進(jìn)行,收件人和發(fā)件人都不需要相互等待,發(fā)件人寫完郵件的時候簡單的點(diǎn)個發(fā)送就可以了,收件人收到后就可以閱讀啦,收件人和發(fā)件人不需要相互依賴、不需要相互等待。

          你看,在這個場景下“不依賴”,“無關(guān)聯(lián)”,“無需等待”這些關(guān)鍵詞就出現(xiàn)了,因此郵件這種溝通方式就是異步的。

          6、編程中的同步調(diào)用

          現(xiàn)在終于回到編程的主題啦。

          既然現(xiàn)在我們已經(jīng)理解了同步與異步在各種場景下的意義(I hope so),那么對于程序員來說該怎樣理解同步與異步呢?

          我們先說同步調(diào)用,這是程序員最熟悉的場景。

          一般的函數(shù)調(diào)用都是同步的,就像這樣:

          funcA() {

              // 等待函數(shù)funcB執(zhí)行完成

              funcB();

           

              // 繼續(xù)接下來的流程

          }

          funcA調(diào)用funcB,那么在funcB執(zhí)行完前,funcA中的后續(xù)代碼都不會被執(zhí)行,也就是說funcA必須等待funcB執(zhí)行完成。

          就像下圖這樣:

          從上圖中我們可以看到,在funcB運(yùn)行期間funcA什么都做不了,這就是典型的同步。

          注意:一般來說,像這種同步調(diào)用,funcA和funcB是運(yùn)行在同一個線程中的,這是最為常見的情況。

          但值得注意的是:即使運(yùn)行在兩個不能線程中的函數(shù)也可以進(jìn)行同步調(diào)用,像我們進(jìn)行IO操作時實(shí)際上底層是通過系統(tǒng)調(diào)用的方式向操作系統(tǒng)發(fā)出請求的,比如磁盤文件讀取:

          read(file, buf);

          這就是我們在《深入操作系統(tǒng),理解I/O與零拷貝技術(shù)》中描述的阻塞式I/O,在read函數(shù)返回前程序是無法繼續(xù)向前推進(jìn)的:

          read(file, buf);

          // 程序暫停運(yùn)行,

          // 等待文件讀取完成后繼續(xù)運(yùn)行

          如下圖所示:

          只有當(dāng)read函數(shù)返回后程序才可以被繼續(xù)執(zhí)行。

          注意:和上面的同步調(diào)用不同的是,函數(shù)和被調(diào)函數(shù)運(yùn)行在不同的線程中。

          因此:我們可以得出結(jié)論,同步調(diào)用和函數(shù)與被調(diào)函數(shù)是否運(yùn)行在同一個線程是沒有關(guān)系的。

          在這里我們還要再次強(qiáng)調(diào):同步方式下函數(shù)和被調(diào)函數(shù)無法同時進(jìn)行。

          同步編程對程序員來說是最自然最容易理解的。

          但容易理解的代價就是在一些場景下,同步并不是高效的,原因很簡單,因?yàn)槿蝿?wù)沒有辦法同時進(jìn)行。

          接下來我們看異步調(diào)用。

          7、編程中的異步調(diào)用

          有同步調(diào)用就有異步調(diào)用。

          如果你真的理解了本節(jié)到目前為止的內(nèi)容的話,那么異步調(diào)用對你來說不是問題。

          一般來說:異步調(diào)用總是和I/O操作等耗時較高的任務(wù)如影隨形,像磁盤文件讀寫、網(wǎng)絡(luò)數(shù)據(jù)的收發(fā)、數(shù)據(jù)庫操作等。

          我們還是以磁盤文件讀取為例。

          在read函數(shù)的同步調(diào)用方式下,文件讀取完之前調(diào)用方是無法繼續(xù)向前推進(jìn)的,但如果read函數(shù)可以異步調(diào)用情況就不一樣了。

          假如read函數(shù)可以異步調(diào)用的話,即使文件還沒有讀取完成,read函數(shù)也可以立即返回。

          read(file, buff);

          // read函數(shù)立即返回

          // 不會阻塞當(dāng)前程序

          就像下圖這樣:

          可以看到:在異步這種調(diào)用方式下,調(diào)用方不會被阻塞,函數(shù)調(diào)用完成后可以立即執(zhí)行接下來的程序。

          這時異步的重點(diǎn)就在于:調(diào)用方接下來的程序執(zhí)行可以和文件讀取同時進(jìn)行,從上圖中我們也能看出這一點(diǎn),這就是異步的高效之處。

          但是:請注意,異步調(diào)用對于程序員來說在理解上是一種負(fù)擔(dān),代碼編寫上更是一種負(fù)擔(dān),總的來說,上帝在為你打開一扇門的時候會適當(dāng)?shù)年P(guān)上一扇窗戶。

          有的同學(xué)可能會問,在同步調(diào)用下,調(diào)用方不再繼續(xù)執(zhí)行而是暫停等待,被調(diào)函數(shù)執(zhí)行完后很自然的就是調(diào)用方繼續(xù)執(zhí)行,那么異步調(diào)用下調(diào)用方怎知道被調(diào)函數(shù)是否執(zhí)行完成呢?

          這就分為了兩種情況:

          • 1)調(diào)用方根本就不關(guān)心執(zhí)行結(jié)果;
          • 2)調(diào)用方需要知道執(zhí)行結(jié)果。

          第一種情況比較簡單,無需討論。

          第二種情況下就比較有趣了,通常有兩種實(shí)現(xiàn)方式:

          • 1)一種是通知機(jī)制:當(dāng)任務(wù)執(zhí)行完成后發(fā)送信號來通知調(diào)用方任務(wù)完成(這里的信號有很多實(shí)現(xiàn)方式:Linux中的signal,或使用信號量等機(jī)制都可實(shí)現(xiàn));
          • 2)一種是回調(diào)機(jī)制:也就是我們常說的callback(關(guān)于回調(diào)我們將在下一篇文章中重點(diǎn)講解,本篇會有簡短的討論)。

          接下來我們用一個具體的例子講解一下同步調(diào)用與異步調(diào)用。

          8、具體的編程例子中理解同步和異步

          8.1 一個具體的示例

          我們以常見的Web服務(wù)來舉例說明這一問題。

          一般來說Web Server接收到用戶請求后會有一些典型的處理邏輯,最常見的就是數(shù)據(jù)庫查詢(當(dāng)然,你也可以把這里的數(shù)據(jù)庫查詢換成其它I/O操作,比如磁盤讀取、網(wǎng)絡(luò)通信等),在這里我們假定處理一次用戶請求需要經(jīng)過步驟A、B、C,然后讀取數(shù)據(jù)庫,數(shù)據(jù)庫讀取完成后需要經(jīng)過步驟D、E、F。

          就像這樣:

          # 處理一次用戶請求需要經(jīng)過的步驟:

          A;

          B;

          C;

          數(shù)據(jù)庫讀取;

          D;

          E;

          F;

          其中:步驟A、B、C和D、E、F不需要任何I/O,也就是說這六個步驟不需要讀取文件、網(wǎng)絡(luò)通信等,涉及到I/O操作的只有數(shù)據(jù)庫查詢這一步。

          一般來說:這樣的Web Server有兩個典型的線程:主線程和數(shù)據(jù)庫處理線程(注意:這討論的只是典型的場景,具體業(yè)務(wù)實(shí)際上可會有差別,但這并不影響我們用兩個線程來說明問題)。

          首先我們來看下最簡單的實(shí)現(xiàn)方式,也就是同步。

          這種方式最為自然也最為容易理解:

          // 主線程

          main_thread() {

              A;

              B;

              C;

              發(fā)送數(shù)據(jù)庫查詢請求;

              D;

              E;

              F;

          }

          // 數(shù)據(jù)庫線程

          DataBase_thread() {

              while(1) {

                  處理數(shù)據(jù)庫讀取請求;

                  返回結(jié)果;

              }

          }

          這就是最為典型的同步方法:主線程在發(fā)出數(shù)據(jù)庫查詢請求后就會被阻塞而暫停運(yùn)行,直到數(shù)據(jù)庫查詢完畢后面的D、E、F才可以繼續(xù)運(yùn)行。

          就像下圖這樣:

          從上圖中我們可以看到:主線程中會有“空隙”,這個空隙就是主線程的“休閑時光”,主線程在這段休閑時光中需要等待數(shù)據(jù)庫查詢完成才能繼續(xù)后續(xù)處理流程。

          在這里主線程就好比監(jiān)工的老板,數(shù)據(jù)庫線程就好比苦逼搬磚的程序員,在搬完磚前老板什么都不做只是緊緊的盯著你,等你搬完磚后才去忙其它事情。

          顯然:高效的程序員是不能容忍主線程偷懶的。

          是時候祭出大殺器了,這就是異步:

          在異步這種實(shí)現(xiàn)方案下主線程根本不去等待數(shù)據(jù)庫是否查詢完成,而是發(fā)送完數(shù)據(jù)庫讀寫請求后直接處理下一個請求。

          有的同學(xué)可能會有疑問:一個請求需要經(jīng)過A、B、C、數(shù)據(jù)庫查詢、D、E、F這七個步驟,如果主線程在完成A、B、C、數(shù)據(jù)庫查詢后直接進(jìn)行處理接下來的請求,那么上一個請求中剩下的D、E、F幾個步驟怎么辦呢?

          如果大家還沒有忘記上一小節(jié)內(nèi)容的話應(yīng)該知道,這有兩種情況,我們來分別討論。

          8.2 異步情況1:主線程不關(guān)心數(shù)據(jù)庫操作結(jié)果

          在這種情況下,主線程根本就不關(guān)心數(shù)據(jù)庫是否查詢完畢,數(shù)據(jù)庫查詢完畢后自行處理接下來的D、E、F三個步驟。

          就像下圖這樣:

          看到了吧,接下來重點(diǎn)來了哦。

          我們說過一個請求需要經(jīng)過七個步驟,其中前三個是在主線程中完成的,后四個是在數(shù)據(jù)庫線程中完成的,那么數(shù)據(jù)庫線程是怎么知道查完數(shù)據(jù)庫后要處理D、E、F這幾個步驟呢?

          這時,我們的另一個主角回調(diào)函數(shù)就開始登場啦。

          沒錯,回調(diào)函數(shù)就是用來解決這一問題的。

          我們可以將處理D、E、F這幾個步驟封裝到一個函數(shù)中,假定將該函數(shù)命名為handle_DEF_after_DB_query。

          偽碼如下:

          void handle_DEF_after_DB_query () {

              D;

              E;

              F;

          }

          這樣主線程在發(fā)送數(shù)據(jù)庫查詢請求的同時將該函數(shù)一并當(dāng)做參數(shù)傳遞過去:

          DB_query(request, handle_DEF_after_DB_query);

          數(shù)據(jù)庫線程處理完后直接調(diào)用handle_DEF_after_DB_query就可以了,這就是回調(diào)函數(shù)的作用。

          也有的同學(xué)可能會有疑問,為什么這個函數(shù)要傳遞給數(shù)據(jù)庫線程而不是數(shù)據(jù)庫線程自己定義自己調(diào)用呢?

          因?yàn)閺能浖M織結(jié)構(gòu)上講,這不是數(shù)據(jù)庫線程該做的工作。

          數(shù)據(jù)庫線程需要做的僅僅就是查詢數(shù)據(jù)庫、然后調(diào)用一個處理函數(shù),至于這個處理函數(shù)做了些什么數(shù)據(jù)庫線程根本就不關(guān)心,也不應(yīng)該關(guān)心。

          你可以傳入各種各樣的回調(diào)函數(shù):也就是說數(shù)據(jù)庫系統(tǒng)可以針對回調(diào)函數(shù)這一抽象的函數(shù)變量來編程,從而更好的應(yīng)對變化,因?yàn)榛卣{(diào)函數(shù)的內(nèi)容改變不會影響到數(shù)據(jù)庫線程的邏輯,而如果數(shù)據(jù)庫線程自己定義處理函數(shù)那么這種設(shè)計就沒有靈活性可言了。

          而從軟件開發(fā)的角度看:假設(shè)數(shù)據(jù)庫線程邏輯封裝為了庫提供給其它團(tuán)隊(duì),當(dāng)數(shù)據(jù)庫團(tuán)隊(duì)在研發(fā)時怎么可能知道數(shù)據(jù)庫查詢后該做什么呢?

          然:只有使用方才知道查詢完數(shù)據(jù)庫后該做些什么,因此使用方在使用時簡單的傳入這個回調(diào)函數(shù)就可以了。

          這樣復(fù)雜數(shù)據(jù)庫的團(tuán)隊(duì)就和使用方團(tuán)隊(duì)實(shí)現(xiàn)了所謂的解耦。

          現(xiàn)在你應(yīng)該明白回調(diào)函數(shù)的作用了吧。

          另外:仔細(xì)觀察上面兩張圖,你能看出為什么異步比同步高效嗎?

          原因很簡單,這也是我們在本篇提到過的,異步天然就無需等待,無依賴。

          從上一張圖中我們可以看到主線程的“休閑時光”不見了,取而代之的是不斷的工作、工作、工作,就像苦逼的996程序員一樣,而且數(shù)據(jù)庫線程也沒有那么大段大段的空閑了,取而代之的也是工作、工作、工作。

          主線程處理請求和數(shù)據(jù)庫處理查詢請求可以同時進(jìn)行,因此從系統(tǒng)性能上看,這樣的設(shè)計能更加充分的利用系統(tǒng)資源,更加快速的處理請求;從用戶的角度看,系統(tǒng)的響應(yīng)也會更加迅速。

          這就是異步的高效之處。

          但我們應(yīng)該也可以看出:異步編程并不如同步來的容易理解,系統(tǒng)可維護(hù)性上也不如同步模式。

          那么有沒有一種方法既能結(jié)合同步模式的容易理解又能結(jié)合異步模式的高效呢?答案是肯定的,我們將在后續(xù)章節(jié)詳細(xì)講解這一技術(shù)。

          接下來我們看第二種情況,那就是主線程需要關(guān)心數(shù)據(jù)庫查詢結(jié)果。

          8.2 異步情況2:主線程關(guān)心數(shù)據(jù)庫操作結(jié)果

          在這種情況下,數(shù)據(jù)庫線程需要將查詢結(jié)果利用通知機(jī)制發(fā)送給主線程,主線程在接收到消息后繼續(xù)處理上一個請求的后半部分。

          就像下圖這樣:

          從這里我們可以看到:ABCDEF幾個步驟全部在主線中處理,同時主線程同樣也沒有了“休閑時光”,只不過在這種情況下數(shù)據(jù)庫線程是比較清閑的,從這里并沒有上一種方法高效,但是依然要比同步模式下要高效。

          最后需要注意的是:并不是所有的情況下異步都一定比同步高效,還需要結(jié)合具體業(yè)務(wù)以及IO的復(fù)雜度具體情況具體分析。

          9、本文小結(jié)

          在這篇文章中我們從各種場景分析了同步與異步這兩個概念,但是不管在什么場景下,同步往往意味著雙方要相互等待、相互依賴,而異步意味著雙方相互獨(dú)立、各行其是。希望本篇能對大家理解這兩個重要的概念有所幫助。

          下一篇《從根上理解高性能、高并發(fā)(五):高并發(fā)高性能服務(wù)器到底是如何實(shí)現(xiàn)的》,敬請期待!

          附錄:更多高性能、高并發(fā)文章精選

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

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

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

          高性能網(wǎng)絡(luò)編程(四):從C10K到C10M高性能網(wǎng)絡(luò)應(yīng)用的理論探索

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

          高性能網(wǎng)絡(luò)編程(六):一文讀懂高性能網(wǎng)絡(luò)編程中的線程模型

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

          以網(wǎng)游服務(wù)端的網(wǎng)絡(luò)接入層設(shè)計為例,理解實(shí)時通信的技術(shù)挑戰(zhàn)

          知乎技術(shù)分享:知乎千萬級并發(fā)的高性能長連接網(wǎng)關(guān)技術(shù)實(shí)踐

          淘寶技術(shù)分享:手淘億級移動端接入層網(wǎng)關(guān)的技術(shù)演進(jìn)之路

          一套海量在線用戶的移動端IM架構(gòu)設(shè)計實(shí)踐分享(含詳細(xì)圖文)

          一套原創(chuàng)分布式即時通訊(IM)系統(tǒng)理論架構(gòu)方案

          微信后臺基于時間序的海量數(shù)據(jù)冷熱分級架構(gòu)設(shè)計實(shí)踐

          微信技術(shù)總監(jiān)談架構(gòu):微信之道——大道至簡(演講全文)

          如何解讀《微信技術(shù)總監(jiān)談架構(gòu):微信之道——大道至簡》

          快速裂變:見證微信強(qiáng)大后臺架構(gòu)從0到1的演進(jìn)歷程(一)

          17年的實(shí)踐:騰訊海量產(chǎn)品的技術(shù)方法論

          騰訊資深架構(gòu)師干貨總結(jié):一文讀懂大型分布式系統(tǒng)設(shè)計的方方面面

          以微博類應(yīng)用場景為例,總結(jié)海量社交系統(tǒng)的架構(gòu)設(shè)計步驟

          新手入門:零基礎(chǔ)理解大型分布式架構(gòu)的演進(jìn)歷史、技術(shù)原理、最佳實(shí)踐

          從新手到架構(gòu)師,一篇就夠:從100到1000萬高并發(fā)的架構(gòu)演進(jìn)之路

          本文已同步發(fā)布于“即時通訊技術(shù)圈”公眾號。

          ▲ 本文在公眾號上的鏈接是:點(diǎn)此進(jìn)入,原文鏈接是:http://www.52im.net/thread-3296-1-1.html



          作者:Jack Jiang (點(diǎn)擊作者姓名進(jìn)入Github)
          出處:http://www.52im.net/space-uid-1.html
          交流:歡迎加入即時通訊開發(fā)交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處(也可前往 我的52im.net 找到我)。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 漾濞| 兴安盟| 禄丰县| 团风县| 电白县| 武胜县| 呼玛县| 河间市| 闸北区| 济南市| 南投市| 梅河口市| 普定县| 新民市| 勃利县| 尚志市| 乌鲁木齐县| 万年县| 罗山县| 固阳县| 瑞安市| 佳木斯市| 喀喇沁旗| 三亚市| 磐石市| 九寨沟县| 许昌市| 中宁县| 钦州市| 邢台县| 珠海市| 黔东| 岳阳县| 大姚县| 肇庆市| 汉源县| 三台县| 晋宁县| 永仁县| 修文县| 綦江县|