日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

<span class=

本文試圖通過漸進(jìn)的技術(shù)分析,和大家分享我們?cè)诨ヂ?lián)網(wǎng)高并發(fā)技術(shù)方案選擇上的一些思考和決策;從技術(shù)選型的高度為架構(gòu)師在面對(duì)高并發(fā)業(yè)務(wù)設(shè)計(jì)時(shí)需要考慮的方方面面做一個(gè)參考。

Beautiful Concurrency & Pretty Erlang

前言

環(huán)信以“連接人與人,連接人與商業(yè)”為使命,旨在為廣大企業(yè)開發(fā)者提供最優(yōu)質(zhì)的全球即時(shí)通訊PaaS服務(wù)。如何實(shí)現(xiàn)高并發(fā)場(chǎng)景下,彈性化的保障服務(wù)質(zhì)量是我們一貫的業(yè)務(wù)要求和技術(shù)追求。

本文試圖通過漸進(jìn)的技術(shù)分析,和大家分享我們?cè)诨ヂ?lián)網(wǎng)高并發(fā)技術(shù)方案選擇上的一些思考和決策;從技術(shù)選型的高度為架構(gòu)師在面對(duì)高并發(fā)業(yè)務(wù)設(shè)計(jì)時(shí)需要考慮的方方面面做一個(gè)參考。

接下來,enjoy:

Beautiful Concurrency – 并發(fā)的必要性

世界是并發(fā)的,軟件也應(yīng)該是并發(fā)的

我們生活在其中的世界,就是一個(gè)巨大的并發(fā)系統(tǒng)。每時(shí)每刻,在世界的每一個(gè)角落,人類的每一個(gè)個(gè)體都在和這個(gè)世界進(jìn)行著頻繁的能量交互,信息交互也是其中的重要組成部分;當(dāng)我們轉(zhuǎn)換身份,以造物主的視角俯瞰這個(gè)世界里所有的萬物(動(dòng)物,植物,海洋,土壤,機(jī)器等等)時(shí),也可以看到它們同樣在和這個(gè)世界進(jìn)行著無休止的能量/信息交互。

為了與這個(gè)世界進(jìn)行有效的交互,軟件也應(yīng)該是并發(fā)的。

世界是分布的,軟件也應(yīng)該是分布的

地球是圓的,世界是平的,不管怎樣,從宇宙大爆炸的那個(gè)奇點(diǎn)之后,就是分布的宇宙/世界。作為與世界萬物(包括人類自己)交互的軟件,自然也必須滿足分布式要求。而這種地理分布(Geo. Distribution)特性,也僅是并發(fā)在空間維度下的反映而已。

世界不可預(yù)測(cè),軟件也應(yīng)該是容錯(cuò)的

沒有完美的世界:沖突,災(zāi)難隨時(shí)在發(fā)生,不管在什么樣的維度上。作為軟件,bug,crash也是不可規(guī)避的現(xiàn)實(shí)挑戰(zhàn)。即使存在完美的沒有bug的程序,運(yùn)行程序的硬件也可能出現(xiàn)故障。為了增強(qiáng)軟件的容錯(cuò)性,代碼的獨(dú)立性(指一個(gè)故障不會(huì)影響到故障任務(wù)以外的其它任務(wù))和故障檢測(cè)以及故障處理是關(guān)鍵:這一切都需要并發(fā),因?yàn)榇谐绦虻娜蒎e(cuò)性遠(yuǎn)遠(yuǎn)不如并發(fā)程序。

并發(fā)方案概覽

“七個(gè)模型”來源于Paul Butcher著的《Seven Concurrency Models in Seven Weeks》,中文譯名《七周七并發(fā)模型》,概覽的介紹了并發(fā)領(lǐng)域的常見方案,希望能給架構(gòu)師提供一個(gè)輪廓化的分類描述。本人在其基礎(chǔ)上添加了一些自己的拓展思考(見下文中斜體部分):

1.線程與鎖:線程與鎖模型有很多眾所周知的不足,但仍是其他模型的技術(shù)基礎(chǔ),也是很多并發(fā)軟件開發(fā)的首選。—這個(gè)方案其實(shí)是一個(gè)anti-pattern,在高并發(fā)場(chǎng)景下如履薄冰(bug,dead lock如影隨形),讓開發(fā)者和運(yùn)維人員膽戰(zhàn)心驚。Ugly Locks to Ugly Concurrency (丑陋的鎖,丑陋的并發(fā)):locks and condition variables is fundamentally flawed!

2.函數(shù)式編程:函數(shù)式編程日漸重要的原因之一,是其對(duì)并發(fā)編程和并行編程提供了良好的支持。函數(shù)式編程消除了可變狀態(tài),所以從根本上是線程安全的,而且易于并行執(zhí)行。— 函數(shù)之美,邏輯之美!相信很多從命令式語言(Imperative Programming)轉(zhuǎn)戰(zhàn)到函數(shù)式編程語言(Functional Programminmg)的時(shí)候都會(huì)發(fā)出這樣的感嘆。其實(shí)這一進(jìn)步恰恰體現(xiàn)了人類在不斷的進(jìn)化過程中,對(duì)這個(gè)世界認(rèn)知不斷提煉,思維模式逐步由具象走向抽象的演進(jìn)軌跡。而回到高并發(fā)的話題上,函數(shù)式編程以不可變狀態(tài)這一簡(jiǎn)易的策略,贏得了完美贊譽(yù),儼然已是君臨天下的明日霸主!

3.分離標(biāo)識(shí)與狀態(tài):如果一個(gè)線程引用了持久數(shù)據(jù)結(jié)構(gòu),那么其他線程對(duì)數(shù)據(jù)結(jié)構(gòu)的修改對(duì)該線程就是不可見的。因此持久數(shù)據(jù)結(jié)構(gòu)對(duì)并發(fā)編程的意義非比尋 常,其分離了標(biāo)識(shí)(identity)與狀態(tài)(state)。— 這又是一個(gè)很妙的策略,而大家熟知的version control system如git,包括比特幣/區(qū)塊鏈的機(jī)制都是這一思想指導(dǎo)下的具體實(shí)踐,限于篇幅,本文不做進(jìn)一步展開。

4.Actor Model:一種適用性很廣的并發(fā)編程模型,適用于共享內(nèi)存模型和分布式內(nèi)存模型,也適合解決地理分布型問題,能提供強(qiáng)大的容錯(cuò)性。— 最開始接觸到Actor模型就是通過Erlang語言,后來又接觸到Akka(基于Scala)等基于各種語言實(shí)現(xiàn)的框架,也越來越體會(huì)到這一模型在高并發(fā)場(chǎng)景下的游刃有余。本文后續(xù)部分會(huì)展開介紹。另外,做個(gè)招聘小廣告,環(huán)信通訊云研發(fā)團(tuán)隊(duì)正在廣納英才,歡迎懂Erlang,有相關(guān)高并發(fā)開發(fā)經(jīng)驗(yàn)的小伙伴加盟,虛位以待!點(diǎn)這里直接聯(lián)系我們喲!

5.CSP(Communicating Sequential Processes, CSP):表面上看,CSP模型與Actor Model很相似,兩者都基于消息傳遞。不過CSP模型側(cè)重于傳遞信息的通道,而Actor Model側(cè)重于通道兩端的實(shí)體,使用CSP模型的代碼會(huì)帶有明顯不同的風(fēng)格。— 這里就是channel可以大施拳腳的天地了,go go go!限于篇幅,本文不做進(jìn)一步展開。同樣的,歡迎懂Golang,有相關(guān)高并發(fā)開發(fā)經(jīng)驗(yàn)的小伙伴加盟,虛位以待!

6.數(shù)據(jù)級(jí)并行:每個(gè)筆記本電腦里都藏著一臺(tái)超級(jí)計(jì)算機(jī)——GPU。GPU利用了數(shù)據(jù)級(jí)并行,不僅可以快速進(jìn)行圖像處理,也可以用于更 廣闊的領(lǐng)域。如果要進(jìn)行有限元分析、流體力學(xué)計(jì)算或其他的大量數(shù)字計(jì)算,GPU的性能將是不二選擇。— 在過去的兩年里,華人之光,黃仁勛(Jensen Huang, CEO of Nvidia),從自家的壁爐里一次又一次給大家?guī)砹苏鸷呈澜绲母镄庐a(chǎn)品,讓之前高不可攀的GPU飛入尋常百姓家,也帶來了一次又一次的算力之爭(zhēng)。相信在不久的將來,有了GPU算力加持和人工智能算法的普惠使用,會(huì)有無數(shù)的AI應(yīng)用層出不窮的涌現(xiàn),它們會(huì)從云端落地到邊緣,人類可能會(huì)比自己想象的更早的進(jìn)入前途未卜的人機(jī)爭(zhēng)霸時(shí)代。

7.Lambda架構(gòu):Lambda架構(gòu)綜合了MapReduce和流式處理的特點(diǎn),是一種可以處理多種大數(shù)據(jù)問題的架構(gòu)。— Lambda架構(gòu)也是采用了數(shù)據(jù)并行處理技術(shù),但是它把并行算力的微觀場(chǎng)景放大到了一個(gè)更大的尺度:將數(shù)據(jù)和計(jì)算分布到成千上萬臺(tái)機(jī)器組成的集群上進(jìn)行,將并發(fā),分布特性整合到一套方案中,通過兩層(批處理層-Batch Layer,加速層-Speed Layer/Streaming Process)的組合,實(shí)現(xiàn)了高計(jì)算效率和低延遲的“魚與熊掌兼得”。

Pretty Erlang

環(huán)信的全球即時(shí)通訊云的核心網(wǎng)絡(luò)是基于Erlang/OTP開發(fā)的,截止目前共服務(wù)了幾十萬APP客戶,單集群日消息幾十億量級(jí)并還在不斷挑戰(zhàn)新高。多年的經(jīng)驗(yàn)積累,我們?nèi)栽诓粩嗟膶?duì)系統(tǒng)進(jìn)行優(yōu)化,榨取計(jì)算,網(wǎng)絡(luò)等資源的內(nèi)生價(jià)值,挑戰(zhàn)系統(tǒng)一個(gè)又一個(gè)不斷提升的指標(biāo)要求。感謝Erlang/OTP,有了它,我們像站在了巨人肩膀上的一名揮舞利刃的勇士,能夠從容應(yīng)對(duì)各種“黑云壓城城欲摧”的業(yè)務(wù)壓力和不斷變化,五花八門的業(yè)務(wù)需求。以下,我們簡(jiǎn)單總結(jié)了Erlang/OTP幾點(diǎn)讓我們“迷醉的特質(zhì)”,給想入坑的小伙伴以參考:

Let it Crash!

再一次,讓我們理解了“思維高度決定人生高度”。當(dāng)其它語言或者解決方案防御性的,想方設(shè)法捕獲異常/錯(cuò)誤并盡力挽回“敗局”的時(shí)候,Erlang采納了”Let it crash!”的策略,把重點(diǎn)放在了錯(cuò)誤的檢測(cè)和錯(cuò)誤通知體系上,通過嚴(yán)謹(jǐn)設(shè)計(jì)的單向,雙向link機(jī)制,OTP基于此設(shè)計(jì)的supervisor behaviour層級(jí)(Hierarchical)管理匯報(bào)機(jī)制,”任其崩潰“的同時(shí)又干凈漂亮的將所有Actor(進(jìn)程)在發(fā)生異常時(shí)的行為進(jìn)行了簡(jiǎn)單但有效的管理,獲得了意想不到的好處:

代碼簡(jiǎn)潔易懂,僅在需要關(guān)心崩潰處理的層級(jí)存在容錯(cuò)代碼;

由于Actor Model的設(shè)計(jì),Actor之間相互獨(dú)立,也不共享狀態(tài),因此任何一個(gè)Actor的崩潰并不會(huì)影響其它Actor,遑論它的管理者(Supervisor),因此管理者可以從容的處理被管理Actor的崩潰;

管理者也可以不處理崩潰,僅記錄相應(yīng)崩潰,繼而通過查看崩潰通知來進(jìn)行后續(xù)處理。這個(gè)策略在后續(xù)Pattern Matching時(shí)候還會(huì)見到,我們可以在_Other(所有匹配均未觸發(fā))保護(hù)匹配中記錄相應(yīng)信息,而不必為事先預(yù)估不到的場(chǎng)景絞盡腦汁!

Actor Model

Actor Model是Pure OO的設(shè)計(jì)(而Java類與方法的設(shè)計(jì)并不是,意不意外?):每一個(gè)Actor封裝了狀態(tài),外界并沒有任何方法來操縱(manipulate)對(duì)象,它們唯有通過發(fā)送消息通知Actor,由Actor自己控制對(duì)消息的處理,這種簡(jiǎn)化同樣為高并發(fā)處理提供了意料之外的強(qiáng)大支持。

Actor Model適用于共享內(nèi)存模型和分布式內(nèi)存模型,也適合解決地理分布型問題,能提供強(qiáng)大的容錯(cuò)性,用了都說好!

我個(gè)人在曾經(jīng)的工作中做過一個(gè)網(wǎng)絡(luò)安全過濾的產(chǎn)品,是靠自己團(tuán)隊(duì)設(shè)計(jì)編寫的一套消息隊(duì)列處理機(jī)制來解耦不同業(yè)務(wù)對(duì)相同數(shù)據(jù)的處理,后來回想起來才驀然發(fā)現(xiàn)其實(shí)這就是個(gè)簡(jiǎn)陋的Actor Model設(shè)計(jì),只是那個(gè)時(shí)候還不知道Erlang/OTP,要是早用上這把利器,能節(jié)省我生命中多少個(gè)日日夜夜啊!

Functional Programming

介紹函數(shù)式編程的書籍,資料已經(jīng)很多了,本文不做過多的展開。簡(jiǎn)單列舉下個(gè)人的幾點(diǎn)體會(huì):

程序最終還是要交給機(jī)器處理,因此要盡量按照機(jī)器的思維模式去編寫程序(雖然有時(shí)候會(huì)讓程序員頭大),最簡(jiǎn)單的 (a + b) 與 (+ a b):前者對(duì)人類友好,而后者對(duì)機(jī)器友好,因而也能帶來更好的程序一致性,繼而使得系統(tǒng)可以設(shè)計(jì)的更簡(jiǎn)單;

命令式編程的代碼由一系列改變?nèi)譅顟B(tài)的語句構(gòu)成,而函數(shù)式編程則是將計(jì)算過程抽象成表達(dá)式求值。這些表達(dá)式由純數(shù)學(xué)函數(shù)構(gòu)成,而這些數(shù)學(xué)函數(shù)是第一類對(duì)象(我們可以像操作數(shù)值一樣操作第一類對(duì)象)并且沒有副作用。由于沒有副作用,函數(shù)式編程可以更容易做到線程安全,因此特別適合于并發(fā)/并行編程。

函數(shù)之美帶來美之并發(fā)!原文摘抄:

For me, a beautiful program is one that is so simple and elegant that itobviously has no mistakes,rather than merely having no obvious mistakes. If we want to write parallel programs that work reliably, we must pay particular attention to beauty.

Pattern Matching

又一個(gè)讓你被美折服的設(shè)計(jì):函數(shù)在這種Pattern Matching的語法結(jié)構(gòu)的描摹下,儼然變成了一道道證明題,你只需要描述(并不需要窮舉)你所關(guān)心的場(chǎng)景(Conditon)下自己的想法,剩下的就交給”模式匹配“這個(gè)自動(dòng)化機(jī)器幫你完成。你可能想不到的是,”Pattern Matching“發(fā)揮功效的地方并不只是case/if出現(xiàn)的地方,你的整個(gè)代碼都是在”Pattern Matching“的魔力下散發(fā)它優(yōu)雅的魅力。

Future Evolution

對(duì)高并發(fā)的不懈追求將一直是環(huán)信通訊云研發(fā)團(tuán)隊(duì)的目標(biāo),我們也期待在這條崎嶇山路上不斷攀登,厚積薄發(fā),為環(huán)信的客戶帶來一貫的極致產(chǎn)品體驗(yàn)!

分享到:
標(biāo)簽:互聯(lián)網(wǎng) 選型 并發(fā) 實(shí)踐 思考 方案 技術(shù) CTO
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定