• 《通过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 【官网http://proto.actor】

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

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

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

  • 相关阅读:
    【模板】二分
    电脑桌面美化
    浪在ACM新春大作战
    【递归入门】组合+判断素数:dfs(递归)
    【递归入门】组合的输出:dfs
    01背包问题:DP
    [蓝桥杯][历届试题]回文数字
    洛谷 P1706 全排列问题 :STL / dfs
    【模板】DFS
    洛谷 P1781 宇宙总统:sort(string)
  • 原文地址:https://www.cnblogs.com/axzxs2001/p/9538313.html
Copyright © 2020-2023  润新知