有没有适用于C#的Actor模型的好实现?

78

是否有适用于.NET/C#的actors并发模型的良好实现?

我需要优化一个C#例程,我认为Actor模型是解决我的问题的完美方案。不幸的是,我只有使用Scala实现的经验。


http://blogs.msdn.com/b/dotnet/archive/2014/04/02/available-now-preview-of-project-orleans-cloud-services-at-scale.aspx - Daniel Little
13个回答

57

这个开源项目也有一些很好的前景 https://github.com/louthy/language-ext// 记录进程 var logger = spawn<string>("logger", Console.WriteLine);// Ping 进程 ping = spawn<string>("ping", msg => { tell(logger, msg); tell(pong, "ping", TimeSpan.FromMilliseconds(100)); });// Pong 进程 pong = spawn<string>("pong", msg => { tell(logger, msg); tell(ping, "pong", TimeSpan.FromMilliseconds(100)); });// 触发器 tell(pong, "start"); - Dasith Wijes

25

还可以看一下微软的行动者方法(Project Orleans),这是上周发布的。

这是该项目的网站:http://research.microsoft.com/en-us/projects/orleans/

以下是一个好的介绍,来自于2014年的建设大会:

使用Orleans在Azure中构建Halo 4分布式云服务 http://channel9.msdn.com/Events/Build/2014/3-641

请注意,作为下载的位于今天发布的CTP。

Orleans简介:http://felixnotes.com/orleans-microsofts-take-on-the-actor-pattern-in-net/

而且,它也是开源的:https://github.com/dotnet/orleans


1
不幸的是,它将您绑定到Azure... - Den
3
我认为最好使用 Azure(因为它是由 Microsoft 推出的),但不一定必须这样做,但我不确定是否完全正确。 - silverfighter
1
似乎连开发人员自己都不确定 :) https://orleans.codeplex.com/discussions/543928 - Den
https://github.com/dotnet/orleans - m0sa
这三个选项中哪一个最适合? - Gerard

22

你应该看一下MS 并发与协作运行时(CCR)以及分散式软件服务(DSS),它们是机器人工作室的一部分。

这些框架可以让您开发松耦合服务,满足大多数Actor方法的要求。

Axum可能是最合适的选择,但不幸的是它仍处于某种alpha/beta阶段(更新:它在2011年2月被取消了)。我将其用于我的研究,并且必须说整体方向很好,具有巨大潜力。

虽然不是C#而是C++,但Microsoft的异步代理库为您提供了所需的所有功能。

请仔细查看.NET 4的并行相关特性

希望这能帮到你!


6
我在这里找到了这个:http://code.google.com/p/retlang/ - alex25
感谢您的全面回答。 - Borba
TPL Dataflow 包含用于 C# 上的代理/演员的构建块。 - Dzmitry Lahoda
ccrdss链接现在已经失效 - TPL Dataflow(TDF)在这里讨论:http://msdn.microsoft.com/en-us/concurrency/default.aspx和http://msdn.microsoft.com/en-us/devlabs/gg585582(虽然我想第二个链接迟早会过期)。在发表此评论时,TDF仍处于预览阶段。 - paytools-steve
TPL Dataflow链接更新:http://msdn.microsoft.com/zh-cn/library/vstudio/dd492627(v=vs.120).aspx - BozoJoe

18

Stact

Stact是基于.Net的一个Actor库,具备很高的能力和经过充分测试。TopShelf、MassTransit和NServiceBus.Host的基础。

https://github.com/phatboyg/stact

包含以下抽象概念:

  • Workflow,允许定义和执行复杂的状态驱动协议
  • Channels,支持对象之间的消息传递
  • Actors,包括类型化和匿名的Actor
  • Fibers,协作式线程模型
  • Routing
  • Request/Reply
  • Schedulers

即将推出:

  • 正确的监管层次结构

Chris正在编写开发中。

概述:

