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

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

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

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

 using Proto;
using Proto.Mailbox;
using System;
using System.Threading.Tasks; namespace P002_CustomProps
{
class Program
{
static void Main(string[] args)
{
var props = new Props()
//用道具代理返回一个IActor实例
.WithProducer(() => new MyActor())
//默认调度器用线程池,邮箱中最多300个消息吞吐量
.WithDispatcher(new ThreadPoolDispatcher { Throughput = })
//默认邮箱使用无界队列
.WithMailbox(() => UnboundedMailbox.Create())
//默认策略在10秒的窗口内最多重新启动子Actor 10次
.WithChildSupervisorStrategy(new OneForOneStrategy((who, reason) =>
SupervisorDirective.Restart, , TimeSpan.FromSeconds()))
//可以将中间件链接起来以拦截传入和传出消息
//接收中间件在Actor接收消息之前被调用
//发送者中间件在消息发送到目标PID之前被调用
.WithReceiveMiddleware(
next => async c =>
{
Console.WriteLine($"Receive中间件 1 开始,{c.Message.GetType()}:{c.Message}");
await next(c);
Console.WriteLine($"Receive中间件 1 结束,{c.Message.GetType()}:{c.Message}");
},
next => async c =>
{
Console.WriteLine($"Receive中间件 2 开始,{c.Message.GetType()}:{c.Message}");
await next(c);
Console.WriteLine($"Receive中间件 2 结束,{c.Message.GetType()}:{c.Message}");
})
.WithSenderMiddleware(
next => async (c, target, envelope) =>
{
Console.WriteLine($"Sender中间件 1 开始, {c.Message.GetType()}:{c.Message}");
await next(c, target, envelope);
Console.WriteLine($"Sender中间件 1 结束,{c.Message.GetType()}:{c.Message}");
},
next => async (c, target, envelope) =>
{
Console.WriteLine($"Sender中间件 2 开始,{c.Message.GetType()}:{c.Message}");
await next(c, target, envelope);
Console.WriteLine($"Sender中间件 2 结束,{c.Message.GetType()}:{c.Message}");
})
// 默认的 spawner 构造 Actor, Context 和 Process
.WithSpawner(Props.DefaultSpawner); //从props衍生pid,pid代理一个actor的地址
var pid = Actor.Spawn(props);
//把Hello对象交给HelloActor处理
pid.Tell(new MyEntity
{
Message = "我是MyEntity的Message,请求"
});
Console.ReadLine();
}
} public class MyActor : IActor
{
public Task ReceiveAsync(IContext context)
{
if (context.Message is MyEntity myEntity)
{
Console.WriteLine(myEntity.Message);
context.Tell(context.Sender, new MyEntity() { Message = "我是MyEntity的Message,应答" });
}
return Actor.Done;
}
}
public class MyEntity
{
public string Message { get; set; }
}
}

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

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

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

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

《通过C#学Proto.Actor模型》之Prpos的更多相关文章

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

    在微服务中,数据最终一致性的一个解决方案是通过有状态的Actor模型来达到,那什么是Actor模型呢? Actor是并行的计算模型,包含状态,行为,并且包含一个邮箱,来异步处理消息. 关于Actor的 ...

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

    邮箱是Actor模型的一个重要组成部分,负责接收发过来的消息,并保存起来,等待Actor处理.邮箱中维护着两种队列,一种是存系统消息,另一个是存用户消息,系统省是指Started,Stoping,St ...

  3. 通过C#学Proto.Actor模型》之Remote

    Proto.Actor中提供了基于tcp/ip的通迅来实现Remote,可以通过其Remot实现对Actor的调用. 先来看一个极简单片的远程调用. 码友看码: 引用NuGet包 Proto.Acto ...

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

    Actor是有状态的,当每一步执行失败后,返回失败地方继续执行时,希望此时的状态是正确的,为了保证这一点,持久化就成了必要的环节了. Proto.Actor提供了三种方式执久化: Event Sour ...

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

    Behaviors就是Actor接收到消息后可以改变处理的方法,相同的Actor,每次调用,转到不同的Actor内方法执行,非常适合按流程进行的场景.Behaviors就通过在Actor内部实例化一个 ...

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

    Supervision,字面意思是监督,是父Actor发现子Actor有异常发生后,对子Actor产用保种策略处理的机制,如果父Actor不处理,则往上传递. 子Actor发生异常后处理的策略有: R ...

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

    PID对象是代表Actor对象的进程,是能过Actor.Spawn(props)获取的:它有什么成员呢?既然代理Actor,首先有一个ID,标识自己是谁,Actor在Spawn时可以命名这个ID,否则 ...

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

    Props是配置Actor和实例化Actor,那实例化后,就应该访问了,Props.Actor提供了Actor.Spawn(),Actor.SpawnPrefix(),Actor.SpawnNamed ...

  9. Proto.Actor模型

    Proto.Actor模型 http://proto.actor/ https://github.com/axzxs2001/ProtoActorSample https://www.cnblogs. ...

随机推荐

  1. 【Java资源免费分享,网盘自己拿】

    JavaSE: Java马士兵:链接:https://pan.baidu.com/s/1jJRvxGi密码:v3xb Java毕向东:链接:https://pan.baidu.com/s/1ggzHk ...

  2. Springboot 系列(一)Spring Boot 入门篇

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 由于 J2EE 的开发变得笨重,繁多的配置, ...

  3. Mysql中Count函数的正确使用

    备注: 直接使用Count(*)或Count(1)这些大家基本都会,主要是Count函数还可以加满足表达式的统计:express 关于Count函数表达式的用法,目前个人只知道2种: a:使用:Cou ...

  4. redis常见错误处理

    --1]当内存不足引起  redis出错 先尝试下列语句,指定redis使用内存 redis-server.exe redis.windows.conf --maxheap 200mredis-ser ...

  5. C# 判断网卡类型以及其他网卡信息

    NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterfac ...

  6. PHP中使用 fsockopen curl 模拟异步处理

    PHP它最大缺点就是无法实现多线程管理,其程序的执行都是从头到尾,按照逻辑一路执行下来,不可能出现分支,这一点是限制php在主流程序语言中往更高级的语言发展的原因之一. 在PHP中我们有的时候其实希望 ...

  7. 上海启动5G试用!104页PPT,为你深度解析5G终端的创新和机遇

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源:国泰君安证券 作者:分析师王聪.张阳.陈飞达 导读:2019年是5G元年,各大品牌将陆续推出5G ...

  8. 浅谈OA系统与Portal门户的区别

    随着社会信息化的发展与进步,OA办公自动化软件打破了传统复杂的办公方式,使各个行业实现了高效的无纸化办公.由此一来OA快速成长为继财务软件.ERP软件之后的第三大管理软件.随着企业信息化系统的不断增多 ...

  9. ASP.MVC学习资源总结

    自己动手写一个简单的MVC框架(第一版) 自己动手写一个简单的MVC框架(第二版) ASP.Net请求处理机制初步探索之旅 - Part 1 前奏 ASP.Net请求处理机制初步探索之旅 - Part ...

  10. Asp.Net登陆记住用户功能实现

    1.效果和原理 原理是利用Asp.net的Cookies.选中CheckBox,把输入的用户名和密码用Cookies存储起来,设置过期时间7天,超过时间自动清除Cookie信息. 2.前台代码 < ...