日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初探奥尔良(Orleans)

發(fā)布時(shí)間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初探奥尔良(Orleans) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

由于工作上關(guān)系目前經(jīng)常被各種并發(fā)數(shù)據(jù)問題搞得焦頭爛額,要么要性能舍棄數(shù)據(jù)上得一致性,要么要一致性但是卻得到了特別糟糕的響應(yīng)。難道魚和熊掌真的無法兼得嗎?

然后找到了類似奧爾良這種基于Actor模型的kuangjia

首先本人因?yàn)槭荂#系的所以暫不考慮Java系那套,那擺在面前的此類型的框架其實(shí)就2個(gè)。 Akka.Net和Orleans。

什么是Actor?

Actor應(yīng)該說是一種編程模型,一個(gè)Actor是一個(gè)最基本的計(jì)算單原,他能接收消息并執(zhí)行計(jì)算(一個(gè)行為)

它最重要的特性是每個(gè)Actor之間互相隔離,互補(bǔ)共享內(nèi)存,也就是說每個(gè)Actor都能維持一個(gè)私有狀態(tài)且不能被別人所改變。

這對(duì)于我們意味著什么呢?想下一般我們遇到的并發(fā)問題,是不是在我們執(zhí)行某個(gè)操作的時(shí)候,一個(gè)數(shù)據(jù)不正確的被另一個(gè)操作所干擾,導(dǎo)致數(shù)據(jù)最終混亂,而Actor則確保自己的數(shù)據(jù)不能被別人改變(獨(dú)立維護(hù)自己的狀態(tài))以便使得最終一致。

wait

如果Actor自己數(shù)據(jù)不能被別人改變,那就是順序執(zhí)行?那會(huì)不會(huì)很慢?

對(duì)于一個(gè)Actor來說,沒錯(cuò),他還真的就順序執(zhí)行,因此能確保準(zhǔn)確性

但是你真正系統(tǒng)里肯定不會(huì)只有一個(gè)Actor,而是由很多Actor組成,每個(gè)Actor之間是能并行的(因?yàn)樗麄儾还蚕頂?shù)據(jù),所以他們可以互相獨(dú)立的正確處理)

具體來說,當(dāng)并行的消息到達(dá)一個(gè)Actor的時(shí)候,它會(huì)存儲(chǔ)到一個(gè)MailBox(郵箱)里(你可以簡單理解為一個(gè)隊(duì)列),然后Actor從MailBox撈數(shù)據(jù),一條一條順序的撈

然后不同的Actor則并行著處理一樣的事情

由于大家都是互相獨(dú)立的處理各自的事情,數(shù)據(jù)不會(huì)發(fā)生沖突,也就無需類似鎖之類的機(jī)制來確保數(shù)據(jù)一致性問題

由于Actor類文章網(wǎng)上搜索一大片, 在此就不再過多闡述了。

什么是奧爾良?

簡單一句話,微軟的一個(gè)基于Actor模型的實(shí)現(xiàn),具體介紹可以更多參考官網(wǎng)

奧爾良官網(wǎng)

他跟正兒八經(jīng)的Actor相比,微軟習(xí)慣就是將其做更加上層的封裝,Actor都變成了Grains,萬事萬物皆是Grains的感覺?

我干了什么?

我也剛開始入門,發(fā)這篇文章主要是想證實(shí)下,Actor那套是不是真的那么神,本文涉及的所有代碼均在?https://github.com/virtualcca/OrleansTest/tree/master?上面

既然他們說他們是以單線程來處理同一個(gè)Actor,那我就想測試下用Orleans搞一個(gè)并發(fā)轉(zhuǎn)賬的場景,和我常規(guī)的多線程并發(fā)轉(zhuǎn)賬場景的一個(gè)對(duì)比,而我想看到的結(jié)果是,常規(guī)版的由于多線程的問題數(shù)據(jù)總是錯(cuò)亂的,而奧爾良則能始終正確

轉(zhuǎn)賬代碼

我有一個(gè)賬戶,賬戶上面有Money, 我能做2個(gè)操作,要么轉(zhuǎn)錢過來,要么查看我還有多少錢,當(dāng)然,轉(zhuǎn)賬總要點(diǎn)時(shí)間的對(duì)吧,所以轉(zhuǎn)賬時(shí)候Delay了1ms

實(shí)際轉(zhuǎn)賬的執(zhí)行代碼

可以注意下奧爾良版和原始版唯一區(qū)別在于

奧爾良版是通過client.GetGrain來獲取了一個(gè)IAccount,這樣獲取到的是屬于奧爾良托管的一個(gè)Client實(shí)例,對(duì)其執(zhí)行的操作其實(shí)會(huì)發(fā)送到Host里執(zhí)行,然后Host里就是正兒八經(jīng)的Actor架構(gòu)來去處理所有操作

但是正如之前介紹Actor的時(shí)候談到單個(gè)Actor是單線程,而多個(gè)Actor之間是并發(fā),如何確定你是一個(gè)還是多個(gè)Actor,是通過一個(gè)Id來區(qū)分(具體奧爾良官網(wǎng)有介紹),而GetGrain后面的那個(gè)0的參數(shù)就是他的Id,也就是我的這個(gè)IAccount是屬于一個(gè)Actor

常規(guī)版直接new一個(gè)實(shí)例執(zhí)行同樣操作

然后代碼運(yùn)行,可以看到結(jié)果

原始版的結(jié)果僅供參考,我每次運(yùn)行得出來的結(jié)果也都不一樣(多線程執(zhí)行順序是不確定的)

而奧爾良版則能正確的恒定輸出4950

至此,可以明確奧爾良完美的實(shí)現(xiàn)了Actor里關(guān)于單個(gè)Actor單線程的這么個(gè)處理。。。。

原文地址:https://www.cnblogs.com/leolaw/p/10546239.html

.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com

總結(jié)

以上是生活随笔為你收集整理的初探奥尔良(Orleans)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。