在微服務中,數據最終一致性的一個解決方案是通過有狀態的Actor模型來達到,那什麼是Actor模型呢? Actor是並行的計算模型,包含狀態,行為,並且包含一個郵箱,來非同步處理消息。 關於Actor的介紹可參考: https://www.jianshu.com/p/449850aa8e82 http... ...
在微服務中,數據最終一致性的一個解決方案是通過有狀態的Actor模型來達到,那什麼是Actor模型呢?
Actor是並行的計算模型,包含狀態,行為,並且包含一個郵箱,來非同步處理消息。
關於Actor的介紹可參考:
https://www.jianshu.com/p/449850aa8e82
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特點是:非同步,分散式,高併發,高容錯性,跨語言調用
《通過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會有什麼發現……