天天看点

《通过C#学Proto.Actor模型》之 HelloWorld

在微服务中,数据最终一致性的一个解决方案是通过有状态的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。

对于.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,来看看后面经历了或可能经历了什么?

《通过C#学Proto.Actor模型》之 HelloWorld

注意上图中的Event,我们在后面了解中会遇到他们。可运行上面的代码,并调试,会发现ReceiveAsync会在pid.Tell后被调用两次,第一次Context.Message就是Started对象,第二次才是Hello对象。

不防在Main中调用一下pid.Stop(),跟踪一下ReceiveAsync会有什么发现……

****欢迎关注我的asp.net core系统课程****

《asp.net core精要讲解》 https://ke.qq.com/course/265696

《asp.net core 3.0》 https://ke.qq.com/course/437517

《asp.net core项目实战》 https://ke.qq.com/course/291868

《基于.net core微服务》 https://ke.qq.com/course/299524