标签: akka.net

Akka.Net VS MS奥尔良比较

我已经开始用CQRS/ES实现几个LOB应用程序并进行评估:

  1. 几个EMS:NServiceBus,MassTransit,RhinoMessageBus
  2. Akka.net + DDDD
  3. MS Orleans + DDDD

有很多不同EMS的比较,但没有对Actor框架的评估.

那么,请你比较Akka和奥尔良,即:

  • 特色礼物
  • 语法简洁(Akka是scala的逐行移植,因此它的架构可能不是最适合.net的)
  • 为工业发展做好准备(即任何非过度的错误,缺乏重要的功能等)
  • 发展速度与他们
  • 学习曲线(需要登录5-10个其他.net开发人员)
  • 有人试图让它在Mono或.Net Core上运行吗?(将通过Docker的Image部署到Linux)
  • 请分享您的想法,建议和直觉

c# cqrs dddd orleans akka.net

43
推荐指数
0
解决办法
1万
查看次数

如何处理演员内的异常?

是否有一个标准模式来处理Akka.NET中的参与者中的异常?

我看到了一些模式来创建主管,但似乎这SupervisorStrategy是一种处理演员无法解决的事情的方法.

我有一个接收大量数据的actor,需要将它存储在外部服务器中.外部数据库可能无法访问.如果是,则服务器可能正在重新启动或网络可能已关闭.我不需要重新启动演员或任何东西,我只想通知发件人一些有关正在发生的事情的信息,因此他可以将消息保留在磁盘上并重新安排以供日后使用.

发件人不是连接到数据库的此actor的父级.我应该创建一个主管来处理这个问题吗?或者我应该将我的接收处理程序封装在try/catch块中,只是用于Tell通过自定义响应通知发件人a,就好像它是正常的消息一样?

我知道有一Failure堂课,但我不确定我是否打算在这种情况下使用它.

c# akka.net

21
推荐指数
1
解决办法
4808
查看次数

Akka.NET集群节点正常关闭

背景

我有一个包含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核心项目,我观察到同样的事情.

我可以添加什么让其他节点收到有关节点离开的消息?

c# akka.net akka.net-cluster

16
推荐指数
2
解决办法
1730
查看次数

ASP.NET中的Akka.NET actor系统

我在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工作.

asp.net spray akka.net hangfire

13
推荐指数
2
解决办法
5770
查看次数

Akka.net VS Azure Service Fabric

我正在了解Akka.net,并从Azure获悉了服务结构.据我所知,它们都用于构建微服务.

除了缩放模型的不同之外,Akka.net和Azure Service结构之间还有什么区别.

我看到以下博客中提到的结论提示使用Akka.net和Azure的持久存储.

实时实施开发人员是否可以分享他们在这些技术方面的经验.

我找到了许多可以解决的用例,但一个简单的用例是用户导入过程,通常包含以下步骤:

  1. 创建用户,
  2. 向用户添加角色
  3. 发送欢迎电子邮件给新用户
  4. 为要添加用户的公司管理基于用户的计量.

我看到上述所有步骤都有资格自己包含一个actor来执行活动.请评论我理解的方法.

.net c# akka.net

13
推荐指数
0
解决办法
3602
查看次数

Akka.net vs奥尔良的表现

嗨,我正处于为即将开始的项目选择一个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但没有解决性能问题.

谢谢!

c# azure orleans akka.net

11
推荐指数
2
解决办法
7524
查看次数

Akt.net演员的UnitTesting

我正在尝试Akka.net.到目前为止,我刚刚创建了一个简单的HelloWorld风格的应用程序.通常我在开发中使用TDD方法但是在Akka.net中我不知道从哪里开始我的单元测试.

经过一些谷歌搜索后,我意识到原始的Java/Scala Akka框架使用的专用模块akka-testkit似乎在.Net端口中不可用.

是否有人(特别是来自markedup.com的人)找到了为演员进行单元测试的方法?

unit-testing akka.net

10
推荐指数
1
解决办法
2069
查看次数

如何在F#Akka.NET Actor中存储状态?

在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)

f# actor akka.net

10
推荐指数
2
解决办法
1267
查看次数

如何在Akka.NET中使用TestKit

我正在尝试测试我的Akka.NET演员,但是在使用TestKit时遇到了一些问题,并了解它是如何工作的.

由于Akka.NET中没有关于单元测试的官方文档,我已经探索了Akka.NET repo的示例代码,但是那里使用的示例对我不起作用.

我用于参考的测试是ReceiveActorTests.csReceiveActorTests_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)

c# unit-testing akka.net

10
推荐指数
2
解决办法
3350
查看次数

F# - Type参数不能用作类型构造函数

我正在使用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)

f# akka.net

10
推荐指数
1
解决办法
222
查看次数

标签 统计

akka.net ×10

c# ×6

f# ×2

orleans ×2

unit-testing ×2

.net ×1

actor ×1

akka.net-cluster ×1

asp.net ×1

azure ×1

cqrs ×1

dddd ×1

hangfire ×1

spray ×1