Actor的目的是为了解决分布式编程中的一系列问题。所有消息都是异步交付的,因此将消息发送方与接收方分开,正是由于这种分离,导致actor系统具有内在的并发性:可以不受限制地并行执行任何拥有输入消息的 actor。用Actor写的程序可以不用管是怎么实现的,只用传递数据就可以,操作简单。当然Actor的NB之处,还在于可以远程连接,像RPC一样。下面的例子用的是Nuget中的【Akka】、远程的【Akka.Remote】

#Actor的特点

> 1. 系统由Actor构成
> 2. Actor完全独立
> 3. 消息传递是非阻塞和异步的
> 4. 所有消息都是并行的

#Actor使用

> 可以通过特定的Actor工具或直接使用编程语言实现Actor模型,目前C#语言中有两类比较流行,Akka.NET框架和Orleans框架。
> 1. Akka是一个基于scala语言的Actor模型库,旨在构建一套高并发、分布式、自动容错、消息驱动应用的工具集。
> 2. Orleans框架可以构建大规模、高并发、分布式应用程序,而不需要学习专业分布式以及并发知识框架。它是由微软研究和设计应用于云计算。

简单Actor例子

public class ActorDemo
{
public static void Test()
{
var system = ActorSystem.Create("test");
var greeter = system.ActorOf<JasonActor>("jason"); for (int i = ; i < ; i++) {
Task.Run(() => //异步发送数据
{
var id = Math.Abs(Guid.NewGuid().GetHashCode());
greeter.Tell(new JasonMessage() { Id = id, Name = $"{DateTime.Now.Ticks} {id} {i} " });
});
}
}
} /// <summary>
/// Actor可接受消息处理
/// </summary>
public class JasonActor : ReceiveActor {
public JasonActor() {
Receive<JasonMessage>(greet => {
Console.WriteLine($"当前时间:{DateTime.Now.Ticks}, Name:{greet.Name}, Id:{greet.Id} ");
});
}
} /// <summary>
/// 用于传递消息的实体类
/// </summary>
public class JasonMessage {
public long Id { get; set; }
public string Name { get; set; }
}

远程Actor

/// <summary>
/// 用于传递消息的实体类(公共类库)
/// </summary>
public class JasonMessage
{
public long Id { get; set; }
public string Name { get; set; }
}
//Actor客户端
namespace AkkaClient
{
class Program
{
static void Main(string[] args)
{
var config = ConfigurationFactory.ParseString(@"
akka {
actor {
provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
}
remote {
helios.tcp {
transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote""
applied-adapters = []
transport-protocol = tcp
port = 0
hostname = localhost
}
}
}
"); using (var system = ActorSystem.Create("MyClient", config))
{
var greeting = system.ActorSelection("akka.tcp://MyServer@localhost:51179/user/Greeting"); while (true)
{
var input = Console.ReadLine();
if (input != "exit")
{
var id = Math.Abs(Guid.NewGuid().GetHashCode());
greeting.Tell(new JasonMessage() { Id = id, Name = $"{DateTime.Now} {input} " });
}
else
{
break;
} }
} Console.WriteLine("Hello World!");
}
}
}
//Actor服务端
namespace ServerAkka
{
class Program
{
static void Main(string[] args)
{
var config = ConfigurationFactory.ParseString(@"
akka {
actor {
provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
}
remote {
helios.tcp {
transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote""
applied-adapters = []
transport-protocol = tcp
port = 51179
hostname = localhost
}
}
}
"); using (var system = ActorSystem.Create("MyServer", config))
{
system.ActorOf<JasonActor>("Greeting"); Console.ReadLine();
} Console.WriteLine("Hello World!");
}
} public class JasonActor : UntypedActor
{
protected override void OnReceive(object greet)
{
var greet1 = (JasonMessage)greet;
Console.WriteLine($"当前时间:{DateTime.Now.Ticks}, Name:{greet1.Name}, Id:{greet1.Id} ");
}
}
}

其他的分布式文章

.net core中的分布式缓存和负载均衡

Actor模型(分布式编程)的更多相关文章

  1. 程序员修神之路--🤠分布式高并发下Actor模型如此优秀🤠

    写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的一件事. 传统多数流行的语言并 ...

  2. 分布式高并发下Actor模型

    分布式高并发下Actor模型 写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的 ...

  3. erlang分布式编程模型

    erlang分布式编程有两种模型 一.分布式erlang 运行在可信的网络环境中 1.rpc提供的远程过程调用 rpc:call(Node,Mode,Fun,Args) ->Result|{ba ...

  4. Orleans框架------基于Actor模型生成分布式Id

    一.Actor简介 actor模型是一种并行计算的数学模型. 响应于收到的消息,演员可以:做出决定,创建更多Actor,发送更多消息,并确定如何响应接收到的下一条消息. 演员可以修改自己的状态,但只能 ...

  5. .NET的Actor模型:Orleans

    Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDD+EventSou ...

  6. Orleans:NET的Actor模型

    .NET的Actor模型:Orleans   Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展 ...

  7. [面试]Actor模型

    Actor模型 面试中自己说话不利落, 或者自己对知识点认识不全面.在这里进行一下记录. 理论部分都是收集(copy)自网上其他的博客. 什么是Actor模型 参与者模式(英语:Actor model ...

  8. 关于actor模型

    actor model是1973年就提出的一个分布式并发编程模型,在erlang语言中得到广泛支持和应用.目前Java中也出现了很多支持actor模型的库:akka.killim.jetlang等等, ...

  9. 在.NET中实现Actor模型的不同方式

    上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...

随机推荐

  1. springcloud-微服务架构基础

    一 前言 学习微服务要从基础的架构学起,首先你要有个微服务的概念才能学习对吧!!如果你都不知道啥是微服务,就一头扎进去学习,你自己也觉得自己也学不会对吧.本篇文章主要让大家快速了解基础的架构分格,以便 ...

  2. Spark Streaming vs. Structured Streaming

    简介 Spark Streaming Spark Streaming是spark最初的流处理框架,使用了微批的形式来进行流处理. 提供了基于RDDs的Dstream API,每个时间间隔内的数据为一个 ...

  3. LINUX网络传输的序列化和反序列化C++

    来到公司实习,开始面向实习生有一个小项目,当然了,服务器就由我一个人来写了,1.0主要完成的使用纯C 写Linux下UDP的服务器框架,大部分还都是以前在学校做过的项目套用的,难度不大,经过跟大bos ...

  4. 原生JS实现动画函数的封装

    封装了一个JS方法,支持元素的基本动画:宽.高.透明度...等,也支持链式动画和同时运动. 获取元素的属性的函数并进行了兼容性处理: function getStyle(obj, attr) { if ...

  5. 内网渗透教程大纲v1.0

    内网渗透 ☉MS14-068(CVE-2014-6324)域控提权利用及原理解析 ☉域控权限提升PTH攻击 未完待续...

  6. Navicat Keygen - 注册机是怎么工作的?

    Navicat Keygen - 注册机是怎么工作的? 1. 关键词解释. Navicat激活公钥 这是一个2048位的RSA公钥,Navicat使用这个公钥来完成相关激活信息的加密和解密. 这个公钥 ...

  7. DDD 实战记录——实现「借鉴学习计划」

    「借鉴学习计划」的核心是:复制一份别人的学习计划到自己的计划中,并同步推送学习任务给自己,并且每个操作都要发送通知给对方. 它们的类图如下: 它们的关系是一对多: // Schedule entity ...

  8. 删除列表中重复元素以及求list中元素个数

    Python 去除列表中重复的元素 来自比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还 ...

  9. HTTP 400 与 SpringMVC的 HttpPutFormContentFilter、FormContentFilter

    前端发送了一个http PUT请求,如下, json_xml: {,},,}},,},,}},},}},,},{,}],,},,}},,,,},,}},},}},,},{,}],,},,}},,},{ ...

  10. SQLServer配置镜像,无法将 ALTER DATABASE 命令发送到远程服务器实例,数据库镜像配置未更改。请确保该服务器已连接,然后重试。

    问题描述: 在做镜像的时候镜像已经连接成功,但是见证服务器却报错 然后tcping了端口啥都是通的,后面发现原来是主机名称一样导致的问题 发现host文件里面: C:\Windows\System32 ...