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

子Actor发生异常后处理的策略有:

Resume:立即恢复

Restart:恢复之前停止Actor并重新创建它

Stop:停止

Escalate:上报到父级

Supervisor的通过Props.WithChildSupervisorStarategy()来实施的,这个方法第一个参数是接收异常和Actor的PID,以便按一定方式处理异常,第二个参数是重启的次数,第三个参数是两次重启的间隔(按照官方文档,两个连续重启时间大于间隔时间,次数会复位,但实则只按次数走,间隔不起作用)达到最大次数据,子Actor将重新生成。

码友看代码:

 using Proto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace P006_Supervision
{
class Program
{
static void Main(string[] args)
{
//设置监督策略,指向SupervisiorMode方法,重启次数为3,两次之间间隔1s
var props = Actor.FromProducer(() => new ShopingCatActor()).WithChildSupervisorStrategy(new OneForOneStrategy(SupervisorMode.Decide, , TimeSpan.FromSeconds()));
var pid = Actor.Spawn(props);
var user = new User { UserName = "gsw" }; var sn = ;
while (true)
{
Console.WriteLine($"{sn++}--------------------begin-----------------");
foreach (var goods in user.ShopingCat.Goodses)
{
Console.WriteLine(goods);
}
Console.WriteLine("---------------------end------------------");
Console.ReadLine();
pid.Request(user, pid);
}
}
}
/// <summary>
/// Supervisor 模式
/// </summary>
class SupervisorMode
{
/// <summary>
/// 用来处理异常发生的后续操作
/// </summary>
/// <param name="pid">PID</param>
/// <param name="reason">异常原因,Exception类型</param>
/// <returns></returns>
public static SupervisorDirective Decide(PID pid, Exception reason)
{
Console.WriteLine(" 异常发生:" + reason.Message + " " + pid);
switch (reason)
{
//重新开始的异常
case RecoverableException _:
return SupervisorDirective.Restart;
//停止异常
case FatalException _:
return SupervisorDirective.Stop;
//其他都上报
default:
return SupervisorDirective.Escalate;
}
}
}
/// <summary>
/// 购物车actor
/// </summary>
class ShopingCatActor : IActor
{
ShopingCat _shopingCat;
public ShopingCatActor()
{
_shopingCat = new ShopingCat();
Console.WriteLine("*******************actor ShopingCatActor************************");
}
public Task ReceiveAsync(IContext context)
{
PID childPid;
if (context.Children == null || context.Children.Count == )
{
var props = Actor.FromProducer(() => new GoodsActor());
childPid = context.Spawn(props);
}
else
{
childPid = context.Children.First();
}
switch (context.Message)
{
case User user:
childPid.Request(_shopingCat, childPid);
user.ShopingCat = _shopingCat;
break;
}
return Actor.Done;
}
}
/// <summary>
/// 商品actor
/// </summary>
class GoodsActor : IActor
{
public Task ReceiveAsync(IContext context)
{
switch (context.Message)
{
case ShopingCat shopingCat: var goods = new Goods { Name = "红茶", Price = 3.0m, Describe = "统一" };
//用来随机产生异常
var random = new Random();
goods.Quantity = random.Next(, ) - ;
if (goods.Quantity <= )
{
throw new RecoverableException("数量不能小于等于0");
}
else
{
shopingCat.Goodses.Add(goods);
Console.WriteLine($"添加 {goods} 到购物车里");
}
break;
}
return Actor.Done;
}
}
/// <summary>
/// 用户
/// </summary>
class User
{
public ShopingCat ShopingCat { get; set; } = new ShopingCat();
public string UserName { get; set; }
}
/// <summary>
/// 购物车
/// </summary>
class ShopingCat
{
public List<Goods> Goodses
{ get; set; } = new List<Goods>();
}
/// <summary>
/// 商品
/// </summary>
class Goods
{
public string Name { get; set; } public int Quantity { get; set; } public decimal Price { get; set; } public string Describe { get; set; }
public override string ToString()
{
return $"Name={Name},Quantity={Quantity},Price={Price},Describe={Describe}";
}
} }

Demo中有三个实体类,用户类,购物车类,商品类,他们的关系一目了解,聚合关系。有两个Actor,购物车Actor(ShopingCatActor),商品Actor(GoodsActor),商品Actor是购物车Actor子Actor;ShopingCatActor下有监督策略,在

SupervisorMode下的Decide方法中,处理不同的异常,采用不同的Actor策略。GoodsActor中,添加商品时根据数量来决定是否产生异常。

看运行结果:

注意看ID $1/$2,是在发生四次异常后才生成$1/$3的(这个与文档说法有出入,也许是我理解有问题,是重启3次,不是启动3次)

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

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

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

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

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

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

    在第一篇Proto.Actor博文中,HelloWorld的第一行真正代码是:    var props = Actor.FromProducer(() => new HelloActor()) ...

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

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

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

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

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

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

  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. 【憩园】C#并发编程之概述

    写在前面 并发编程一直都存在,只不过过去的很长时间里,比较难以实现,随着互联网的发展,人口红利的释放,更加友好的支持并发编程已经成了主流编程语言的标配,而对于软件开发人员来说,没有玩过并发编程都会有点 ...

  2. IO通信模型(二)同步非阻塞模式NIO(NonBlocking IO)

    同步非阻塞模式(NonBlocking IO) 在非阻塞模式中,发出Socket的accept()和read()操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个信息.也 ...

  3. Python并发编程之谈谈线程中的“锁机制”(三)

    大家好,并发编程 进入第三篇. 今天我们来讲讲,线程里的锁机制. 本文目录 何为Lock( 锁 )?如何使用Lock( 锁 )?为何要使用锁?可重入锁(RLock)防止死锁的加锁机制饱受争议的GIL( ...

  4. ajaxFileUpload onchang上传文件插件第二次失效刷新一次才能再次调用触发change事件

    关于用ajaxfileupload时,遇到一个要刷新一次页面才能再次上传, ajaxFileUpload 用onchang上传只能上传一次 第二次就失效了 我找这个问题找了很长时间 ajaxFileU ...

  5. 多线程(3)ThreadPool

    使用Thread类已经可以创建并启动线程了,但是随着开启的线程越来越多,线程的创建和终止都需要手动操作,非常繁琐,另一个问题是,开启更多新的线程但是没有用的线程没有及时得到终止的时候,会占用越来越多的 ...

  6. 坑:微信小程序wx.request和wx.uploadFile中传参数的区别

    微信小程序中通过组件<form>提交表单的时候,在js中通过e.detail.value得到所提交表单的json格式数据.一般提交表单我们都是通过wx.request请求,提交表单数据,通 ...

  7. 常用H5

    HTML5笔记 了解HTML5 ☞HTML5属于上一代HTML的新迭代语言,设计HTML5最主要的目的是为了在移动设备上支持多媒体!!!   例如: video 标签和 audio 及 canvas ...

  8. arcgis api 3.x for js 入门开发系列十叠加 SHP 图层(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. $符号报not defing 报错

    https://blog.csdn.net/weixin_37969488/article/details/84250833 最近因为工作问题,需要我把别的项目上的一些jsp网页copy到新项目上.放 ...

  10. angular应用容器化部署

    angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...