簡體   English   中英

了解Elixir

[英]Understanding Elixir

SpringBoot和Play等Java框架可以通過利用機器上的所有內核同時處理多個請求嗎? 如果他們能夠做到這一點,那么Elixir在並發方面解決了什么獨特的問題? 它只是一種不同的語言嗎? 或者計算范例本身有什么不同,可以讓我們用Elixir降低服務器成本?

以下是報告: https//www.techworld.com/apps-wearables/how-elixir-helped-bleacher-report-handle-8x-more-traffic-3653957/

主要有三個不同之處。

輕量級流程

Elixir的流程不應與操作系統流程混淆。 Elixir中的進程在內存和CPU方面非常輕量級(甚至與許多其他編程語言中使用的線程相比)。 因此,同時運行數十甚至數十萬個進程並不罕見。 - https://elixir-lang.org/getting-started/processes.html

容錯

ErlangElixir使用監督樹的概念,確保單個過程的崩潰不會對整個應用程序造成任何傷害; 更進一步,Erlang哲學明確指出“讓它崩潰”作為其座右銘。 這基本上意味着你不應該在某種程度上關心錯誤處理。

主管有一個內置機制來限制在給定時間間隔內可能發生的重啟次數。 這由兩個參數MaxR和MaxT的值確定。 如果在最后的MaxT秒內發生超過MaxR重啟次數,則主管關閉其監督並死亡的所有子項。 - http://erlang.org/documentation/doc-4.9.1/doc/design_principles/sup_princ.html

消息傳遞

Erlang進程完全是隔離的 ,而不是數據共享,唯一的機制是傳遞消息; 這使內存管理非常有效和高效。

每個進程都有自己的輸入隊列,用於接收的消息。 收到的新消息放在隊列的末尾。 當進程執行接收時,隊列中的第一條消息將與接收中的第一個模式進行匹配。 如果匹配,則從隊列中刪除該消息,並執行與該模式相對應的動作。 - http://erlang.org/doc/getting_started/conc_prog.html#message-passing

在多個內核上處理多個請求的難點之一是,您現在可以同時運行程序的多個部分並修改狀態。 因此,互聯網和你現在必須擔心一個函數是否是線程安全的,並管理鎖和互斥鎖上的阻塞/等待/恢復。 這意味着您現在擁有一堆潛在的瓶頸,這可以提高成本並減少(甚至消除)您從並發中獲得的收益。

Erlang和Elixir基於'Actor Model'具有並發性。 actor接收消息,並從這些消息中創建新消息,確定如何處理下一條消息,修改自己的內部狀態或創建更多actor。 歸結為每個Actor都有自己的狀態,因此您不再需要擔心鎖或互斥鎖。 這有助於減輕編寫並發代碼的心理負擔,並且作為抽象使得更容易推理並發。 結果是更有效的並發代碼更容易維護。 演員模型可以用任何語言實現,但它被融入Elixir和Erlang。

此外,Elixir和Erlang是函數式語言。 在函數式語言中,副作用,來自先前方法調用的延遲狀態通常是可以避免的。 這意味着只要你不違反功能純度,你就有能力說每次方法都會返回相同的東西。 這意味着f(x)+ f(x)== f(x)* 2。 這意味着您可以更大程度地並行化事物而不用擔心。 在一個線程上運行f(x)而在另一個線程上運行g(x)如果它們在功能上是純的,則不會導致競爭條件。 因為它們中沒有一個會影響狀態。

我將嘗試簡短回答:Erlang / Elixir 強制您使用actor編寫異步,非阻塞代碼。

你可以將演員視為“微觀” - 微服務。 Actor有自己的狀態,它們不共享數據(事實上所有變量都是不可變的),因此需要在彼此之間傳遞異步消息。

Erlang / Elixir有自己的虛擬機,可以處理數十萬個線程和其他優化(線程不是操作系統線程,但是虛擬/輕量級線程,虛擬機避免在內存中復制數據,即使所有變量都是不可變的,只有在真的有必要時復制數據)

我沒有與其他Actor系統約會,所以我無法判斷例如JVM上的Akka是否會獲得類似的性能。 Virtual Actor Systems也可能能夠處理很多工作,Orleans就是這樣一個框架。 (可以將虛擬actor系統與Actors的依賴注入進行比較,當你需要它們時,它們被創建,當它們沒有被使用時,它們被從內存中刪除) https://github.com/dotnet/orleans

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM