Orleans是微軟開源的分佈式actor模型框架.actor模型的原理網絡上有不少文章.有許多理論性的文章,深入地我都不知道怎麼應用.在這裏我就不贅述了.既然是博客,就說說本身的理解。html
對於編程來講,不論是前臺仍是後臺,在如今的計算機環境下,多線程編程是不可避免的。多線程帶來的不少好處,也帶來的不少編程上的「壞處」。好處就是,什麼併發、高效,高資源利用率等等高大上的詞語。這些就不詳細說了。就說說壞處.數據庫
多線程帶來的最大的變化就是:我先前保存的變量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是否是你想要的。
我初步計劃寫8篇左右.爭取把Orleans的全部主要方面介紹完畢,初步目的是看完以後能用Orleans處理問題.
我曾經對Orleans進行了簡單的翻譯.並做爲資料與好友分享.考慮到國內Orleans的框架文章並非不少,因此想寫一些文章,來介紹一下它. ,本人不是什麼大牛,只是肯花時間而已.必定有不少地方不完善,甚至是錯誤的.可以有資格」用」此框架的人,必定都是公司的技術骨幹,因此我也有不少地方向你們學習.若是誰想跟我交流聯繫,歡迎加我QQ:82676624.
在寫這些文章的時候,有些類並無使用漢語翻譯,而是直接拿來了英文單詞,這是由於這些單詞大部分狀況下在Orleans系統內表明着特定的意思,甚至是類的名字。直接用英文單詞方便編寫程序。另外一些則是一些通用的詞語。總而言之,是由於懶。
爲了更爲深刻的展開,先舉個栗子。同時這裏會集中Orleans文章的連接
在這裏: