欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-25 14:45:10
在微服务中,数据最终一致性的一个解决方案是通过有状态的Actor模型来达到,那什么是Actor模型呢? Actor是并行的计算模型,包含状态,行为,并且包含一个邮箱,来异步处理消息。 关于Actor的介绍可参考: https://www.jianshu.com/p/449850aa8e82 http... ......

在微服务中,数据最终一致性的一个解决方案是通过有状态的actor模型来达到,那什么是actor模型呢?

actor是并行的计算模型,包含状态,行为,并且包含一个邮箱,来异步处理消息。

关于actor的介绍可参考:

对于.net下的actor模型有akka.net, microsoft orleans,在这里我们介绍的是另外一个actor模型proto.actor 【官网http://proto.actor】

这次要说一下proto.actor,关于proto.actor的资料较少,这里有一篇可以作简单入门

 

为了便于开码友们理解,这个系列就以代码为主来学习,通过代码来“意会”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,来看看后面经历了或可能经历了什么?

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

注意上图中的event,我们在后面了解中会遇到他们。可运行上面的代码,并调试,会发现receiveasync会在pid.tell后被调用两次,第一次context.message就是started对象,第二次才是hello对象。

不防在main中调用一下pid.stop(),跟踪一下receiveasync会有什么发现……