《經過C#學Proto.Actor模型》之 HelloWorld

在微服務中,數據最終一致性的一個解決方案是經過有狀態的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,關於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會有什麼發現……

相關文章
相關標籤/搜索