在微服務中,數據最終一致性的一個解決方案是經過有狀態的Actor模型來達到,那什麼是Actor模型呢?html
Actor是並行的計算模型,包含狀態,行爲,而且包含一個郵箱,來異步處理消息。git
關於Actor的介紹可參考:github
https://www.jianshu.com/p/449850aa8e82golang
https://www.jianshu.com/p/db04cab86ab9併發
對於.net下的Actor模型有akka.net, Microsoft Orleans,在這裏咱們介紹的是另一個Actor模型Proto.Actor 【官網http://proto.actor】異步
此次要說一下Proto.Actor,關於Proto.Actor的資料較少,這裏有一篇能夠做簡單入門分佈式
https://studygolang.com/p/protoactor 微服務
爲了便於開碼友們理解,這個系列就以代碼爲主來學習,經過代碼來「意會」Proto.Actor,因此這個系列叫《經過C#學Proto.Actor模型》,而且這些例子都是參考官方案例進行改造的最基礎代碼;從易到難,從單一技術點到組合技術點,再從僞代碼到Demo代碼,一步一步來。就像我同樣,前期可能會一頭霧水,不過不要緊,堅持走下去,在某個轉彎處,確定會柳暗花明,豁然開朗。高併發
Proto.Actor特色是:異步,分佈式,高併發,高容錯性,跨語言調用 學習
系統博客Github地址:https://github.com/axzxs2001/ProtoActorSample
經過C#學Proto.Actor模型系列:
1. 《經過C#學Proto.Actor模型》之 HelloWorld
https://www.cnblogs.com/axzxs2001/p/9538313.html
2. 《經過C#學Proto.Actor模型》之Prpos
https://www.cnblogs.com/axzxs2001/p/9540265.html
3. 《經過C#學Proto.Actor模型》之Spawning
https://www.cnblogs.com/axzxs2001/p/9546030.html
4. 《經過C#學Proto.Actor模型》之PID
https://www.cnblogs.com/axzxs2001/p/9552186.html
5. 《經過C#學Proto.Actor模型》之Mailbox
https://www.cnblogs.com/axzxs2001/p/9558040.html
6. 《經過C#學Proto.Actor模型》之Supervision
https://www.cnblogs.com/axzxs2001/p/9564010.html
7. 《經過C#學Proto.Actor模型》之Behaviors
https://www.cnblogs.com/axzxs2001/p/9569146.html
8. 《經過C#學Proto.Actor模型》之Persistence
https://www.cnblogs.com/axzxs2001/p/9569899.html
9. 《經過C#學Proto.Actor模型》之Remote
https://www.cnblogs.com/axzxs2001/p/9570640.html
請注意代碼註釋,不可忽略哦!
《經過C#學Proto.Actor模型》之 HelloWorld:
代碼:https://github.com/axzxs2001/ProtoActorSample/tree/master/ProtoActorSample/P001_HelloWorld
引用NuGet:Proto.Actor
1 using Proto; 2 using System; 3 using System.Threading.Tasks; 4 5 namespace P001_HelloWorld 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 //Actor產生一個props(道具) 12 var props = Actor.FromProducer(() => new HelloActor()); 13 //從props衍生pid,pid代理一個actor的地址 14 var pid = Actor.Spawn(props); 15 //把Hello對象交給HelloActor處理 16 pid.Tell(new Hello 17 { 18 Who = "Alex" 19 }); 20 Console.ReadLine(); 21 pid.Stop(); 22 Console.ReadLine(); 23 } 24 } 25 //傳遞對象 26 class Hello 27 { 28 public string Who; 29 } 30 //actor 31 class HelloActor : IActor 32 { 33 //被調用 34 public Task ReceiveAsync(IContext context) 35 { 36 switch (context.Message) 37 { 38 case Started started: 39 Console.WriteLine("Started"); 40 break; 41 case Hello hello: 42 Console.WriteLine($"Hello {hello.Who}"); 43 break; 44 } 45 return Actor.Done; 46 } 47 } 48 }
可能你以爲就是一個控制檯輸出個Hello World,轉了這麼多彎;不要小看它,這但是一個支持分佈式的Hello World,來看看後面經歷了或可能經歷了什麼?
注意上圖中的Event,咱們在後面瞭解中會遇到他們。可運行上面的代碼,並調試,會發現ReceiveAsync會在pid.Tell後被調用兩次,第一次Context.Message就是Started對象,第二次纔是Hello對象。
不防在Main中調用一下pid.Stop(),跟蹤一下ReceiveAsync會有什麼發現……