zoukankan      html  css  js  c++  java
  • 《通过C#学Proto.Actor模型》之Prpos

    在第一篇Proto.Actor博文中,HelloWorld的第一行真正代码是:

       var props = Actor.FromProducer(() => new HelloActor());

    这个返回的变量props就是一个Props的对象,它是负责创Actor实例,以及配置Actor实例,并且产Actor上下文Context(类似asp.net中的Context)。

    Props对象产生通常是用Actor.FromProducer或Actor.FromFunc产生,不过也可能实例化,实体例时可以给Actor做一系列配置,如下代码:

     1 using Proto;
     2 using Proto.Mailbox;
     3 using System;
     4 using System.Threading.Tasks;
     5 
     6 namespace P002_CustomProps
     7 {
     8     class Program
     9     {
    10         static void Main(string[] args)
    11         {
    12             var props = new Props()
    13                 //用道具代理返回一个IActor实例
    14                 .WithProducer(() => new MyActor())
    15                 //默认调度器用线程池,邮箱中最多300个消息吞吐量
    16                 .WithDispatcher(new ThreadPoolDispatcher { Throughput = 300 })
    17                 //默认邮箱使用无界队列
    18                 .WithMailbox(() => UnboundedMailbox.Create())
    19                 //默认策略在10秒的窗口内最多重新启动子Actor 10次
    20                 .WithChildSupervisorStrategy(new OneForOneStrategy((who, reason) =>
    21                 SupervisorDirective.Restart, 10, TimeSpan.FromSeconds(10)))
    22                 //可以将中间件链接起来以拦截传入和传出消息 
    23                 //接收中间件在Actor接收消息之前被调用
    24                 //发送者中间件在消息发送到目标PID之前被调用
    25                 .WithReceiveMiddleware(
    26                 next => async c =>
    27                 {
    28                     Console.WriteLine($"Receive中间件 1 开始,{c.Message.GetType()}:{c.Message}");
    29                     await next(c);
    30                     Console.WriteLine($"Receive中间件 1 结束,{c.Message.GetType()}:{c.Message}");
    31                 },
    32                 next => async c =>
    33                 {
    34                     Console.WriteLine($"Receive中间件 2 开始,{c.Message.GetType()}:{c.Message}");
    35                     await next(c);
    36                     Console.WriteLine($"Receive中间件 2 结束,{c.Message.GetType()}:{c.Message}");
    37                 })
    38                 .WithSenderMiddleware(
    39                 next => async (c, target, envelope) =>
    40                 {
    41                     Console.WriteLine($"Sender中间件 1 开始, {c.Message.GetType()}:{c.Message}");
    42                     await next(c, target, envelope);
    43                     Console.WriteLine($"Sender中间件 1 结束,{c.Message.GetType()}:{c.Message}");
    44                 },
    45                 next => async (c, target, envelope) =>
    46                 {
    47                     Console.WriteLine($"Sender中间件 2 开始,{c.Message.GetType()}:{c.Message}");
    48                     await next(c, target, envelope);
    49                     Console.WriteLine($"Sender中间件 2 结束,{c.Message.GetType()}:{c.Message}");
    50                 })
    51                 // 默认的 spawner 构造  Actor, Context 和 Process
    52                 .WithSpawner(Props.DefaultSpawner);
    53 
    54             //从props衍生pid,pid代理一个actor的地址
    55             var pid = Actor.Spawn(props);       
    56             //把Hello对象交给HelloActor处理
    57             pid.Tell(new MyEntity
    58             {
    59                 Message = "我是MyEntity的Message,请求"
    60             });
    61             Console.ReadLine();    
    62         }
    63     }
    64 
    65     public class MyActor : IActor
    66     {
    67         public Task ReceiveAsync(IContext context)
    68         {
    69             if (context.Message is MyEntity myEntity)
    70             {
    71                 Console.WriteLine(myEntity.Message);
    72                 context.Tell(context.Sender, new MyEntity() { Message = "我是MyEntity的Message,应答" });
    73             }
    74             return Actor.Done;
    75         }
    76     }
    77     public class MyEntity
    78     {
    79         public string Message { get; set; }
    80     }
    81 }

    你会发现,Demo中,总有一个实例类+一个Actor类,这是构成Actor模型的必备,Actor类就是主体,实体类就是Actor类运算的载体,所以它们总是如影随形。

     第15 行到第21 行代码含意以后会解释。 

    这里说Recevie和Sender的中间件,这里很像一个AOP,可以在调用某个行为前后作处理统一的处理,比如日志,权限等统一的规则,也和asp.net core里的中件间如出一辙【如里你是一个asp.net core码友,熟悉的Context,熟悉的next(),还有熟悉的Middleware】。

    现在可以自己运行一下分析一下结果吧:

  • 相关阅读:
    【Python基础编程196 ● 文件/文件夹操作 ● 文件的操作步骤】
    【Python基础编程197 ● 文件/文件夹操作 ● 文件的访问模式】
    【Python基础编程199 ● 文件/文件夹操作 ● Python怎么读/写很大的文件】
    【Python基础编程198 ● 文件/文件夹操作 ● 读取文件的4种方式】
    【等待优化】如何定位网络性能问题 ASYNC_NETWORK_IO 等待
    (4.48)sql server添加列并使用默认值填充已有记录
    【sql server安全】sql server列加密查询性能问题及解决方案
    【sql server安全】sql server使用混合密钥实现列加密
    【sql server安全】sql server使用非对称秘钥实现列加密
    【sql server安全】sql server使用对称秘钥实现列加密
  • 原文地址:https://www.cnblogs.com/axzxs2001/p/9540265.html
Copyright © 2011-2022 走看看