簡單了解Orleans
Orleans是微軟開源的分散式actor模型框架.actor模型的原理網路上有很多文章.有許多理論性的文章,深刻地我都不知道怎麼應用.在這裡我就不贅述了.既然是博客,就說說自己的理解。
對於編程來說,不管是前台還是後台,在現在的計算機環境下,多線程編程是不可避免的。多線程帶來的很多好處,也帶來的很多編程上的「壞處」。好處就是,什麼並發、高效,高資源利用率等等高大上的詞語。這些就不詳細說了。就說說壞處.
多線程帶來的最大的變化就是:我先前保存的變數A,在我想要再次利用它的時候,A是否被其他線程給更改了?資料庫中叫臟讀,我們拿過來用,「避免臟讀」又有個同義詞叫做「操作的原子性」。為了解決臟讀的問題,有一下幾種辦法:
辦法一變數A在初始賦值的時候,就規定它不可以被更改,就是不可變,英文叫做immutable,很多函數式語言如F#,scala等都有不可變數。既然量是不可變的。就不會有什麼臟讀問題了。這真是個好辦法,但是在C#和JAVA這樣的語言里,這不是個好辦法。
辦法二就是大家經常使用的,多線程,架鎖。精巧的設計類,小心的使用這些來,管理各種資源的競爭。為了避免臟讀,在C#以及JAVA里,架鎖是一個可行的辦法。但是這樣會使得效率變低(鎖架地多了,這個會更明顯),更為關鍵是帶來邏輯的複雜性。架鎖的程序,可以說是一個「正確但是脆弱」的程序。離開了初創人員,後來的人想讀懂讀透?呵呵,人生苦短。
辦法三,也是Orleans採用的辦法,設計一個類,保證這個類從「創建」過程到「銷毀」過程,以及「中途調用它的方法」的執行過程,這三個「過程」不管何時何地調用,都會在同一個線程中運行。這樣的化,我就可以放心大膽的去修改,調用這個類的方法,而不用擔心這個指向這個類的變數出現「臟讀」的情況。這個某種程度上算是辦法一和二的折中。為了說明這個辦法,就不得不說Actor模型。
人與人的溝通只是通過消息,不管是聽聞嗅觸等等感覺,都是往外界往人的身體發送的消息.人處理後做出反應.這個處理與反應是非同步的.接受消息和處理消息都是並行的、同時的進行。actor模型就是模擬這種通信方式.用Actor作為名稱,也算是指明了這個模型想要模擬什麼。
既然是模擬,那就是簡單化。Orleans模型里,每一個actor有專門的類代表它,叫做Grain,這個grain類就是模擬通信場景中的」人」,但是Orleans為了解決多線程帶來的「資源競爭」等問題,採用了辦法三,再Orleans框架內,它保證每個grain類符合以下行為規範:
A. 發往同一個grain類實例的任何消息都會在固定線程內執行。
B. grain類按照接受消息的先後,依次處理消息。在任意時間點,一個grain實例只處理一個消息。
C. grain實例內的欄位屬性,只能由實例本身訪問。外界不能訪問。
在大部分情況下,這些規範都是成立的。這些規範被稱為「單線程機制」。但是也要有「變通」,這些「變通」涉及到很多其他方面,在以後的文章中會解釋是如何變通的,為什麼要變通,以及什麼場景下才需要變通。不過現在你可以認為,這些規則就是「法律」。在Orleans的框架內,這些grain們都是一些「頭腦簡單並且自閉的人」。你作為設計者,如果恰到好處的布置這些「人」,它們會給你驚喜。比如對於消息的處理,可以做到全程無鎖等。。。高大上的特性。
同時Orleans是使用Actor模型的,同時微軟更近了一步,它是使用的虛擬的Actor模型。具體怎麼個虛擬法,這個以後的文章中解釋。
以上說了那麼多,就說明Orleans是使用actor模型的。還沒有說分布。Orleans是分散式的。那是因為所有Actor之間的互動是跨線程的,甚至是跨計算機的。同時Orleans框架保證開啟多個服務端程序實例,通過簡單的配置,它們的行為就會如同單一的服務端實例一樣。客戶端感覺不到區別,簡單的說就是服務端能「合體」。兩個小奧特曼,每個小奧特曼由更小的細胞組成,同時他們又合體變成了一個大的奧特曼,就問你怕不怕,你如果不怕,Orleans甚至實現了「合體的合體」---這種橫向擴展性為高可用,資源的充分利用以及大吞吐量帶來可很大的想像空間,同時也是靈活部署的基礎。另外利用Orleans的Actor模型,也可以很容的實現event sourcing。它甚至已經內置了event sourcing中間件。
Orleans同時也有Net.Core版本,利用它可以實現跨平台運行,它名字叫做Orleans vNext.我是按照framwork版本寫的。兩個版本的使用方法幾乎相同。
這個世界有很多actor模型框架,JAVA和Scala的AKKA,C#的AKKA.Net以及Orleans。它們都是開源的,都可以去下載它們的源碼學習。在寫文章的時候,Orleans版本剛剛是1.5版本,所以我就只能按照1.5版本來寫。
要讀的非常的順暢,我假定讀者都熟悉C#,熟悉多線程,特別是C#中Task類的用法,雖然很多時候,這些沒有這些知識也能非常順利的讀懂,但是有,會在關鍵的時刻幫助你理解Orleans。更進一步,如果熟悉了以上知識,才能明白Orleans能不能幫助你解決實際工作中的問題。以及在技術選型的時候,明白Orleans是不是你想要的。
文章摘自博客園
更多精彩推薦
IT教育專業培訓:http://www.ujiuye.com/
IT職業在線教育:http://xue.ujiuye.com/
零基礎學習java:http://www.ujiuye.com/zt/java/?wt.bd=lsh11tt
※個性測試:你會選擇哪道門?看出你深藏的個性
※同時支持同步和非同步的redis client lib
※Qt5.8以上版本編譯Oracle資料庫的OCI驅動教程
TAG:IT優就業 |
※這樣的iPhone8 Plus你喜歡嗎?iPhone8 Plus簡單開箱評測
※微軟Outlook.com簡單體驗
※WebService就是這麼簡單
※高達seed destiny的bgm簡單推薦與科普
※簡單理解Vue中的nextTick
※瑜伽舞王式Natarajasana這樣練,簡單多了……
※基於Netty的Android系統IM簡單實現原理
※Air Max Day新品提前知曉!可不止推出Virgil Abloh x NIKE這麼簡單!
※SevenFriday的簡單生活機械美學
※super 沒那麼簡單
※簡單區別:Anyone 和 Any One
※iPhone 6 Plus免費換成6sP 沒你想的那麼簡單
※Photoshop排版原來可以這麼簡單
※萌系畫風的網球遊戲,想贏可沒那麼簡單 - pktball #iOS #Android
※PullOver簡單使用教程
※簡單定義Python和Scala的類和對象
※python基礎學習第一課,如何兩步簡單安裝python
※簡單的冬季護膚routine
※《Om Mata Kali》簡單又安心的瑜伽音樂
※「Python」Chapter1 變數和簡單數據類型