开发并发应用程序需要一种不同于当前软件开发方法的方法,这种方法强调自治系统组件之间的并发和通信。演员模型定义了一种称为演员的软件组件系统,这些组件通过交换消息(而不是在面向对象设计中调用接口上的方法)相互交互,产生数据流通过组件以满足系统的功能要求。

Stact是一个用于在.NET中使用演员模型构建应用程序的库。主要程序集Stact.dll是演员库,包括使用演员模型构建任何类型的应用程序所需的一切。还有其他支持框架,如Stact.ServerFramework,可用于通过套接字或HTTP公开演员,从而可以使用演员构建服务。


刚刚在Øredev看到了@phatboyg关于stact的演讲。非常有前途。 - svrist
Stact似乎不再积极开发了。 - Ronnie Overby

13

NAct是一个面向.NET的演员框架,采用易于使用的方法。(免责声明:我编写了它)

两个演员之间的消息传递只是两个对象之间的方法调用。您必须确保所有的方法参数都是不可变的,并且它将是线程安全的。

它通过将对象包装在处理线程切换的代理中来工作。所有正常的.NET功能,特别是事件,都会被正确处理,因此您可以编写普通代码,线程协调将自动进行。

甚至还有一个支持C# 5异步/等待的分支。


你是否考虑花些时间来扩展Stact而不是创建一个新的框架?我非常希望看到你的异步思维能够渗透更多的Stact(我不是它的作者,但我真的很喜欢它)。 - Henrik
哦,我真的很高兴看到 Actor 的任何一种实现都得到了认可,但我仍然喜欢使用方法调用来完成它。比较一下这两个(巧合地相同)使用 Stact 和 NAct 的代码示例:https://github.com/phatboyg/Stact/wiki/Samples-Ping-Pong和http://code.google.com/p/n-act/wiki/PingPong - Alex Davies
1
我更喜欢消息传递语义,因为它真实反映了它所做的事情,而且在并发和消息发送时的时钟中,没有办法轻松地显示例如间歇性网络故障或原因,除非那是显性的。如果我现在参与一个框架,我会扩展F# MailboxProcessor,它已经工作得非常好-具有监督员和更简便的跨网络消息传递。 - Henrik
我刚刚创建了EasyActor,其哲学与NAct类似。与Nact的主要区别在于它支持使用Task<T>接收来自演员的结果,并且基于Castle Core DynamicProxy拦截方法调用。原始性能测试还表明,在ping-pong测试中,其性能提高了约40%。 - David Desmaisons

5
我不知道是否有C#的实现,但是微软推出了一种全新的基于Actor模型的编程语言。它被称为Axum(链接:Axum)。Axum是一个特定领域的并发编程语言,基于Actor模型开发,使用类似C语言的语法,并且基于.NET Common Language Runtime,是面向并发应用程序开发的领域特定语言。虽然它含有足够的通用构造,可以不用切换到通用编程语言(如C#)来处理并发组件的顺序部分。

谢谢你的回答。Axum似乎很有趣,但是我觉得在第一眼看来,C#选项更适合我的问题。 - Borba
3
很遗憾,这个项目被微软终止了。 - CharlesB
@CharlesB TPL DataFlow库有点取代了这个,不是吗? - EJoshuaS - Stand with Ukraine
@EJoshuaS 我不知道。 - CharlesB

5

2

您考虑过使用F#提供的T类型的MailboxProcessor吗?


2

1

Remact.Net 是我的当前项目。它使用 WebSockets 和 Json 进行远程 actor 通信。 它提供 C# actor 的类型安全性,同时支持使用 JavaScript 编写的基于浏览器的动态类型的 actor。

我的上一个项目是 AsyncWcfLib。这是一个用于进程中或不同应用程序之间进行通信的 C# 库。远程消息传递使用 WCF。
一个 actor 目录服务使得在多个主机上可以发现 actor。这些主机可能运行 Windows 或 Linux。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接