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是不是你想要的。
我初步計划寫8篇左右.爭取把Orleans的所有主要方面介紹完畢,初步目的是看完之后能用Orleans處理問題.
我曾經對Orleans進行了簡單的翻譯.並作為資料與好友分享.考慮到國內Orleans的框架文章並不是很多,所以想寫一些文章,來介紹一下它. ,本人不是什么大牛,只是肯花時間而已.一定有很多地方不完善,甚至是錯誤的.能夠有資格”用”此框架的人,一定都是公司的技術骨干,所以我也有很多地方向大家學習.如果誰想跟我交流聯系,歡迎加我QQ:82676624.
在寫這些文章的時候,有些類並沒有使用漢語翻譯,而是直接拿來了英文單詞,這是因為這些單詞大部分情況下在Orleans系統內代表着特定的意思,甚至是類的名字。直接用英文單詞方便編寫程序。另一些則是一些通用的詞語。總而言之,是因為懶。
為了更為深入的展開,先舉個栗子。同時這里會集中Orleans文章的鏈接
在這里: