《通过C#学Proto.Actor模型》之 HelloWorld
在微服务中,数据最终一致性的一个解决方案是通过有状态的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,来看看后面经历了或可能经历了什么?
注意上图中的event,我们在后面了解中会遇到他们。可运行上面的代码,并调试,会发现receiveasync会在pid.tell后被调用两次,第一次context.message就是started对象,第二次才是hello对象。
不防在main中调用一下pid.stop(),跟踪一下receiveasync会有什么发现……
下一篇: 和公司女业务员
推荐阅读