《通过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的资料较少,这里有一篇可以作简单入门
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
using Proto;
using System;
using System.Threading.Tasks; namespace P001_HelloWorld
{
class Program
{
static void Main(string[] args)
{
//Actor产生一个props(道具)
var props = Actor.FromProducer(() => new HelloActor());
//从props衍生pid,pid代理一个actor的地址
var pid = Actor.Spawn(props);
//把Hello对象交给HelloActor处理
pid.Tell(new Hello
{
Who = "Alex"
});
Console.ReadLine();
pid.Stop();
Console.ReadLine();
}
}
//传递对象
class Hello
{
public string Who;
}
//actor
class HelloActor : IActor
{
//被调用
public Task ReceiveAsync(IContext context)
{
switch (context.Message)
{
case Started started:
Console.WriteLine("Started");
break;
case Hello hello:
Console.WriteLine($"Hello {hello.Who}");
break;
}
return Actor.Done;
}
}
}
可能你觉得就是一个控制台输出个Hello World,转了这么多弯;不要小看它,这可是一个支持分布式的Hello World,来看看后面经历了或可能经历了什么?

注意上图中的Event,我们在后面了解中会遇到他们。可运行上面的代码,并调试,会发现ReceiveAsync会在pid.Tell后被调用两次,第一次Context.Message就是Started对象,第二次才是Hello对象。
不防在Main中调用一下pid.Stop(),跟踪一下ReceiveAsync会有什么发现……
《通过C#学Proto.Actor模型》之 HelloWorld的更多相关文章
- 《通过C#学Proto.Actor模型》之Prpos
在第一篇Proto.Actor博文中,HelloWorld的第一行真正代码是: var props = Actor.FromProducer(() => new HelloActor()) ...
- 《通过C#学Proto.Actor模型》之Mailbox
邮箱是Actor模型的一个重要组成部分,负责接收发过来的消息,并保存起来,等待Actor处理.邮箱中维护着两种队列,一种是存系统消息,另一个是存用户消息,系统省是指Started,Stoping,St ...
- 通过C#学Proto.Actor模型》之Remote
Proto.Actor中提供了基于tcp/ip的通迅来实现Remote,可以通过其Remot实现对Actor的调用. 先来看一个极简单片的远程调用. 码友看码: 引用NuGet包 Proto.Acto ...
- 《通过C#学Proto.Actor模型》之Persistence
Actor是有状态的,当每一步执行失败后,返回失败地方继续执行时,希望此时的状态是正确的,为了保证这一点,持久化就成了必要的环节了. Proto.Actor提供了三种方式执久化: Event Sour ...
- 《通过C#学Proto.Actor模型》之Behaviors
Behaviors就是Actor接收到消息后可以改变处理的方法,相同的Actor,每次调用,转到不同的Actor内方法执行,非常适合按流程进行的场景.Behaviors就通过在Actor内部实例化一个 ...
- 《通过C#学Proto.Actor模型》之Supervision
Supervision,字面意思是监督,是父Actor发现子Actor有异常发生后,对子Actor产用保种策略处理的机制,如果父Actor不处理,则往上传递. 子Actor发生异常后处理的策略有: R ...
- 《通过C#学Proto.Actor模型》之PID
PID对象是代表Actor对象的进程,是能过Actor.Spawn(props)获取的:它有什么成员呢?既然代理Actor,首先有一个ID,标识自己是谁,Actor在Spawn时可以命名这个ID,否则 ...
- 《通过C#学Proto.Actor模型》之Spawning
Props是配置Actor和实例化Actor,那实例化后,就应该访问了,Props.Actor提供了Actor.Spawn(),Actor.SpawnPrefix(),Actor.SpawnNamed ...
- Proto.Actor模型
Proto.Actor模型 http://proto.actor/ https://github.com/axzxs2001/ProtoActorSample https://www.cnblogs. ...
随机推荐
- SQL优化总结之二
1.列优先 如图有表A和表B,对其查询时,会有如下语句: select a.*,b.* from a,b where a.id = b.a_id; 注意from 后边的表名, a.如果多表查询是完全无 ...
- [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路
Stream的概念定义 官方文档是永远的圣经~ 表格内容来自https://docs.oracle.com/javase/8/docs/api/ Package java.util.s ...
- c# Task 篇幅二
上面一篇https://i.cnblogs.com/EditPosts.aspx?postid=10444773我们介绍了Task的启动,Task的一些方法以及应用,今天我们着重介绍一下Task其它概 ...
- [转]Gitlab-CI持续集成之Runner配置和CI脚本
本文转自:https://www.cnblogs.com/jiukun/p/7481287.html 一.简介 1. 为实现持续集成,需为该项目准备以下两样东西: 1)软件集成脚本.(gitlab-c ...
- WPF 界面如何绑定Command
WPF中,我们使用MVVM,在ViewModel中定义Command和其业务逻辑,界面绑定Command. 那么是不是所有的事件都可以定义Command呢,然后将业务全部放在ViewModel中呢? ...
- python学习笔记(十 三)、网络编程
最近心情有点儿浮躁,难以静下心来 Python提供了强大的网络编程支持,很多库实现了常见的网络协议以及基于这些协议的抽象层,让你能够专注于程序的逻辑,而无需关心通过线路来传输比特的问题. 1 几个网络 ...
- 【大数据】了解Hadoop框架的基础知识
介绍 此Refcard提供了Apache Hadoop,这是最流行的软件框架,可使用简单的高级编程模型实现大型数据集的分布式存储和处理.我们将介绍Hadoop最重要的概念,描述其架构,指导您如何开始使 ...
- css——rgba()和opacity的区别
(学习笔记) 首先他们都能实现透明效果,不同的是作用对象. rgba()是css中设置背景颜色中的一个属性.而opacity是css的一个属性,也就是rgba()的作用对象是元素的背景颜色或元素的颜色 ...
- vue + elementUi + upLoadIamge组件 上传文件到阿里云oss
<template> <div class="upLoadIamge"> <el-upload action="https://jsonpl ...
- SAP MM 可以不用创建盘点凭证直接录入盘点结果?
SAP MM 可以不用创建盘点凭证直接录入盘点结果? 可以.SAP标准功能就支持这么做. 事务代码 MI09 (Enter Count w/o Reference to Document), 输入pl ...