ruby服務(wù)器并發(fā)模型(譯)

并發(fā)

通常情況下會有很多用戶同時使用你的應(yīng)用,并且你也希望應(yīng)用能夠及時響應(yīng)用戶的請求觉痛。那么你就需要使用某種方法去處理并發(fā)問題役衡,大部分的 web服務(wù)器已經(jīng)默認實現(xiàn)了。但是當(dāng)你要擴大規(guī)模的時候薪棒,你就要盡可能的使用高效的并發(fā)模型映挂。

不同的并發(fā)類型

處理并發(fā)問題,有多種途徑:多線程盗尸,多線程和事件循環(huán)柑船,其中每一種都有自己的使用場景,優(yōu)點及缺點泼各。通過本文你會了解到它們的不同點和使用場景鞍时。

多進程(Unicorn)

是用多進程模型是比較容易實現(xiàn)并發(fā)的,主進程自身forks出多個工作進程扣蜻,工作進程是用于實際處理請求的逆巍,而主進程用于管理工作進程。


每個工作進程在內(nèi)存中有完整的代碼基莽使。這導(dǎo)致多進程模型很容易內(nèi)存吃緊并且很難擴充到大規(guī)模架構(gòu)上锐极。

多進程小結(jié)

場景
一個非 ruby 的例子就是眾所周知的Chrome 瀏覽器.
它使用多進程并發(fā)給每個標(biāo)簽頁分配一個進程,這樣就不會因為一個標(biāo)簽頁掛掉的導(dǎo)致整個瀏覽器停止工作芳肌。并且可以隔離開發(fā)單個標(biāo)簽頁灵再。

優(yōu)點
非常容易實現(xiàn),避免了多線程的安全問題亿笤,每個工作進程掛掉并不影響整個系統(tǒng)的其他部分翎迁。

缺點
每個進程會加載整個代碼庫到內(nèi)存當(dāng)中去。這會使得內(nèi)存變得吃緊净薛,因此不適合大規(guī)模并發(fā)請求汪榔。

多線程(Puma)

多線程模型,是通過在一個進程中運行多個線程來讓一個進程可以同時去處理多個請求肃拜。
與多進程不同, 所有的線程運行在一個進程中痴腌,這代表著它們中間是可以共享例如全局變量這樣的數(shù)據(jù)的雌团。因此每個線程只會額外使用少量的內(nèi)存。


全局解釋鎖(Global Interpreter Lock)
在 MRI中使用線程會遇到全局解釋鎖(GIL)士聪。GIL被是用于鎖定所有 ruby 代碼的執(zhí)行的辱姨,盡管我們的線程看上去是并行執(zhí)行的雨涛,但實際上一個時間內(nèi)只有一個線程是激活的懦胞。
IO 操作不受 GIL的限制,當(dāng)你等待執(zhí)行數(shù)據(jù)庫的返回結(jié)果時蚯根,是不會被鎖定的胀糜,其他的線程也是可以同時執(zhí)行同樣的 IO操作的,如果你在線程中使用哈暇嗨В或者數(shù)組去處理大量的數(shù)學(xué)計算的話,那么你只能利用一個核心括堤。如果你使用 MRI 在大部分場景下還行需要使用多進程模型碌秸,去充分利用機器資源,或者你也可以使用 Rubinius或 jRuby悄窃,
這種沒有 GIL 的 ruby 實現(xiàn)讥电。
線程安全
如果你使用多線程模型,那么就必須十分小心的操作線程中的共享數(shù)據(jù)轧抗。你可以通過使用 互斥鎖 在操作共享數(shù)據(jù)前鎖定它恩敌,這樣就可以確保其他線程不會在你已經(jīng)修改了數(shù)據(jù)的情況下,還使用過期的數(shù)據(jù)横媚。

多線程小總結(jié)

場景
這是一種折衷方案纠炮,被用于很多請求量少的普通 web 應(yīng)用中

優(yōu)點
相比于多進程模型,可以使用較少的內(nèi)存分唾。

缺點
你要確保你的代碼是線程安全的抗碰,如果線程出現(xiàn)了崩潰,那么它很有可能讓你的整個進程一起崩潰掉绽乔。GIL會鎖定除 IO之外的所有操作

事件循環(huán)(Thin)

事件循環(huán)是用于,當(dāng)你需要執(zhí)行很多并發(fā) IO操作的場景碳褒。這個模型本身不會強制的讓多個請求在同時執(zhí)行折砸,而是通過高效的方式處理并發(fā)看疗。
下面 你會看到非常簡單的使用 Ruby寫成的事件循環(huán)示例,循環(huán)從事件隊列中取出事件處理睦授,如果隊列為空两芳,他會休眠然后繼續(xù)查看隊列中是否有新的事件

