在微服务中,数据最终一致性的一个解决方案是通过有状态的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 }
可能你觉得就是一个控制台输出个Hello World,转了这么多弯;不要小看它,这可是一个支持分布式的Hello World,来看看后面经历了或可能经历了什么?
注意上图中的Event,我们在后面了解中会遇到他们。可运行上面的代码,并调试,会发现ReceiveAsync会在pid.Tell后被调用两次,第一次Context.Message就是Started对象,第二次才是Hello对象。
不防在Main中调用一下pid.Stop(),跟踪一下ReceiveAsync会有什么发现……