使用 Proto.Actor 实现 Hello World:在 .NET 中构建你的第一个 Actor 模型系统

前言

我先前关于Actor模型的文章中,我介绍了 Proto.Actor 框架。今天,我将通过一个简单的“Hello World”示例来演示其核心概念。


为什么选择Proto.Actor?

Proto.Actor 的创始人曾是 Akka(从 Java 移植到 .NET)项目的核心开发者。基于该项目中积累的经验,团队决定优先利用现有技术而非重复造轮子。例如,Proto.Actor 使用 gRPC 实现序列化,而非像 Akka.NET 那样维护自定义方案。这种对简洁性和互操作性的专注,使其成为构建Actor系统的理想选择。

此外,Proto.Actor 的**官方文档**非常出色,既深入探讨了Actor模型的理论,也提供了框架的实践指南。


准备工作

  • 安装 .NET 6+ SDK

  • 熟悉 C# 基础语法


步骤1:创建项目

  1. 新建控制台项目:

    dotnet new console -n ProtoActorDemo
  2. 添加 Proto.Actor 包:

    dotnet add package Proto.Actor  

步骤2:定义消息

Actor之间通过不可变消息通信。在C#中,record类型是理想选择:

public record Hello(string Who);

 

为何需要不可变性? 不可变消息能避免副作用并确保线程安全——这是Actor模型的核心原则。


步骤3:实现Actor

Actor异步处理消息。通过实现 IActor 接口创建 GreetingActor

public class GreetingActor : IActor  
{
    public Task ReceiveAsync(IContext context)
    {
        if (context.Message is Hello hello)
        {
            Console.WriteLine($"Hello {hello.Who}!");
        }
        return Task.CompletedTask;
    }
}

 

 


步骤4:启动Actor系统

初始化系统、创建Actor并发送消息:

var system = new ActorSystem();  
var props = Props.FromProducer(() => new GreetingActor());  
var greeter = system.Root.Spawn(props);  

while (true)  
{  
    Console.Write("输入你的名字(输入 q 退出): ");  
    var name = Console.ReadLine()?.Trim();  

    if (string.IsNullOrEmpty(name)) continue;  
    if (name == "q") break;  

    system.Root.Send(greeter, new Hello(name));  
    await Task.Delay(TimeSpan.FromSeconds(1)); // 为Actor系统处理消息留出时间  
}  

 


结论

不到20行代码,我们就构建了一个完整的Actor系统!Proto.Actor 的简洁性和完善文档使其极易上手。

下期预告:我们将探索虚拟Actor(即“Grains”),实现有状态、位置透明的分布式工作流。


参考资源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值