问题标签 [akka.net]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 优化 Akka.NET 消息调度程序
我目前正在尝试在 Akka.NET(java/scala 演员模型框架的端口)的消息调度程序中找到瓶颈对于那些感兴趣的人,可以在这里找到:https ://github.com/akkadotnet/akka.net
我们似乎可以扩展到 8 个内核,到目前为止一切都很好。然而,当在更大的机器上运行时,一切最终都会崩溃。我们已经在 16 核机器上对此进行了测试,它可以很好地扩展到某个点,然后突然间,消息吞吐量减半。
此图像是在我的笔记本电脑上进行分析时 查看:http: //i.stack.imgur.com/DxboR.png完整图像
. 瓶颈是 Task.Factory.StartNew,还是 ConcurrentQueue.Enqueue?我不确定我是否正确阅读了这些数字。
以下是我们的消息调度程序和邮箱如何工作的简要说明:
将消息发布到邮箱后,邮箱会检查它当前是否正在处理消息。如果它正在处理消息,它只是让当前正在运行的 Task 使用新消息。
所以本质上,我们将消息发布到 ConcurrentQueue,当前邮箱运行会找到它。
如果在发布消息时邮箱当前处于空闲状态,那么我们使用Task.Factory.StartNew(mailboxAction)
.
为了确保特定邮箱在任何给定时间只有一个任务在运行,我们使用联锁检查来查看邮箱是忙碌还是空闲。互锁检查有效,经过广泛测试,因此我们知道我们不会为同一个邮箱启动多个任务。
有什么想法会导致 16 核机器上的吞吐量完全中断吗?同样的效果不会发生在较小的机器上,当它们无法再扩展时,它们会在最大吞吐量下保持稳定。
我在 16 核机器上验证过的一件事是,邮箱似乎处理得太快,耗尽了参与者消息队列中的所有消息,一旦有新消息到达,这将导致邮箱的新调度。也就是说,消费者比生产者快。
c# - Akka.net 演员大小
我们看到 Akka.net actor 每个大约 2900 字节。(Akka.net v0.6.1.0)
这是 Akka.net 中每个演员的大致尺寸吗?
程序片段
招待员
迎接
据报告,Akka jvm 的大小约为 400 字节/actor,Erlang 的大小约为 300 字节/进程。
在 Akka.net 中的 CLR 上旋转 100,000 个演员似乎每个大约 2900 字节。
这大致正确吗?
提前致谢!
f# - 在 akka.net actor{} 表达式中等待 F# 异步任务
是否可以在 Akka.Net 参与者计算中等待(不阻塞) Async<'t> ?我想实现类似于以下的东西。
c# - Akka.NET Duplicate Log messages
There is a weird behavior while using Akka.Event.Logging logger. This seems to spit out the same log message twice while using either WARN or ERROR log level but not in INFO and DEBUG. Not sure if this is a bug or I am missing something. Following is an example code and screen shot of the message:
Output console screenshot attached here: http://i.stack.imgur.com/3ReqJ.jpg
unit-testing - Akka.net Actors 的单元测试
我正在尝试 Akka.net。到目前为止,我刚刚创建了一个简单的 HelloWorld 风格的应用程序。通常我在我的开发中使用 TDD 方法,但是对于 Akka.net,我不知道从哪里开始我的单元测试。
经过一番谷歌搜索后,我意识到原始的 Java/Scala Akka 框架使用了一个专用模块akka-testkit
,该模块似乎在 .Net 端口中不可用。
有没有人(尤其是来自markup.com 的人)找到了对演员进行单元测试的方法?
c# - 您如何正确配置贡献记录器?
Wiki 在描述如何配置记录器方面含糊不清。我在用着
并且已经从 Nuget 安装了 Akka.NLog,但是当我创建参与者系统时出现异常,说明“找不到配置中指定的记录器:“Akka.NLog.Event.NLog.NLogLogger,Akka.NLog”。
contrib 记录器的正确配置字符串是什么?
akka - 使用 Akka.NET 的 Actor 模型:如何防止向死掉的 Actor 发送消息
我正在使用 Akka.NET 实现一个演员系统,其中一些演员是按需创建的,并在可配置的空闲期后被删除(为此我使用 Akka 的“ReceiveTimeout”机制)。这些参与者中的每一个都由一个密钥标识,并且不应存在两个具有相同密钥的参与者。
这些参与者当前由一个共同的主管创建和删除。如果具有此键的参与者尚不存在,则可以要求主管返回对匹配给定键的参与者的引用,方法是返回现有的或创建新的。当演员收到“ReceiveTimeout”消息时,它会通知主管,主管反过来用“PoisonPill”杀死它。
在删除其中一个演员后立即向其中一个演员发送消息时,我遇到了问题。我注意到向死去的演员发送消息不会产生异常。更糟糕的是,当发送“询问”消息时,发送者仍然被阻止,无限期地等待(或直到超时)等待他永远不会收到的响应。
我首先想到了 Akka 的“Deatchwatch”机制来监控演员的生命周期。但是,如果我没记错的话,监视actor发送的“终止”消息将像任何其他消息一样被监控actor异步接收,因此问题可能仍然发生在目标actor死亡和接收它之间“终止”消息。
为了解决这个问题,我这样做是为了让任何要求主管参考这样一个演员的人都必须向主管发送一个“关闭会话”消息,以便在他不再需要它时释放演员(这是透明地完成的由一次性“ActorSession”对象)。只要演员有任何打开的会话,主管就不会删除它。
我想这种情况很常见,因此我想知道是否没有更简单的模式可以解决这类问题。任何建议将不胜感激。
asp.net - ASP.NET 中的 Akka.NET 演员系统
我在 ASP.NET 中创建了一个带有 RESTful API 的服务,托管在 IIS 中。在这个服务中,我想用 Akka.NET 创建一个演员系统。
创建演员系统后:
抛出以下异常:
System.Web.dll 中出现“System.InvalidOperationException”类型的第一次机会异常附加信息:此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行页面时发生此异常,请确保将页面标记为 <%@ Page Async="true" %>。此异常还可能表示尝试调用“async void”方法,在 ASP.NET 请求处理中通常不支持该方法。相反,异步方法应该返回一个任务,调用者应该等待它。
Actor 系统本质上是一个并发系统,在 Actor 之间交换异步消息。正如这里所解释的,这个actor系统将无法在 IIS 关闭 AppDomain 后继续存在,这可能就是引发上述异常的原因。
本文介绍了如何在 ASP.NET 中运行后台任务。但是,我不知道如何将它用于我的演员系统,因为我无法控制可能由 Akka.NET 创建的后台任务的生命周期。
有没有办法使这项工作,或者我应该放弃在 ASP.NET 应用程序中拥有演员系统的想法?
编辑:我还在 Stackoverflow 上看到了一个关于使用 Akka 实现 REST 服务的问题。欢迎任何关于类似于Spray 工具包但适用于 Akka.NET 的解决方案的建议。
c# - 如何处理actor内部的异常?
在 Akka.NET 中是否有处理参与者异常的标准模式?
我看到了一些创建监督者的模式,但似乎这SupervisorStrategy
是一种处理演员无法解决的事情的方法。
我有一个接收大量数据并需要将其存储在外部服务器中的演员。外部数据库可能无法访问。如果是,则服务器可能正在重新启动或网络可能已关闭。我不需要重新启动演员或任何东西,我只想通知发件人一些关于正在发生的事情的信息,这样他就可以将消息保存在磁盘上并重新安排以备后用。
发件人不是连接到数据库的此参与者的父级。我是否也应该创建一个主管来处理这个问题?或者我应该将我的接收处理程序封装在 try/catch 块中,并使用Tell
自定义响应来通知发件人,就好像它是一条普通消息一样?
我知道有一Failure
门课,但我不确定我是否应该在这种情况下使用它。
c# - 演员内部的异步 API 调用和异常
我知道PipeTo
,但有些东西,比如嵌套延续的同步等待,似乎违背了 async & await 方式。
所以,我的第一个问题 [1] 是:这里有什么“魔法”,这样我们就可以连续同步等待嵌套任务,最终它仍然是异步的?
当我们处于异步和等待差异时,如何处理失败?
让我们创建一个简单的示例:
在“常规”、异步和等待方式中:
正如您所期望的那样,异常将从第一次操作中冒出来。
现在,让我们创建一个将处理这些异步操作的参与者。为了争论,假设CalculateAnswerAsync
andConvertAsync
应该一个接一个地用作一个完整的操作(类似于,例如,StreamWriter.WriteLineAsync
如果StreamWriter.FlushAsync
您只想将一行写入流)。
如果没有例外,我仍然Got 42 :)
没有任何问题,这让我回到了上面的“魔术”点 [1]。此外,示例中提供的AttachedToParent
和ExecuteSynchronously
标志是可选的,还是几乎需要它们才能使一切按预期工作?它们似乎对异常处理没有任何影响......
现在,如果CalculateAnswerAsync
抛出异常,这意味着result.Result
throws AggregateException
,它几乎被吞没了。
如果可能的话,我应该在这里做什么,以使异步操作中的异常像“常规”异常一样使参与者崩溃?