loop do 
  if event_queue.any? 
    handle_event(event_queue.pop) 
  else
    sleep 0.1
  end
end

在圖中,我們能夠清晰的了解到事件循環(huán)是如何與操作系統(tǒng)隊列和內(nèi)存交互的


步驟

  1. 操作系統(tǒng)一直監(jiān)聽網(wǎng)絡(luò)和磁盤何時可用去枷。
  2. 當(dāng)操作系統(tǒng)看到 I/O 可用后, 它就會將事件添加到隊列中去竖螃。
  3. 隊列中存儲這若干,待事件循環(huán)處理的事件腻格。
  4. 事件循環(huán)用于處理事件菜职,并使用在內(nèi)存中存儲與連接相關(guān)的元數(shù)據(jù),也可以再次直接發(fā)送新的事件到事件隊列中去愁茁。
  5. 如果想要進行 I/O 操作鹅很,事件循環(huán)會告訴操作系統(tǒng),它想繼續(xù)那個特定的 I/O操作菠齿。操作系統(tǒng)繼續(xù)監(jiān)聽網(wǎng)絡(luò)和磁盤绳匀,并且當(dāng)I/O可用后再次添加事件

事件循環(huán)小結(jié)

用例
有很多并發(fā)連接的場景戈钢,例如 Slack, Chrome notifications

優(yōu)點
每個連接幾乎沒有多少內(nèi)存開銷殉了,可處理大量的并行連接

缺點
事件循環(huán)不是一個容易理解的模型。為防止隊列爆增隔箍,處理批次的大小必須小并且可預(yù)測鞍恢。

究竟該使用哪一種模型?

希望這篇文章能夠更好的讓你理解不同的并發(fā)模型蟆炊,雖然其中有些主題難以理解涩搓,但是掌握這些會讓你有工具去實驗并且能用正確的組織構(gòu)建你的應(yīng)用。

總結(jié)

大部分應(yīng)用適合使用多線程模型充边,Ruby/Rails 生態(tài)圈 看起來正在(緩慢)向這個方面發(fā)展浇冰。
如果你的應(yīng)用是高并發(fā)長連接的肘习,那么事件循環(huán)很容你幫你實現(xiàn)漂佩。
如果你的應(yīng)用不是高訪問量的網(wǎng)站器赞,那么使用多進程的方式就以及足夠好了墓拜。
當(dāng)然,還有一種可能是在多進程嵌套多線程爽锥,在多線程中再使用事件循環(huán)臣樱。

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棚放,隨后出現(xiàn)的幾起案子飘蚯,更是在濱河造成了極大的恐慌局骤,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穴店,死亡現(xiàn)場離奇詭異泣洞,居然都是意外死亡,警方通過查閱死者的電腦和手機呕诉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門贴硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挖诸,你說我怎么就攤上這事多律±擒瘢” “怎么了粘秆?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昔搂。 經(jīng)常有香客問我摘符,道長逛裤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任蝙砌,我火速辦了婚禮恬总,結(jié)果婚禮上壹堰,老公的妹妹穿的比我還像新娘记劈。我一直安慰自己目木,他們只是感情好军拟,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布摹恰。 她就那樣靜靜地躺著俗慈,像睡著了一般闺阱。 火紅的嫁衣襯著肌膚如雪瘦穆。 梳的紋絲不亂的頭發(fā)上扛或,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音拢切,去河邊找鬼淮椰。 笑死,一個胖子當(dāng)著我的面吹牛忽媒,可吹牛的內(nèi)容都是我干的晦雨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洽腺!你這毒婦竟也來了已脓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤通殃,失蹤者是張志新(化名)和其女友劉穎度液,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體画舌,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡堕担,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了曲聂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡特愿,死狀恐怖毒嫡,靈堂內(nèi)的尸體忽然破棺而出洽洁,到底是詐尸還是另有隱情复唤,我是刑警寧澤呈宇,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站衣形,受9級特大地震影響句狼,放射性物質(zhì)發(fā)生泄漏熔号。R本人自食惡果不足惜诽凌,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裁僧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春溉箕,著一層夾襖步出監(jiān)牢的瞬間肴茄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工谓谦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留反粥,地道東北人才顿。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像示弓,于是被迫代替她去往敵國和親呵萨。 傳聞我的和親對象是個殘疾皇子潮峦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容