亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

<span class=

本文試圖通過漸進的技術分析,和大家分享我們在互聯網高并發技術方案選擇上的一些思考和決策;從技術選型的高度為架構師在面對高并發業務設計時需要考慮的方方面面做一個參考。

Beautiful Concurrency & Pretty Erlang

前言

環信以“連接人與人,連接人與商業”為使命,旨在為廣大企業開發者提供最優質的全球即時通訊PaaS服務。如何實現高并發場景下,彈性化的保障服務質量是我們一貫的業務要求和技術追求。

本文試圖通過漸進的技術分析,和大家分享我們在互聯網高并發技術方案選擇上的一些思考和決策;從技術選型的高度為架構師在面對高并發業務設計時需要考慮的方方面面做一個參考。

接下來,enjoy:

Beautiful Concurrency – 并發的必要性

世界是并發的,軟件也應該是并發的

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

為了與這個世界進行有效的交互,軟件也應該是并發的。

世界是分布的,軟件也應該是分布的

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

世界不可預測,軟件也應該是容錯的

沒有完美的世界:沖突,災難隨時在發生,不管在什么樣的維度上。作為軟件,bug,crash也是不可規避的現實挑戰。即使存在完美的沒有bug的程序,運行程序的硬件也可能出現故障。為了增強軟件的容錯性,代碼的獨立性(指一個故障不會影響到故障任務以外的其它任務)和故障檢測以及故障處理是關鍵:這一切都需要并發,因為串行程序的容錯性遠遠不如并發程序。

并發方案概覽

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

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

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

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

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

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

6.數據級并行:每個筆記本電腦里都藏著一臺超級計算機——GPU。GPU利用了數據級并行,不僅可以快速進行圖像處理,也可以用于更 廣闊的領域。如果要進行有限元分析、流體力學計算或其他的大量數字計算,GPU的性能將是不二選擇。— 在過去的兩年里,華人之光,黃仁勛(Jensen Huang, CEO of Nvidia),從自家的壁爐里一次又一次給大家帶來了震撼世界的革新產品,讓之前高不可攀的GPU飛入尋常百姓家,也帶來了一次又一次的算力之爭。相信在不久的將來,有了GPU算力加持和人工智能算法的普惠使用,會有無數的AI應用層出不窮的涌現,它們會從云端落地到邊緣,人類可能會比自己想象的更早的進入前途未卜的人機爭霸時代。

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

Pretty Erlang

環信的全球即時通訊云的核心網絡是基于Erlang/OTP開發的,截止目前共服務了幾十萬APP客戶,單集群日消息幾十億量級并還在不斷挑戰新高。多年的經驗積累,我們仍在不斷的對系統進行優化,榨取計算,網絡等資源的內生價值,挑戰系統一個又一個不斷提升的指標要求。感謝Erlang/OTP,有了它,我們像站在了巨人肩膀上的一名揮舞利刃的勇士,能夠從容應對各種“黑云壓城城欲摧”的業務壓力和不斷變化,五花八門的業務需求。以下,我們簡單總結了Erlang/OTP幾點讓我們“迷醉的特質”,給想入坑的小伙伴以參考:

Let it Crash!

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

代碼簡潔易懂,僅在需要關心崩潰處理的層級存在容錯代碼;

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

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

Actor Model

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

Actor Model適用于共享內存模型和分布式內存模型,也適合解決地理分布型問題,能提供強大的容錯性,用了都說好!

我個人在曾經的工作中做過一個網絡安全過濾的產品,是靠自己團隊設計編寫的一套消息隊列處理機制來解耦不同業務對相同數據的處理,后來回想起來才驀然發現其實這就是個簡陋的Actor Model設計,只是那個時候還不知道Erlang/OTP,要是早用上這把利器,能節省我生命中多少個日日夜夜啊!

Functional Programming

介紹函數式編程的書籍,資料已經很多了,本文不做過多的展開。簡單列舉下個人的幾點體會:

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

命令式編程的代碼由一系列改變全局狀態的語句構成,而函數式編程則是將計算過程抽象成表達式求值。這些表達式由純數學函數構成,而這些數學函數是第一類對象(我們可以像操作數值一樣操作第一類對象)并且沒有副作用。由于沒有副作用,函數式編程可以更容易做到線程安全,因此特別適合于并發/并行編程。

函數之美帶來美之并發!原文摘抄:

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

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

Future Evolution

對高并發的不懈追求將一直是環信通訊云研發團隊的目標,我們也期待在這條崎嶇山路上不斷攀登,厚積薄發,為環信的客戶帶來一貫的極致產品體驗!

分享到:
標簽:互聯網 選型 并發 實踐 思考 方案 技術 CTO
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定