c# 高并发的几种方式(一)

477 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情 

概要

随着工作时间的增加,遇到的问题也并非之前简单的几个timer就可以处理业务逻辑。
随着业务逻辑的复杂,软件用户的增加,数据量增长等等。我们终将会在高并发这个点碰面。
C#高并发有几种处理方式,今天我们一起来浅谈一下。

  • Actor模型
  • 数据流编程
  • 异步编程
  • 并行编程
  • 响应式编程

Actor模型

actor 介绍

一个actor指的是一个运算的基本单元,它可以接收数据,并进行计算。actor有几个重要的特征:

  • 一个重要的特征是每个actor相互隔离。
  • actor之间不会共享内存。
  • 每个actor都维持一个私有的状态,并且这个状态不可能被另外一个actor改变。

actor处理消息是顺序执行的,当一个actor在运行时,接收到的消息会被存储到邮箱中,actor集群通过异步消息沟通。当一个actor接收到一个消息以后,会有以下三种处理方式:

  1. 创建其他的actor
  2. 向其他的actor发消息
  3. 指定下一条消息到来的行为

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();
        }
    }
}

效果:

image.png