前言
在我先前关于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:创建项目
-
新建控制台项目:
dotnet new console -n ProtoActorDemo -
添加 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”),实现有状态、位置透明的分布式工作流。
668

被折叠的 条评论
为什么被折叠?



