我已经开始用CQRS/ES实现几个LOB应用程序并进行评估:
有很多不同EMS的比较,但没有对Actor框架的评估.
那么,请你比较Akka和奥尔良,即:
是否有一个标准模式来处理Akka.NET中的参与者中的异常?
我看到了一些模式来创建主管,但似乎这SupervisorStrategy
是一种处理演员无法解决的事情的方法.
我有一个接收大量数据的actor,需要将它存储在外部服务器中.外部数据库可能无法访问.如果是,则服务器可能正在重新启动或网络可能已关闭.我不需要重新启动演员或任何东西,我只想通知发件人一些有关正在发生的事情的信息,因此他可以将消息保留在磁盘上并重新安排以供日后使用.
发件人不是连接到数据库的此actor的父级.我应该创建一个主管来处理这个问题吗?或者我应该将我的接收处理程序封装在try/catch块中,只是用于Tell
通过自定义响应通知发件人a,就好像它是正常的消息一样?
我知道有一Failure
堂课,但我不确定我是否打算在这种情况下使用它.
我有一个包含Lighthouse种子节点的Akka.NET集群和另外两个运行actor系统的节点.当我尝试在我的一个群集节点上正常关闭时,我想看到至少有一个其他节点看到有关该节点离开的消息,并且所有群集节点最终都排除了节点列表的离开节点.
一旦完成了这一点,我希望我能够关闭节点,而其他两个节点不会因为无法连接到关闭的节点而疯狂.
我现在拥有的是一个包含在TopShelf应用程序中的控制台应用程序:
class ActorService : ServiceControl
{
private ActorSystem _actorSystem;
public bool Start(HostControl hostControl)
{
_actorSystem = ActorSystem.Create("myActorSystem");
var cluster = Cluster.Get(_actorSystem);
cluster.RegisterOnMemberRemoved(_Terminate);
return true;
}
public bool Stop(HostControl hostControl)
{
var cluster = Cluster.Get(_actorSystem);
cluster.Leave(cluster.SelfAddress);
return true;
}
private void _Terminate()
{
_actorSystem.Terminate();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要内容:
class Program
{
static int Main(string[] args)
{
return (int) HostFactory.Run(x =>
{
x.UseAssemblyInfoForServiceInfo();
x.RunAsLocalSystem();
x.StartAutomatically();
x.Service<ActorService>();
x.EnableServiceRecovery(r => r.RestartService(1));
});
}
}
Run Code Online (Sandbox Code Playgroud)
当单步执行Stop功能时,我看不到任何有关节点离开其他节点的消息.但是,当函数返回时,其他节点开始喷出异常.
Akka.NET Gitter频道的用户说:
即使没有TopShelf我也必须说,在webhost终止后使用纯ASP.NET核心项目,我观察到同样的事情.
我可以添加什么让其他节点收到有关节点离开的消息?
我在ASP.NET中使用RESTful API创建了一个服务,该服务托管在IIS中.在这个服务中,我想用Akka.NET创建一个actor系统.
在创建actor系统时:
var actorSystem = ActorSystem.Create("myActorSystem");
Run Code Online (Sandbox Code Playgroud)
抛出以下异常:
System.Web.dll中发生类型为"System.InvalidOperationException"的第一次机会异常附加信息:此时无法启动异步操作.异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动.如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async ="true"%>.此异常还可能表示尝试调用"异步void"方法,该方法通常在ASP.NET请求处理中不受支持.相反,异步方法应该返回一个Task,调用者应该等待它.
actor系统本质上是一个并发系统,在actor之间交换异步消息.正如这里所解释的那样,这个actor系统无法在IIS中取消AppDomain,这可能就是为什么抛出上述异常的原因.
本文介绍如何在ASP.NET中运行后台任务.但是,我不知道如何将它用于我的actor系统,因为我无法控制可能由Akka.NET创建的后台任务的生命周期.
有没有办法使这项工作,或者我应该放弃在ASP.NET应用程序中使用actor系统的想法?
编辑:我还在Stackoverflow上看到一个关于使用Akka实现REST服务的问题.关于类似于Spray工具包的解决方案的任何建议,但欢迎为Akka.NET工作.
我正在了解Akka.net,并从Azure获悉了服务结构.据我所知,它们都用于构建微服务.
除了缩放模型的不同之外,Akka.net和Azure Service结构之间还有什么区别.
我看到以下博客中提到的结论提示使用Akka.net和Azure的持久存储.
实时实施开发人员是否可以分享他们在这些技术方面的经验.
我找到了许多可以解决的用例,但一个简单的用例是用户导入过程,通常包含以下步骤:
我看到上述所有步骤都有资格自己包含一个actor来执行活动.请评论我理解的方法.
嗨,我正处于为即将开始的项目选择一个actor框架的早期阶段.据我所知,奥尔良的目的是为了让开发人员尽可能地减轻痛苦,但要牺牲一些表现.在Akka.net中我知道演员大小是400字节如果我是对的,你必须进入低级别来处理集群连接和由奥尔良管理的事情,但会带给你很好的表现.
我在奥尔良互联网上找到的唯一性能指标是:
在Microsoft Azure上使用X-Large VM(8个CPU内核/ 14 GB RAM),每个VM有一个silo:
谷物每秒最多可处理1,000个请求.孤岛每秒最多可处理10,000个请求.筒仓将容纳100,000个活性谷物.
而在主Akka.net 页:
单台机器上5000万msg /秒.内存占用小; 每GB堆大约250万个演员.
我想知道在Akka.net场景中使用了什么机器,以及它们如何执行Grain vs Actor(就每秒请求数而言,你可以或多或少地在GB内存中放置多少粒/角色)和记忆中的谷粒重量是多少.
随着Orleans和Akka.net的引用看起来Akka.net的表现要好得多,但我想在性能方面进一步比较两者.
我发现这个Akka.Net VS MS Orleans Comparison and Orleans和Akka Actors:A Comparison但没有解决性能问题.
谢谢!
我正在尝试Akka.net.到目前为止,我刚刚创建了一个简单的HelloWorld风格的应用程序.通常我在开发中使用TDD方法但是在Akka.net中我不知道从哪里开始我的单元测试.
经过一些谷歌搜索后,我意识到原始的Java/Scala Akka框架使用的专用模块akka-testkit
似乎在.Net端口中不可用.
是否有人(特别是来自markedup.com的人)找到了为演员进行单元测试的方法?
在C#中,ReceiveActor
我可以在类中将状态作为私有字段.我应该如何使用F#API以惯用的方式执行此操作?
这是一个好主意吗?任何替代品?
let handleMessage (mailbox: Actor<'a>) msg =
let mutable i = 1
match msg with
| Some x -> i <- i + x
| None -> ()
Run Code Online (Sandbox Code Playgroud) 我正在尝试测试我的Akka.NET演员,但是在使用TestKit时遇到了一些问题,并了解它是如何工作的.
由于Akka.NET中没有关于单元测试的官方文档,我已经探索了Akka.NET repo的示例代码,但是那里使用的示例对我不起作用.
我用于参考的测试是ReceiveActorTests.cs和ReceiveActorTests_Become.cs,因为那些接近我试图在我的应用程序中测试的场景.
这是一些虚拟代码:
鉴于这个演员
public class Greeter : ReceiveActor
{
public Greeter()
{
NotGreeted();
}
private void NotGreeted()
{
Receive<Greeting>(msg => Handle(msg));
}
private void Greeted()
{
Receive<Farewell>(msg => Handle(msg));
}
private void Handle(Greeting msg)
{
if (msg.Message == "hello")
{
Become(Greeted);
}
}
private void Handle(Farewell msg)
{
if (msg.Message == "bye bye")
{
Become(NotGreeted);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试它是否正确接收问候语和告别消息,并正确进入"成就状态".查看ReceiveActorTests_Become.cs测试,创建一个actor
var system = ActorSystem.Create("test");
var actor = system.ActorOf<BecomeActor>("become");
Run Code Online (Sandbox Code Playgroud)
并且发送和断言消息
actor.Tell(message, TestActor);
ExpectMsg(message); …
Run Code Online (Sandbox Code Playgroud) 我正在使用Akkling在F#工作,所以我可以使用Akka.net上的强类型演员,但是我在F#中遇到了设计限制,我想知道是否有一种优雅的方式.
拿我的根消息类型,我真的不想在那里有IActorRef <_>,因为这种类型将存在于一个公共库中,并且不应该知道它使用的消息系统.此外,为了便于测试,我不想创建整个actor系统(或测试工具包).
type MessageType =
| World of WorldMessage
| Location of IActorRef<LocationMessage> * LocationMessage
| Client of IActorRef<LocationMessage> * ClientMessage
Run Code Online (Sandbox Code Playgroud)
一个可怕的工作是:
type MessageType<'LocationActor, 'PlayerActor, 'ClientActor> =
| World of WorldMessage<'ClientActor>
| Location of 'LocationActor * LocationMessage<'ClientActor>
| Client of 'ClientActor * ClientMessage<'LocationActor>
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想这样但有一个语言限制(错误:类型参数不能用作类型构造函数):
type MessageType<'a> =
| World of WorldMessage<'a>
| Location of 'a<LocationMessage> * LocationMessage
| Client of 'a<LocationMessage> * ClientMessage
Run Code Online (Sandbox Code Playgroud)