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

匿名 (未验证) 提交于 2019-12-02 22:06:11

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

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

关于Actor的介绍可参考:

https://www.jianshu.com/p/449850aa8e82

https://www.jianshu.com/p/db04cab86ab9

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

https://studygolang.com/p/protoactor

为了便于开码友们理解,这个系列就以代码为主来学习,通过代码来“意会”Proto.Actor,所以这个系列叫《通过C#学Proto.Actor模型》

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  12             //Actor产生一个props(道具) 13             var props = Actor.FromProducer(() => new HelloActor()); 14             //从props衍生pid,pid代理一个actor的地址 15             var pid = Actor.Spawn(props); 16             //把Hello对象交给HelloActor处理 17             pid.Tell(new Hello 18             { 19                 Who = "Alex" 20             }); 21             Console.ReadLine(); 22             23             pid.Stop(); 24  25             Console.ReadLine(); 26         } 27     } 28     //传递对象 29     class Hello 30     { 31         public string Who; 32     } 33     //actor 34     class HelloActor : IActor 35     { 36         //被调用 37         public Task ReceiveAsync(IContext context) 38         { 39             var msg = context.Message; 40             if(msg is Started started) 41             {                 42                 Console.WriteLine("Started"); 43             } 44             if (msg is Hello hello) 45             { 46                 Console.WriteLine($"Hello {hello.Who}"); 47             } 48             return Actor.Done; 49         } 50     } 51 }
View Code

可能你觉得就是一个控制台输出个Hello World,转了这么多弯;不要小看它,这可是一个支持分布式的Hello World,来看看后面经历了或可能经历了什么?

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!