问题标签 [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 回答
414 浏览

akka.net - 当我的节点加入集群时,Akka.net 集群中是否有事件?

在我的 Akka.Net 集群中,我有几个节点。当我成功加入集群时,我想发起通信。我可以在日志中看到欢迎加入集群:

但我看不到为此引发的任何我可以订阅的事件。

0 投票
1 回答
276 浏览

akka.net - AKKA.Net 集群和共享资源

嘿,我正在 AKKA.Net 上阅读和观看一些视频,我很喜欢我所看到的。我想在现有的应用程序中尝试 AKKA.net,但我需要帮助澄清一些事情

场景
我想创建一个 Akka.net 集群:

  • 3 个节点/机器

  • 它们之间的共享资源(计数器)。

  • 可从所有节点读取的共享资源统计信息

    每当一个节点兑现一张票时,它将获取计数器的值并将其加一,然后更新计数器。两张票不应具有相同的计数器值。共享的统计信息用于保存票证兑现的价值,因此应将其部署到集群中的所有节点。

问题

  1. 如何确保票据具有唯一的计数器值?我习惯了锁的暗示,但演员的暗示是什么?
  2. 如果一个节点与集群断开连接,我可以捕捉到一个事件以进行必要的调整吗?
0 投票
0 回答
350 浏览

akka.net - Akka.net 集群广播仅由一个节点接收

我从 Akka.net WebCrawler学习并创建了自己的集群测试。我有一个处理器节点(控制台应用程序)和一个 API 节点(SignalR)。以下是配置。

处理器节点:

API 节点:(非种子节点的端口 = 0)

在 API 节点内部,我创建了一个名为 SignalR 的普通参与者。

在处理器节点内部,我创建了一个普通actor,并将调度程序用于Tell()API 节点的signalR actor 一些字符串。

当我有一个处理器和一个 API 时,这很有效。当我有多个处理器节点和一个 API 节点时,它也可以工作。不幸的是,当我有多个 API 节点时,无论我如何设置配置,“tell”都不会告诉所有 API 节点;该消息仅发送给其中一个。哪个节点接收消息取决于 API 节点启动顺序。似乎我在集群中正确注册了所有 API 节点,但我可能是错的。

我开始觉得这是一个配置或理解问题。任何人都可以分享任何见解吗?

我做了一些额外的测试。当我用普通控制台应用程序替换 ASP.NET SignalR API 节点时,行为保持不变。

更新:我联系了 Akka.NET 团队。此行为是一个已知错误。它将在 1.1 版本中修复。 更新 2:对于 GitHub 上的项目,该问题已被标记为已修复。

0 投票
1 回答
1373 浏览

akka - 在 Akka.NET 中,(使用 Akka.Cluster)如何配置多个种子节点(Lighthouse)以相互了解?

如果我想让两个 Lighthouse 种子节点在不同的 PC 上运行,每个节点都应该知道另一个节点,我应该如何配置它们?尽管我发现提到使用多个 Lighthouse 实例并看到使用多个种子节点的非种子节点配置,但我无法在知道一个的不同 PC 上找到多个种子节点(特别是 Lighthouse)的示例其他。

我目前有这样的东西,但我不确定它是否正确。

与其他实例的配置基本相同,但有以下区别:

akka.remote:

akka.cluster:

这是正确的吗?有什么我应该改变或可以改进的吗?确保一切正常运行的最佳方法是什么?我是否应该删除每个配置中的第一个种子节点,因为评论似乎表明不需要包含它?

如果我在 192.168.72.55 上启动节点,然后在 192.168.72.56 上启动节点,我会看到它在 192.168.72.55 上加入并在 192.168.72.56 上收到欢迎消息。如果我关闭 192.168.72.56 实例并重新启动它,它再次受到欢迎,但 192.168.72.55 实例不断输出消息,例如:

然后:

再次这样做,我注意到以下消息:

0 投票
1 回答
458 浏览

akka.net - 在 Akka.Net 中处理冗余和故障转移

我在接受远程请求并进行处理和发回响应的服务中实现了 Akka.Net 演员系统。系统中的一些参与者的状态会被持久化到数据库中。当演员系统启动时,这些演员通过从数据库中读取他们的状态来补充水分。

当请求进入时,actor 会按需延迟加载并驻留在内存中以处理进一步的请求。

我现在正在研究如何以最简单的方式提供冗余。

我猜这里最简单的解决方案是在“冷”待机状态下拥有第二份服务副本。当第一个节点出现故障时,请求被路由到第二个节点 - 然后它将开始创建参与者并从数据库中获取它们的状态。

然后,当原始节点出现时,需要识别它不是“主要”节点并终止所有参与者(因此当它变为活动时,它可以从磁盘读取它们的状态)

实现这一目标的最佳方式是什么?我猜我应该使用 Akka.Cluster 并监听节点何时加入或离开集群?但是我怎么说所有的消息本质上都应该发送到一个节点呢?是否存在某种领导者选举过程,但针对单个角色而不是整个集群?

有没有更好/更简单的方法来做到这一点?

0 投票
1 回答
1115 浏览

c# - Akka.Net (C#) 向集群中的所有参与者发布消息

我正在尝试在集群中使用 pub/sub 模式。这方面的文档很差。

我正在寻找的场景是: 1. 演员订阅了一个事件。2. 在代码中的任意位置,在actor系统中针对该事件向所有订阅者发布消息,无需选择actor。

从“现有”文档中,这样做的方法是使用: DistributedPubSub.Get(Context.System).Mediator;

但是,一旦我启动了一个调解器,我就会得到一个“关联”异常。

  1. 我错过了什么?
  2. 有人可以指点我一个工作演示吗?

谢谢

0 投票
1 回答
463 浏览

akka - IIS回收AppPool后节点有时不加入Akka.Net集群

我们为短信、电子邮件和推送通知创建了一个 Akka 集群基础设施。系统中存在三种不同类型的节点,分别是客户端、发送者和灯塔。Web 应用程序和 API 应用程序正在使用客户端角色(Web 和 API 托管在 IIS 上)。Lighthouse 和 Sender 角色作为 Windows 服务托管。考虑到 Web 应用程序和 API 应用程序 AppPools 因 IIS 被回收,在 global.asax.cs 的 Start 和 Stop 事件中,我们关闭了 Client 角色中的 Actor 系统并重新启动。我们可以通过日志观察到系统成功关闭并加入集群。

但有时,当 AppPool 回收时,客户端 ActorSystem 启动但无法加入集群,我们的 Notification 停止工作(这对我们来说是个大问题)。当我们手动关闭 ActorSystem 并手动使其再次工作时,它会加入集群。这种情况大约每两天发生一次。

我们可以观察到Client在Error之前加入了Cluster;

节点 [akka.tcp://NotificationSystem@ . . :41350] 正在加入,角色 [client]
领导者正在移动节点 [akka.tcp://NotificationSystem@ . . :41350] 到 [向上]

通过查看日志,我们可以看到客户端加入集群后出现以下错误;

关闭地址:akka.tcp://NotificationSystem@ . . :41350Akka.Remote.ShutDownAssociation:关闭地址:akka.tcp://NotificationSystem@ . .:41350 ---> Akka.Remote.Transport.InvalidAssociationException:远程系统终止关联,因为它正在关闭。--- 内部异常堆栈跟踪结束 --- 在 Akka.Remote.EndpointWriter.b__20_0(Exception ex) 在 Akka.Remote.EndpointWriter.PublishAndThrow(Exception reason, LogLevel level) 在 Akka.Actor.LocalOnlyDecider.Decide(Exception cause ) at Akka.Actor.OneForOneStrategy.Handle(IActorRef child, Exception x) at Akka.Actor.SupervisorStrategy.HandleFailure(ActorCell actorCell, 异常原因, ChildRestartStats failedChildStats, IReadOnlyCollection1 allChildren) at Akka.Actor.ActorCell.HandleFailed(Failed f) at Akka.Actor.ActorCell.SystemInvoke(信封信封)---堆栈跟踪从先前抛出异常的位置结束---在 Akka.Actor 的 Akka.Actor.ActorCell.HandleFailed(Failed f)。. . .:41350 ---> Akka.Remote.Transport.InvalidAssociationException:远程系统终止了关联,因为它正在关闭。--- 内部异常堆栈跟踪结束 --- 在 Akka.Remote.EndpointWriter.b__20_0(Exception ex) 在 Akka.Remote.EndpointWriter.PublishAndThrow(Exception reason, LogLevel level) 在 Akka.Actor.LocalOnlyDecider.Decide(Exception cause ) 在 Akka.Actor.OneForOneStrategy.Handle(IActorRef child, Exception x) 在 Akka.Actor.SupervisorStrategy.HandleFailure(ActorCell actorCell, 异常原因, ChildRestartStats failedChildStats, IReadOnlyCollection`1 allChildren) 在 Akka.Actor.ActorCell.HandleFailed(Failed f )在 Akka.Actor.ActorCell.SystemInvoke(信封信封)---从先前抛出异常的位置结束堆栈跟踪---在 Akka.Actor 的 Akka.Actor.ActorCell.HandleFailed(Failed f)。

错误后,我们看到以下错误消息;

与 [akka.tcp://NotificationSystem@ 的关联. . :41350] 具有 UID [226948907] 的失败是不可恢复的。UID 现在已被隔离,所有发往此 UID 的邮件都将被发送到死信。必须重新启动远程 actorsystem 才能从这种情况中恢复。

如果不重新启动客户端参与者,系统不会自行纠正。

我们的客户角色配置是;

我们的发件人角色配置是;

我们如何解决这个问题?谢谢你。

0 投票
1 回答
498 浏览

akka.net - akka.net 循环组路由器 - 仅路由到一个路由

关于集群路由器的问题(策略 = 循环组)。在集群设置中,我无法让它在我的路由之间循环。

我的设置如下:节点 A,在 ASP.NET 的上下文中启动它的参与者系统。在那里我有一个与actor A1 对话的API 控制器,然后这个actor 与我的路由器对话。然后,此路由器应将消息轮询到在节点 B 上创建的路由(使用工作角色)。

节点 B 在 Windows 服务的上下文中创建其参与者系统。我已经仔细检查了我在节点 B 上的所有路由实际上都是创建的(在服务启动时完成)。

为了检查哪些路由接收到从节点 A 的路由器发送的消息,我只需在我的接收句柄中控制台记录 Self.Path。出于某种原因,同一个路由获取所有消息,并且它们没有分布在路由周围。

Se config 在下面的节点 A 上。

使用以下代码实例化路由器:

使用版本:

  • 阿卡 1.1.0
  • Akka.Cluster 1.1.0
  • Akka.Remote 1.1.0
0 投票
2 回答
2556 浏览

c# - Akka.NET 集群节点优雅关闭

背景

我有一个 Akka.NET 集群,其中包含一个 Lighthouse 种子节点和另外两个运行 Actor 系统的节点。当我尝试在我的一个集群节点上进行正常关闭时,我希望看到至少有一个其他节点收到有关节点离开的消息,并且所有集群节点最终都排除了节点列表中的离开节点。

一旦解决了这个问题,我希望我应该能够关闭节点,而其他两个节点不会因为无法连接到关闭的节点而发疯。

我试过的

我现在拥有的是一个包装在 TopShelf 应用程序中的控制台应用程序:

这是我的主要内容:

单步执行 Stop 功能时,我看不到任何收到的关于节点离开其他节点的消息。然而,当函数返回时,其他节点开始发出异常。

Akka.NET Gitter 频道的一位用户说:

即使没有我必须说的 TopShelf,我也观察到了同样的事情,在 webhost 终止后使用纯 ASP.NET Core 项目。

问题

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

0 投票
2 回答
332 浏览

akka.net - Akka.Net 集群单例 - 当前单例节点意外关闭时不会发生切换

我正在尝试 Akka.Net Cluster Tools,以使用 Singleton 行为,它似乎工作得很好,但就在当前的单例节点“主机”以优雅的方式离开集群时。如果我突然关闭主机节点,则不会发生切换。

背景

我正在构建一个由四个节点(最初)组成的系统。其中一个节点将是“工人协调员”,它将负责监控数据库中的一些数据,并在必要时将作业提交给其他工人。我正在考虑订阅集群事件并使用角色领导者更改事件来使参与者(在领导者节点上)成为协调者,但我认为在这种情况下集群单例会是一个更好的选择。

工作样本(但如果我优雅地离开集群)

配置