Actor模型(分布式编程)
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} ");
}
}
}
其他的分布式文章
Actor模型(分布式编程)的更多相关文章
- 程序员修神之路--🤠分布式高并发下Actor模型如此优秀🤠
写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的一件事. 传统多数流行的语言并 ...
- 分布式高并发下Actor模型
分布式高并发下Actor模型 写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的 ...
- erlang分布式编程模型
erlang分布式编程有两种模型 一.分布式erlang 运行在可信的网络环境中 1.rpc提供的远程过程调用 rpc:call(Node,Mode,Fun,Args) ->Result|{ba ...
- Orleans框架------基于Actor模型生成分布式Id
一.Actor简介 actor模型是一种并行计算的数学模型. 响应于收到的消息,演员可以:做出决定,创建更多Actor,发送更多消息,并确定如何响应接收到的下一条消息. 演员可以修改自己的状态,但只能 ...
- .NET的Actor模型:Orleans
Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDD+EventSou ...
- Orleans:NET的Actor模型
.NET的Actor模型:Orleans Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展 ...
- [面试]Actor模型
Actor模型 面试中自己说话不利落, 或者自己对知识点认识不全面.在这里进行一下记录. 理论部分都是收集(copy)自网上其他的博客. 什么是Actor模型 参与者模式(英语:Actor model ...
- 关于actor模型
actor model是1973年就提出的一个分布式并发编程模型,在erlang语言中得到广泛支持和应用.目前Java中也出现了很多支持actor模型的库:akka.killim.jetlang等等, ...
- 在.NET中实现Actor模型的不同方式
上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...
随机推荐
- 关于选用ccflow你所担心的问题都在这里为您解答
致ccflow客户 感谢大家ccbpm的认可,我们会一如既往的以踏实的技术来回应大家的支持. 针对大家疑问最多的几个问题,在这里我我为大家一一解答. 代码一直在更新,不稳定问题 版本控制我们做的差,是 ...
- Dynamics 365中的Client API form context (formContext)
适用于Dynamics 365 for Customer Engagement apps 9.x版本. 本文是一篇翻译,原文来源是微软官方文档. 本文链接:https://www.cnblogs.co ...
- IDEA开发、测试、生产环境pom配置及使用
pom文件 一般放在最下面,project里 <!--开发环境.测试环境.生产环境--> <!--生产环境--> <profiles> <profile> ...
- 一致性hash算法--负载均衡
有没有好奇过redis.memcache等是怎么实现集群负载均衡的呢? 其实他们都是通过一致性hash算法实现节点调度的. 讲一致性hash算法前,先简述一下求余hash算法: hash(object ...
- Kafka实战(七) - 优雅地部署 Kafka 集群
既然是集群,必然有多个Kafka节点,只有单节点构成的Kafka伪集群只能用于日常测试,不可能满足线上生产需求. 真正的线上环境需要考量各种因素,结合自身的业务需求而制定.看一些考虑因素(以下顺序,可 ...
- Jmeter常用的两大性能测试场景
一.阶梯式场景 该场景主要应用在负载测试里面,通过设定一定的并发线程数,给定加压规则,遵循“缓起步,快结束”的原则,不断地增加并发用户来找到系统的性能瓶颈,进而有针对性的进行各方面的系统优化. 使用到 ...
- mybatis中 == 和 != 的用法
!= 的用法 <if test="xxx != null and xxx !=''"> == 的用法(相较于!=,仅需将双引号和单引号的位置换一下即可) <if ...
- 阿里蒋晓伟谈计算引擎Flink和Spark的对比
本文整理自云栖社区之前对阿里搜索事业部资深搜索专家蒋晓伟老师的一次采访,蒋晓伟老师,认真而严谨.在加入阿里之前,他曾就职于西雅图的脸书,负责过调度系统,Timeline Infra和Messenger ...
- 基于canvas二次贝塞尔曲线绘制鲜花
canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...
- DataGridView右键菜单自定义显示及隐藏列
WinForm程序中表单的列可自定义显示及隐藏,是一种常见的功能,对于用户体验来说是非常好的.笔者经过一段时间的摸索,终于实现了自己想要的功能及效果,现记录一下过程: 1.新建一个自定义控件,命名为: ...