问题标签 [akka.net-cluster]

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.

0 投票
1 回答
123 浏览

.net - Akka.Net ClusterClientReceptionist 多节点崩溃

我正在尝试创建一个示例,该示例创建一个能够处理订单的集群和一个发送订单的客户端。

为此,我使用 ClusterClientReceptionist 和 ClusterClient 在客户端和集群网络之间进行通信。

集群节点代码:

客户端代码:

当我创建一个集群节点和一个客户端时,示例工作。如果我尝试创建多个集群节点,它们相互连接然后直接解除关联并且集群崩溃。

如果我评论以下两条线,集群可以工作,但接待员/客户机制不起作用。

他们的配置是否缺失?

0 投票
2 回答
296 浏览

akka.net - 集群中的节点停止侦听连接

我们有两个具有相同代码的节点,它们在集群中使用 akka.net,并在它们之间使用远程发送消息。
Akka.Net 版本是 1.2.0,我们使用 dot-netty 进行传输。这是相关的配置部分:
actor { provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster" } remote { dot-netty.tcp { port = 34083 hostname = host_name } }

这两个节点运行在不同的 Windows 服务器上(托管在 Windows 服务上)。有时,节点停止侦听分配的端口(使用 netstat -an 检查)并且它们之间的所有通信都会丢失,直到我重新启动 Windows 服务。
这是我们在日志中获得的所有信息(前 2 条消息来自一个主机,第三条来自另一个主机): 我猜传输层出现故障,dot-netty 关闭套接字并停止侦听。 有什么办法可以阻止这种情况的发生或至少降低它的频率?如果没有,我们可以挂钩失败事件以重新开始收听吗?
60133 2017-08-11 10:09:11.993 Host1 Akka.Remote.Transport.ProtocolStateActor Error No response from remote. Handshake timed out or transport failure detector triggered. 60134 2017-08-11 10:09:12.040 Host1 Akka.Remote.ReliableDeliverySupervisor Warn Association with remote system akka.tcp://ProcesamientoActorSystem@warpacb004.nead.danet:34083 has failed; address is now gated for 5000 ms. Reason is: [Akka.Remote.EndpointDisassociatedException: Disassociated at Akka.Remote.EndpointWriter.PublishAndThrow(Exception reason, LogLevel level, Boolean needToThrow) at Akka.Actor.ReceiveActor.ExecutePartialMessageHandler(Object message, PartialAction1 partialAction) at Akka.Actor.UntypedActor.Receive(Object message) at Akka.Actor.ActorBase.AroundReceive(Receive receive, Object message) at Akka.Actor.ActorCell.ReceiveMessage(Object message) at Akka.Actor.ActorCell.AutoReceiveMessage(Envelope envelope) at Akka.Actor.ActorCell.Invoke(Envelope envelope) --- End of stack trace from previous location where exception was thrown --- at Akka.Actor.ActorCell.HandleFailed(Failed f) at Akka.Actor.ActorCell.SysMsgInvokeAll(EarliestFirstSystemMessageList messages, Int32 currentState)]
60135 2017-08-11 10:09:14.313 Host2 Akka.Remote.ReliableDeliverySupervisor Warn Association with remote system akka.tcp://ProcesamientoActorSystem@warpacb005.nead.danet:34083 has failed; address is now gated for 5000 ms. Reason is: [Akka.Remote.EndpointDisassociatedException: Disassociated at Akka.Remote.EndpointWriter.PublishAndThrow(Exception reason, LogLevel level, Boolean needToThrow) at Akka.Actor.ReceiveActor.ExecutePartialMessageHandler(Object message, PartialAction
1 partialAction) at Akka.Actor.ActorCell.<>c__DisplayClass112_0.b__0(Object m) at Akka.Actor.ActorBase.AroundReceive(Receive receive, Object message) at Akka.Actor.ActorCell.ReceiveMessage(Object message) at Akka.Actor.ActorCell.AutoReceiveMessage(Envelope envelope) at Akka.Actor.ActorCell.Invoke(Envelope envelope)]

0 投票
1 回答
209 浏览

c# - 将 ConsistentHashingPool 与 ClusterRouterPool 一起使用

我们目前使用 ConsistentHashingPool 为特定类型的参与者提供粘性路由和节流:

我们正在添加集群,并希望将此参与者的工作分布在多个节点上。我正在使用 ClusterRouterPool 并提供我现有的路由器作为本地 Pool 构造函数参数:

我不完全清楚 ClusterRouterPoolSettings 的构造函数参数是什么意思。文档说:

nr-of-instances:这是此路由器将首先部署的总路由的最大数量,然后路由到。

max-nr-of-instances-per-node:池路由器将部署到给定集群节点上的最大路由数。

请注意,nr-of-instances 定义了路由的总数,但不会超过每个节点的路由数,即如果您定义 nr-of-instances = 50 和 max-nr-of-instances-per-node = 2,路由器将为集群中的每个新节点部署 2 个路由,最多 25 个节点。

因此,如果我将实例数设置为 1000(如上所示),我会假设部署和路由到的数量不会超过集群中的实际节点数,对吗?

此外,每个节点的最大实例数似乎与 ConsistentHashingPool 的第一个构造函数参数冲突(或重叠)。在上面的代码中,我将两个值设置为相同。它会取两个值中的较小者吗?

编辑 我的印象是上面的代码有效,只是想了解它是否按照我的意图进行路由。

事实证明,上面的代码根本不起作用(部署了错误的分支)。

0 投票
1 回答
547 浏览

scala - Akka.Net 的完整 HOCON 配置

我正在寻找所有可用的参数及其允许的值,我可以使用 Akk.Net 在 HOCON 配置中进行配置。我有一些链接,但它们没有所有可用参数的列表,或者它们不可用:

http://getakka.net/articles/concepts/configuration.html

http://doc.akka.io/docs/akka/2.5.3/scala/general/configuration.html。它提供了更多信息,但我对任何 Akka.Net 特定细节更感兴趣。

0 投票
1 回答
222 浏览

akka.net - 当我真的不需要持久性时如何设置 Akka.NET 集群?

我有一个相当简单的 Akka.NET 系统,它跟踪内存状态,但只包含派生数据。因此,任何参与者都可以在启动时从后端数据库加载其最新状态,然后开始接收消息并从那里保持其状态。所以我可以让演员失败并在我想要的时候重新开始这个过程。它会自我重建。但是......我想跨多个节点运行(主要是为了内存需求),我想根据需要增加/减少节点的数量。也用于在不停机的情况下发布新版本。实现这一目标的最轻量级(就持久性而言)集群设置是什么?您可以在没有持久性的情况下运行集群吗?

0 投票
1 回答
210 浏览

c# - Akka.net 让单身演员跳过集群中的 LightHouse 节点?

我有一个 akka.net 集群,其中包含一些用于管理和 cron 任务的单例。目前处理节点也是种子节点。

我想创建一个简单的灯塔,它只充当集群的连接点。

这样我可以重新启动集群处理节点并确保集群将被正确重新创建。

我的问题是单例机制激活了最旧节点上的参与者,我的灯塔像我集群中的所有其他节点一样体贴。

这意味着它总是尝试在灯塔中设置单例参与者实例。

他们是防止单例主机选择机制考虑灯塔节点的方法吗?

0 投票
1 回答
294 浏览

akka.net - 如何使用 Akka.Net 集群在一个节点上拥有一个实体并让所有节点的消息到达那里

我有一个带有客户演员的测试演员系统。它跟踪客户的状态。事件消息和查询消息被发送到协调器。如果消息不存在客户参与者,则协调器创建一个。工作正常,看起来像这样:

独立的

现在我想添加集群。我希望系统足够大,可以容纳许多客户,当一个客户出现故障时,消息仍然可以由其他节点处理。所以在阅读和修改了一下之后,我以为我知道该怎么做,但我一定是误会了。这是我的方法。我在协调器上方添加了一个 ConsistentHashingPool 演员(使用客户 ID 作为键)。然后通过使池集群知道,它可以将协调器与他们的客户一起分发到其他节点。当仍然在一个节点上时,它看起来像这样:

