啥是Actor模型
Actor (英語翻譯 演員) 這個概念要回溯到面向對象程序設計的本身上來,更偏向于現實世界,現實世界就是由單個個體(人)與其他個體或(人)通訊(消息)組成的現實世界,所以,它的好處是顯而易見的,生活就是Actor。
現有的面向對象編程模型是基于內存共享線程模型的,而Actor是基于消息模型的,Actor 之間是完全隔離的,不會共享任何變量。
基于內存,那么,內存會溢出,異常,基于消息的話,則沒有這種困擾。
又由于它變相的來講是單線程的,自己處理自己的事務,又實現了與其他業務的隔離。
Erlang語言,天生支持Actor模型,是一個好語言啊。
Actor 的優勢
1.?Actor不共享狀態
2.?高并發,無鎖(無共享狀態)
3.?Actor效率高(同一時刻只處理一個任務,屬于單線程處理)
Actor 框架有
1.?Orleans
2.?Dapr
3.?Akka.NET
4.?Proto.Actor
Actor模型的實現
為啥要實現Actor模型,一個是為了更深入的了解它,一個是想實現一下。
可能在某些地方直接就用了。沒必要搞那么復雜引用。
Actor模型的原理
按照自己的理解畫了一下。

簡單來講,就是各個服務都可以投遞消息到Actor實例里,Actor會從郵箱里把消息取出來,然后,消費掉。這么簡單的一件事情。
Actor 代碼邏輯的實現
IActor.cs
///?<summary>
///?無鎖并行編程模型(暫時用來處理串行任務,任務串行執行)
///?</summary>
public?interface?IActor
{///?<summary>///?增加消息///?</summary>///?<returns></returns>bool?AddMsg(object?message);///?<summary>///?啟動服務///?</summary>///?<returns></returns>Task?Start();///?<summary>///?停止服務運行,等待毫秒數///?</summary>///?<param?name="WatingTimeout"></param>///?<returns></returns>bool?Stop(int?WatingTimeout);
}
Actor.cs
///?<summary>
///?Actor抽象
///?</summary>
public?abstract?class?Actor?:?IDisposable,?IActor
{public?Actor(string?name){Name?=?name;MailBox?=?new?BlockingCollection<object>();}///?<summary>///?名稱///?</summary>public?string?Name?{?get;?set;?}///?<summary>///?是否啟用///?</summary>public?bool?Active?{?get;?private?set;?}///?<summary>///?是否長時間運行。長時間運行任務使用獨立線程,默認true///?</summary>public?bool?LongRunning?{?get;?set;?}?=?true;///?<summary>///?處理的消息郵箱///?</summary>public?BlockingCollection<object>?MailBox?{?get;?set;?}///?<summary>///?內置任務///?</summary>private?Task?_task;public?virtual?Task?Start(){if?(Active)?return?_task;Active?=?true;//?啟動異步if?(_task?==?null){lock?(this){if?(_task?==?null){_task?=?Task.Factory.StartNew(DoActorWork,?LongRunning???TaskCreationOptions.LongRunning?:?TaskCreationOptions.None);}}}return?_task;}public?virtual?bool?Stop(int?WatingTimeout?=?100){MailBox?.CompleteAdding();Active?=?false;if?(WatingTimeout?==?0?||?_task?==?null)?return?true;return?_task.Wait(WatingTimeout);}public?virtual?bool?AddMsg(object?message){//?自動開始if?(!Active){Start();}if?(!Active){return?false;}MailBox.Add(message);return?true;}///?<summary>///?循環消費消息///?</summary>private?void?DoActorWork(){while?(!MailBox.IsCompleted){try{var?ctx?=?MailBox.Take();var?task?=?ProcessAsync(ctx);if?(task?!=?null){task.Wait();}}catch?(InvalidOperationException)?{?}catch?(Exception?ex){Console.WriteLine($"DoActorWork?Error?:?{ex.Message}");}}Active?=?false;}///?<summary>///?處理消息///?</summary>///?<returns></returns>public?abstract?Task?ProcessAsync(object?msg);public?void?Dispose(){try{Stop(100);}catch?(Exception){}while?(MailBox?.TryTake(out?_)?==?true)?{?}MailBox?=?null;}
}
相關測試模型
AccumulationActor.cs
///?<summary>
///?累加
///?</summary>
public?class?AccumulationActor?:?Actor
{private?int?Count?=?0;private?IActor?actor;public?AccumulationActor(IActor?actor)?:?base(nameof(AccumulationActor)){Count?=?0;this.actor?=?actor;}???///?<summary>///?處理信息///?</summary>///?<returns></returns>public?override?Task?ProcessAsync(object?msg){try{var??msgNumber?=?(int)(msg);Count?+=?msgNumber;Console.WriteLine($"處理{this.Name}?:{msg}?,累積總數:{Count}");if?(Count?>=?100){this.actor.AddMsg(Count);Count?=?0;}}catch?(Exception?e){Console.WriteLine($"業務處理異常:{e.Message}");}return?Task.CompletedTask;}
}
WriteActor.cs
///?<summary>///?輸出///?</summary>public?class?WriteActor?:?Actor{public?WriteActor()?:?base(nameof(WriteActor)){}///?<summary>///?處理信息///?</summary>///?<returns></returns>public?override?Task?ProcessAsync(object?msg){try{Console.WriteLine($"輸出?{this.Name}?:{msg}");}catch?(Exception?e){Console.WriteLine($"業務處理異常:{e.Message}");}return?Task.CompletedTask;}}
測試代碼
static?void?Main(string[]?args)
{Console.Title?=?"Actor?Demo?by?藍創精英團隊";//實現一個加法邏輯//a累加到100,就發送消息到 b里,讓b 輸出。var?write?=?new?WriteActor();var?User?=?new?AccumulationActor(write);for?(int?i?=?0;?i?<?20;?i++){User.AddMsg(i?*?30);}Thread.Sleep(2000);write.Stop();User.Stop();//釋放資源Console.WriteLine("示例完畢!");Console.ReadLine();
}
運行結果

總結
上節實現了狀態機,這節實現了Actor模型,接下來對Orleans 和 Dapr 的核心原理就了解深入一些了,那么,運用這些技術就不會顯的很生澀。
代碼地址
https://github.com/kesshei/ActorDemo.git
https://gitee.com/kesshei/ActorDemo.git
閱
一鍵三連呦!,感謝大佬的支持,您的支持就是我的動力!