携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
概要
随着工作时间的增加,遇到的问题也并非之前简单的几个timer就可以处理业务逻辑。
随着业务逻辑的复杂,软件用户的增加,数据量增长等等。我们终将会在高并发这个点碰面。
C#高并发有几种处理方式,今天我们一起来浅谈一下。
- Actor模型
- 数据流编程
- 异步编程
- 并行编程
- 响应式编程
Actor模型
actor 介绍
一个actor指的是一个运算的基本单元,它可以接收数据,并进行计算。actor有几个重要的特征:
- 一个重要的特征是每个actor相互隔离。
- actor之间不会共享内存。
- 每个actor都维持一个私有的状态,并且这个状态不可能被另外一个actor改变。
actor处理消息是顺序执行的,当一个actor在运行时,接收到的消息会被存储到邮箱中,actor集群通过异步消息沟通。当一个actor接收到一个消息以后,会有以下三种处理方式:
- 创建其他的actor
- 向其他的actor发消息
- 指定下一条消息到来的行为
actor是可以部署分布式系统的,actor的作用是接收数据,并计算。
因此,不关心消息从何而来,这就允许了actor模型适用分布式系统。
c#中的actor模型实现
c#中比较常用的actor模型是AKKa,远程的Akka.remote 另外一个比较流行的框架是Orleans
- akka是一个基于scala语言的cator模型库,实现了一套高并发、分布式、自动容错的消息驱动的工具集
- orleans框架可以构建大规模、高并发、分布式的应用程序,而不需要学学习专业的分布式知识。
PS:这个框架是微软研究院发布的
丐版demo
using Akka.Actor;
using System;
namespace ActorDemo
{
/// <summary>
/// 消息体
/// </summary>
public class MessageClass
{
/// <summary>
/// 消息
/// </summary>
public string msg;
/// <summary>
/// 构造
/// </summary>
/// <param name="setmsg"></param>
public MessageClass(string setmsg)
{
msg = setmsg;
}
}
/// <summary>
/// actor 类
/// </summary>
public class ActorClass : ReceiveActor
{
public ActorClass()
{
Receive<MessageClass>(greet => Console.WriteLine($"Rec Message:[{greet.msg}]"));
}
}
/// <summary>
/// main
/// </summary>
internal class Program
{
static void Main(string[] args)
{
//创建actor系统
var mysystem = ActorSystem.Create("vsystem");
//创建actor
var myactor = mysystem.ActorOf<ActorClass>("firstactor");
//发送消息
myactor.Tell(new MessageClass("yaha"));
Console.ReadLine();
}
}
}
效果: