Easy-DotNET Easy-DotNET
🏠首页
  • 知识地图
  • 源码脑图

    • 总览
    • Program
    • WebApplication
    • Host主机
    • WebHost主机
    • 依赖注入
    • Autofac
    • Middleware中间件
    • RateLimiter限制速率
    • 响应缓存、请求解压缩
  • 设计初衷
  • 克隆
  • 类型转换
  • 日期时间
  • IO流
  • 工具类
  • 语言特性
  • 集合类
  • Codec编码
  • 文本操作
  • 数学
  • 图片
  • 网络
  • Emoji表情
  • C# 12
  • C# 11
  • C# 10
  • C# 9.0
  • C# 8.0
  • C# 早期版本
  • C# 教程
  • ORM
  • 定时任务
  • 日志
  • 认证与授权
  • Swagger
  • 对象映射
  • 熔断重试限流
  • 缓存
  • 注册发现
  • 网关
  • GraphQL
  • 更多
  • Docker

    • 简介
    • Adminer
    • Apisix
    • Apollo
    • Cassandra
    • Cerebro
    • ClickHouse
    • Consul
    • EasyMock
    • Elasticsearch
    • Emqx
    • FastDFS
    • Flink
    • Gitlab
    • Jenkins
    • Jrebel
    • MariaDB
    • MySQL
    • Percona
    • Phpmyadmin
    • PostgreSQL
    • Redis
  • Linux

    • 查看Linux系统信息
    • CentOS7调整磁盘分区
    • IO压测
    • 图形化监控工具Cockpit
  • 总览
  • 列表

    • 算法数据结构
    • API
    • 应用框架
    • 应用模板
    • 操作系统
    • 工作流
    • 入门套件
    • 示例
    • 人工智能
    • 程序集
    • Assets
    • 认证授权
    • Blazor
    • 区块链
    • 书籍
    • 自动构建
    • 报表
    • 缓存
    • 日历
    • 聊天
    • CLI
    • CLR
    • CMS
    • 代码分析和指标
    • 代码片段
    • 压缩
    • 持续集成
    • 密码学
    • 数据库
    • 数据库驱动
    • 日期时间
    • 反编译
    • 部署
    • DirectX
    • 分布式计算
    • DLR
    • 文档
    • 电商支付
    • 模拟器
    • 环境管理
    • ETL
    • 事件消息
    • Exception
    • 扩展
    • 函数式编程
    • 游戏引擎
    • GIS
    • Git工具
    • 绘图
    • GraphQL
    • GUI
    • HTML-CSS
    • HTTP
    • IDE
    • 图片处理
    • 安装工具
    • 交互式编程
    • 国际化
    • 互操作性
    • IoC
    • JS引擎
    • 日志
    • 机器学习和数据科学
    • Markdown
    • 邮件
    • 数学
    • 媒体
    • 指标
    • 微型框架
    • 最小化器
    • MVVM
    • 网络
    • 对象映射
    • Office
    • OpenAI
    • ORM
    • 包管理器
    • PDF
    • 性能分析工具
    • 协议
    • 推送通知
    • SQL构建器
    • 消息队列
    • RPC
    • 响应式编程
    • 实时通信
    • 正则表达式
    • 任务调度
    • SDK和API
    • 搜索引擎
    • 序列化
    • SMS
    • 状态机
    • 静态站点生成
    • 强命名
    • 风格指南
    • 模板引擎
    • 测试
    • 工具
    • 交易
    • UI自动测试
    • Visual Studio 插件
    • Web浏览器
    • Web框架
    • WebServers
    • WebSocket
    • Windows服务
    • WPF
    • 解析器
    • 源码生成
    • 其他
    • 资源
  • AspNetCore面试题
  • Elasticsearch面试题
  • MongoDB面试题
  • MySql面试题
  • Nginx面试题
  • RabbitMQ面试题
  • Redis面试题
  • 设计模式
  • 微服务
🧑‍💻.NET Blog
GitHub (opens new window)
🏠首页
  • 知识地图
  • 源码脑图

    • 总览
    • Program
    • WebApplication
    • Host主机
    • WebHost主机
    • 依赖注入
    • Autofac
    • Middleware中间件
    • RateLimiter限制速率
    • 响应缓存、请求解压缩
  • 设计初衷
  • 克隆
  • 类型转换
  • 日期时间
  • IO流
  • 工具类
  • 语言特性
  • 集合类
  • Codec编码
  • 文本操作
  • 数学
  • 图片
  • 网络
  • Emoji表情
  • C# 12
  • C# 11
  • C# 10
  • C# 9.0
  • C# 8.0
  • C# 早期版本
  • C# 教程
  • ORM
  • 定时任务
  • 日志
  • 认证与授权
  • Swagger
  • 对象映射
  • 熔断重试限流
  • 缓存
  • 注册发现
  • 网关
  • GraphQL
  • 更多
  • Docker

    • 简介
    • Adminer
    • Apisix
    • Apollo
    • Cassandra
    • Cerebro
    • ClickHouse
    • Consul
    • EasyMock
    • Elasticsearch
    • Emqx
    • FastDFS
    • Flink
    • Gitlab
    • Jenkins
    • Jrebel
    • MariaDB
    • MySQL
    • Percona
    • Phpmyadmin
    • PostgreSQL
    • Redis
  • Linux

    • 查看Linux系统信息
    • CentOS7调整磁盘分区
    • IO压测
    • 图形化监控工具Cockpit
  • 总览
  • 列表

    • 算法数据结构
    • API
    • 应用框架
    • 应用模板
    • 操作系统
    • 工作流
    • 入门套件
    • 示例
    • 人工智能
    • 程序集
    • Assets
    • 认证授权
    • Blazor
    • 区块链
    • 书籍
    • 自动构建
    • 报表
    • 缓存
    • 日历
    • 聊天
    • CLI
    • CLR
    • CMS
    • 代码分析和指标
    • 代码片段
    • 压缩
    • 持续集成
    • 密码学
    • 数据库
    • 数据库驱动
    • 日期时间
    • 反编译
    • 部署
    • DirectX
    • 分布式计算
    • DLR
    • 文档
    • 电商支付
    • 模拟器
    • 环境管理
    • ETL
    • 事件消息
    • Exception
    • 扩展
    • 函数式编程
    • 游戏引擎
    • GIS
    • Git工具
    • 绘图
    • GraphQL
    • GUI
    • HTML-CSS
    • HTTP
    • IDE
    • 图片处理
    • 安装工具
    • 交互式编程
    • 国际化
    • 互操作性
    • IoC
    • JS引擎
    • 日志
    • 机器学习和数据科学
    • Markdown
    • 邮件
    • 数学
    • 媒体
    • 指标
    • 微型框架
    • 最小化器
    • MVVM
    • 网络
    • 对象映射
    • Office
    • OpenAI
    • ORM
    • 包管理器
    • PDF
    • 性能分析工具
    • 协议
    • 推送通知
    • SQL构建器
    • 消息队列
    • RPC
    • 响应式编程
    • 实时通信
    • 正则表达式
    • 任务调度
    • SDK和API
    • 搜索引擎
    • 序列化
    • SMS
    • 状态机
    • 静态站点生成
    • 强命名
    • 风格指南
    • 模板引擎
    • 测试
    • 工具
    • 交易
    • UI自动测试
    • Visual Studio 插件
    • Web浏览器
    • Web框架
    • WebServers
    • WebSocket
    • Windows服务
    • WPF
    • 解析器
    • 源码生成
    • 其他
    • 资源
  • AspNetCore面试题
  • Elasticsearch面试题
  • MongoDB面试题
  • MySql面试题
  • Nginx面试题
  • RabbitMQ面试题
  • Redis面试题
  • 设计模式
  • 微服务
🧑‍💻.NET Blog
GitHub (opens new window)
npm
  • 简介
  • ORM

    • EFCore
    • Dapper
    • FreeSql
    • SqlSugar
  • 任务调度

    • Hangfire
    • Quartz
    • FluentScheduler
    • Coravel
    • Quartzmin
  • 日志

    • Serilog
    • NLog
    • Log4Net
    • Stackdriver
    • ExceptionLess
  • 身份认证与授权

    • IdentityServer4
    • Identity
    • JWTBearer
    • Auth0
    • OpenIddict
  • Swagger文档

    • Swagger
    • Swashbuckle
    • NSwag
    • ReDoc
  • 对象映射

    • AutoMapper
    • EmitMapper
    • AgileMapper
    • Mapster
  • 消息传递

    • MediatR
    • MassTransit
    • Rebus
    • NServiceBus
  • 熔断重试限流

    • Polly
    • Resilience4j
    • AkkaNET
      • 安装 Akka.NET
      • 创建 ActorSystem
      • 创建 Actor
      • 发送消息给 Actor
      • 处理 Actor 状态
      • Actor 生命周期
      • Actor 之间的通信
      • Actor 路由
      • Actor 分组
      • Actor 设备
      • Actor 分片
  • 缓存

    • CsRedis
    • FreeRedis
    • EasyCaching
    • StackExchangeRedis
    • CacheCow
    • NCache
    • Memory
  • 注册发现

    • Consul
    • Nacos
    • Apollo
  • 网关

    • Ocelot
    • Kong
    • Traefik
    • Zuul
  • GraphQL

    • GraphQLPlatform
    • GraphQLdotnet
  • 更多

    • NodaTime
    • FluentAssertions
    • Humanizer
    • 爬虫-AngleSharp
    • 邮件-MailKit
  • NET微服务
  • 熔断重试限流
一个大西瓜
2023-04-24
目录

AkkaNET

开源地址

Github:https://github.com/akkadotnet/akka.net (opens new window)

Akka.NET 是一个高可伸缩性、高可用性的分布式计算框架,是基于 .NET 平台的 Akka 框架的移植版本,可以帮助开发者更容易地构建并行、分布式系统。在本文中,我们将介绍如何使用 Akka.NET 进行开发,并提供一些示例代码。

# 安装 Akka.NET

在 Visual Studio 中打开 NuGet 包管理器控制台,运行以下命令进行安装:


Install-Package Akka

# 创建 ActorSystem

在 Akka.NET 中,所有的通信都是通过 Actor 进行的。因此,在开始使用 Akka.NET 之前,我们需要创建一个 ActorSystem。


using Akka.Actor;

var system = ActorSystem.Create("MyActorSystem");

这里我们创建了一个名为 "MyActorSystem" 的 ActorSystem。现在我们可以使用该系统创建我们的第一个 Actor。

# 创建 Actor

Actor 是 Akka.NET 中的基本单元。Actor 封装了状态和行为,并通过消息进行通信。

我们可以通过继承 ReceiveActor 类或实现 IReceiveActor 接口来创建 Actor。在 Actor 中,我们需要实现 Receive 方法来接收消息。下面是一个简单的例子:


using Akka.Actor;

public class GreetingActor : ReceiveActor
{
    public GreetingActor()
    {
        Receive<Greet>(greet =>
        {
            Console.WriteLine($"Hello, {greet.Name}!");
        });
    }
}

public class Greet
{
    public string Name { get; }

    public Greet(string name)
    {
        Name = name;
    }
}

在上面的例子中,我们定义了一个 GreetingActor 类,它可以接收一个 Greet 消息,并在控制台上打印出问候语。接下来我们将通过 ActorSystem 创建并使用这个 Actor。

# 发送消息给 Actor

现在我们已经创建了一个 Actor,我们可以向它发送消息。使用 ActorSelection 或者 IActorRef 类型对象都可以用来发送消息,它们可以通过 ActorSystem 来获取。


var greetingActor = system.ActorOf<GreetingActor>("greetingActor");
greetingActor.Tell(new Greet("John"));

上面的代码中,我们使用 ActorOf 方法创建了一个名为 "greetingActor" 的 GreetingActor 类型的 Actor,并向它发送了一个 Greet 消息。

# 处理 Actor 状态

除了接收消息,Actor 还可以维护自己的状态。状态可以是任何类型的对象,例如一个简单的整数或一个自定义的类。


public class CounterActor : ReceiveActor
{
    private int _count = 0;

    public CounterActor()
    {
        Receive<Increment>(_ =>
        {
            _count++;
        });

        Receive<Decrement>(_ =>
        {
            _count--;
        });

        Receive<GetCount>(_ =>
        {
            Sender.Tell(new Count(_count));
        });
    }
}

public class Increment { }
public class Decrement { }
public class GetCount { }
public class Count
{
    public int Value { get; }

    public Count(int value)
    {
        Value = value;
    }
}

在上面的例子中,我们定义了一个 CounterActor 类,它可以处理三种消息:Increment、Decrement 和 GetCount。它还维护一个 _count 整数状态,并通过 GetCount 消息返回它的当前值。

# Actor 生命周期

Actor 可以根据需要在运行时创建和销毁。当 ActorSystem 关闭时,它会自动关闭所有 Actor。

在 Akka.NET 中,Actor 生命周期由以下几个状态组成:

  • Created - Actor 已创建,但还未启动。
  • Starting - Actor 正在启动。
  • Started - Actor 已启动,可以接收消息。
  • Stopping - Actor 正在关闭。
  • Stopped - Actor 已经关闭,不能接收消息。

我们可以重写 PreStart 和 PostStop 方法来在 Actor 生命周期的不同阶段执行操作。例如,在 PreStart 方法中可以进行一些初始化操作,而在 PostStop 方法中可以进行清理操作。

public class LifecycleActor : ReceiveActor
{
    public LifecycleActor()
    {
        Receive<string>(message =>
        {
            Console.WriteLine($"Received: {message}");
        });
    }

    protected override void PreStart()
    {
        Console.WriteLine("LifecycleActor is starting.");
    }

    protected override void PostStop()
    {
        Console.WriteLine("LifecycleActor has stopped.");
    }
}

在上面的例子中,我们定义了一个 LifecycleActor 类,它在收到消息时打印出消息,并在 PreStart 和 PostStop 方法中分别打印出启动和停止的信息。

# Actor 之间的通信

在分布式系统中,Actor 可以在不同的节点之间通信。在 Akka.NET 中,我们可以使用 ActorSelection 类型对象来访问远程 Actor。


var selection = system.ActorSelection("akka.tcp://MyActorSystem@remotehost:8081/user/greetingActor");
selection.Tell(new Greet("Jane"));

在上面的代码中,我们使用 ActorSelection 类型对象 selection 来发送 Greet 消息给名为 "greetingActor" 的远程 Actor,该 Actor 所在的节点为 "remotehost",端口为 8081。

# Actor 路由

在 Akka.NET 中,可以使用路由器将消息路由到多个 Actor。路由器可以是静态的,也可以是动态的。静态路由器是在启动时创建的,而动态路由器是在运行时动态添加和删除 Actor。

下面是一个静态路由器的例子:


var router = system.ActorOf(Props.Create<GreetingActor>().WithRouter(new RoundRobinPool(5)));
for (int i = 0 i < 10; i++)
{
    router.Tell(new Greet($"John{i}"));
}

在上面的例子中,我们使用 RoundRobinPool 创建了一个大小为 5 的路由器,并使用 ActorOf 方法创建了一个 GreetingActor 的路由器。接下来,我们向路由器发送 10 条 Greet 消息。

# Actor 分组

在 Akka.NET 中,Actor 可以被分组。分组可以使 Actor 更容易管理,可以通过分组进行批量操作。

下面是一个分组的例子:

var actorA = system.ActorOf<GreetingActor>("actorA");
var actorB = system.ActorOf<GreetingActor>("actorB");
var actorC = system.ActorOf<GreetingActor>("actorC");

var group = system.ActorOf(Props.Empty.WithRouter(new BroadcastGroup(actorA.Path, actorB.Path)));
group.Tell(new Greet("Broadcast"));

在上面的例子中,我们首先创建了三个名为 "actorA"、"actorB" 和 "actorC" 的 Actor。接下来,我们使用 BroadcastGroup 创建了一个广播组,并将 "actorA" 和 "actorB" 添加到该组中。然后,我们向该组发送一条 Greet 消息。

# Actor 设备

在 Akka.NET 中,可以使用 Actor 设备(Device)来封装与硬件设备的通信。设备可以通过 ActorSystem 访问,并可以与其他 Actor 进行通信。

下面是一个设备的例子:


public class Device : ReceiveActor
{
    public Device()
    {
        Receive<TemperatureQuery>(_ =>
        {
            Sender.Tell(new TemperatureResponse(25.0));
        });
    }
}

public class TemperatureQuery { }
public class TemperatureResponse
{
    public double Value { get; }

    public TemperatureResponse(double value)
    {
        Value = value;
    }
}

在上面的例子中,我们定义了一个 Device 类,它可以接收 TemperatureQuery 消息,并返回一个 TemperatureResponse 对象。

# Actor 分片

在 Akka.NET 中,可以使用 Actor 分片(Sharding)来管理大量的 Actor。分片可以根据一些标准(例如 Actor 类型或 ID)对 Actor 进行分组,并将它们分散到多个节点中。

下面是一个 Actor 分片的例子:


public class CounterActor : ReceiveActor
{
    private int _count = 0;

    public CounterActor()
    {
        Receive<Increment>(_ =>
        {
            _count++;
        });

        Receive<Decrement>(_ =>
        {
            _count--;
        });

        Receive<GetCount>(_ =>
        {
            Sender.Tell(new Count(_count));
        });
    }
}

public class CounterMessageExtractor : IMessageExtractor
{
    public string EntityId(object message)
    {
        return ((CounterMessage)message).CounterId.ToString();
    }

    public object EntityMessage(object message)
    {
        return message;
    }

    public string ShardId(object message)
    {
        var counterId = ((CounterMessage)message).CounterId;
        return (counterId % 10).ToString();
    }
}

public class CounterMessage
{
    public int CounterId { get; }

    public CounterMessage(int counterId)
    {
        CounterId = counterId;
    }
}

var shardRegion = ClusterSharding.Get(system).Start(
typeName: typeof(CounterActor).Name,
entityProps: Props.Create<CounterActor>(),
settings: ClusterShardingSettings.Create(system),
messageExtractor: new CounterMessageExtractor());

shardRegion.Tell(new CounterMessage(1));

```perl

在上面的例子中,我们首先定义了一个 `CounterActor` 类,它可以处理 `Increment`、`Decrement` 和 `GetCount` 消息,并维护一个整数状态。接下来,我们实现了一个 `IMessageExtractor` 接口来将 `CounterMessage` 消息分组到多个节点中。最后,我们使用 `ClusterSharding` 的 `Start` 方法创建了一个名为 "CounterActor" 的 Actor 分片,并向它发送了一个 `CounterMessage` 消息。

## 总结

本文介绍了 Akka.NET 的基本概念和用法,包括如何创建 Actor、发送消息、处理 Actor 状态、管理 Actor 生命周期、Actor 之间的通信、路由和分组、设备和分片。希望这篇文章对你了解和使用 Akka.NET 有所帮助。
上次更新: 2023/04/26, 22:10:06
Resilience4j
CsRedis

← Resilience4j CsRedis→

Theme by Vdoing | Copyright © 2019-2024 一个大西瓜 | MIT License | 苏ICP备2023013501号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式