一个节点上的池

像魅力一样工作。但后来我向集群添加了第二个节点。然后它看起来像这样:

在两个节点上

这不是我想要的。所有客户现在都有两个演员代表他们。一些事件最终在节点 1 上结束,其他事件在节点 2 上结束。我显然有一些错误的期望。我有点期望集群感知池“作为一个”存在于两个节点上。

那么我应该怎么做才能实现我的目标呢?也许应该有调度员角色和状态角色?但那时我仍然想要 2 个调度员。我应该看看这个集群单例吗?它指出单例很容易成为瓶颈。最好,我会在每个节点上都有一个路由器,但它们会共享路由,一些是本地的,一些是远程的。

0 投票
1 回答
615 浏览

akka.net - Akka.net / Cluster - 当领导者死亡时如何“治愈”拓扑?

我使用Petabridge Lighthouse和两个相互通信的简单测试参与者设置了一个基本的测试拓扑。到目前为止效果很好,但是有一个问题:Lighthouse(或底层 Akka.Cluster)使我的一个演员成为领导者,并且当没有优雅地关闭节点时(例如,当某些事情严重崩溃或我只是点击“停止”时)在 VS 中)灯塔不再可用。大量异常滚动,必须重新启动。

是否可以配置 Akka.Cluster .net 以使拓扑的其余部分选举一个新的领导者并继续?

0 投票
1 回答
135 浏览

akka.net - 在单个 ActorSystem 中使用 Akka.Net Cluster 实用程序

我正在尝试创建一个多节点网络的模拟来分析网络流量。节点本身将使用 Akka.Net 实现,并且应该能够使用一些 Akka.Net 集群功能。但模拟本身旨在在单台机器上运行,并且可能包含数千个这样的节点。

由于节点的数量,我想避免为每个节点创建一个 ActorSystem。是否仍然可以在单个参与者系统中使用集群模块及其功能,例如角色、分布式广播、成员上下事件等?

是否有可能伪造远程部署它们并创建一个伪造的传输,将所有流量简单地路由回同一个参与者系统?

0 投票
0 回答
485 浏览

akka.net - 如何调用集群中不同节点上的actor?

根据文档( https://getakka.net/articles/clustering/cluster-routing.html)和我阅读的各种教程和代码示例,这似乎是路由器发挥作用的地方。不过,似乎被忽略的是如何NodeB调用位于NodeA. 在微服务系统下,执行工作的“服务/参与者”可能完全位于另一个节点上。

所以看来我需要在集群中的每个节点上放置一个路由器。我有兴趣使用broadcast-pool基于池的路由器,根据文档,它们部署到他们的路由:

集群池路由器与组路由器的不同之处在于,它们将路由远程部署到目标节点上,而不是将消息路由到远程机器上可能存在或不存在的预定义参与者路径。

因此,复制基于池的路由器似乎也会复制跨节点的部署。

所以这似乎意味着您只需要一个基于池的路由器来避免这种部署重复?我想max-nr-of-instances-per-node会限制吗?

就我而言,我想使用角色来分配可用的内容:

除此之外,如果我的actor正在运行NodeB并希望调用位于另一个节点(微服务)上的另一个actor,如果没有定义路由器,NodeB我会使用它ActorSelection来获取路由器的句柄吗?我假设我需要定义路由器的完整路径才能做到这一点:akka.tcp://...

我想我的另一个选择是配置NodeB知道某些节点在哪里

我想NodeB已经需要知道在哪里连接到种子节点,所以在这种情况下,我将拥有完整路径,我可以在种子上定义路由器,然后使用参与者选择来处理这些路由器,这将需要对这些路径进行硬编码。我认为这种方法不太理想。

我也可能做错了事,也许这种方法会更好:Distributed Publish Subscribe in Cluster

https://getakka.net/articles/clustering/distributed-publish-subscribe.html

因为它特别指出:

如何在不知道它在哪个节点上运行的情况下向参与者发送消息?

这似乎有点像在虚空中大喊大叫并希望得到最好的结果,尤其是在需要回复的情况下,例如,调用一个会获取一些额外数据以返回给发送者的参与者。