问题标签 [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.
akka.net - 当我的节点加入集群时,Akka.net 集群中是否有事件?
在我的 Akka.Net 集群中,我有几个节点。当我成功加入集群时,我想发起通信。我可以在日志中看到欢迎加入集群:
但我看不到为此引发的任何我可以订阅的事件。
akka.net - AKKA.Net 集群和共享资源
嘿,我正在 AKKA.Net 上阅读和观看一些视频,我很喜欢我所看到的。我想在现有的应用程序中尝试 AKKA.net,但我需要帮助澄清一些事情
场景
我想创建一个 Akka.net 集群:
3 个节点/机器
它们之间的共享资源(计数器)。
可从所有节点读取的共享资源统计信息
每当一个节点兑现一张票时,它将获取计数器的值并将其加一,然后更新计数器。两张票不应具有相同的计数器值。共享的统计信息用于保存票证兑现的价值,因此应将其部署到集群中的所有节点。
问题
- 如何确保票据具有唯一的计数器值?我习惯了锁的暗示,但演员的暗示是什么?
- 如果一个节点与集群断开连接,我可以捕捉到一个事件以进行必要的调整吗?
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 上的项目,该问题已被标记为已修复。
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 实例不断输出消息,例如:
然后:
再次这样做,我注意到以下消息:
akka.net - 在 Akka.Net 中处理冗余和故障转移
我在接受远程请求并进行处理和发回响应的服务中实现了 Akka.Net 演员系统。系统中的一些参与者的状态会被持久化到数据库中。当演员系统启动时,这些演员通过从数据库中读取他们的状态来补充水分。
当请求进入时,actor 会按需延迟加载并驻留在内存中以处理进一步的请求。
我现在正在研究如何以最简单的方式提供冗余。
我猜这里最简单的解决方案是在“冷”待机状态下拥有第二份服务副本。当第一个节点出现故障时,请求被路由到第二个节点 - 然后它将开始创建参与者并从数据库中获取它们的状态。
然后,当原始节点出现时,需要识别它不是“主要”节点并终止所有参与者(因此当它变为活动时,它可以从磁盘读取它们的状态)
实现这一目标的最佳方式是什么?我猜我应该使用 Akka.Cluster 并监听节点何时加入或离开集群?但是我怎么说所有的消息本质上都应该发送到一个节点呢?是否存在某种领导者选举过程,但针对单个角色而不是整个集群?
有没有更好/更简单的方法来做到这一点?
c# - Akka.Net (C#) 向集群中的所有参与者发布消息
我正在尝试在集群中使用 pub/sub 模式。这方面的文档很差。
我正在寻找的场景是: 1. 演员订阅了一个事件。2. 在代码中的任意位置,在actor系统中针对该事件向所有订阅者发布消息,无需选择actor。
从“现有”文档中,这样做的方法是使用: DistributedPubSub.Get(Context.System).Mediator;
但是,一旦我启动了一个调解器,我就会得到一个“关联”异常。
- 我错过了什么?
- 有人可以指点我一个工作演示吗?
谢谢
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 才能从这种情况中恢复。
如果不重新启动客户端参与者,系统不会自行纠正。
我们的客户角色配置是;
我们的发件人角色配置是;
我们如何解决这个问题?谢谢你。
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
c# - Akka.NET 集群节点优雅关闭
背景
我有一个 Akka.NET 集群,其中包含一个 Lighthouse 种子节点和另外两个运行 Actor 系统的节点。当我尝试在我的一个集群节点上进行正常关闭时,我希望看到至少有一个其他节点收到有关节点离开的消息,并且所有集群节点最终都排除了节点列表中的离开节点。
一旦解决了这个问题,我希望我应该能够关闭节点,而其他两个节点不会因为无法连接到关闭的节点而发疯。
我试过的
我现在拥有的是一个包装在 TopShelf 应用程序中的控制台应用程序:
这是我的主要内容:
单步执行 Stop 功能时,我看不到任何收到的关于节点离开其他节点的消息。然而,当函数返回时,其他节点开始发出异常。
Akka.NET Gitter 频道的一位用户说:
即使没有我必须说的 TopShelf,我也观察到了同样的事情,在 webhost 终止后使用纯 ASP.NET Core 项目。
问题
我可以添加什么来让其他节点收到关于节点离开的消息?
akka.net - Akka.Net 集群单例 - 当前单例节点意外关闭时不会发生切换
我正在尝试 Akka.Net Cluster Tools,以使用 Singleton 行为,它似乎工作得很好,但就在当前的单例节点“主机”以优雅的方式离开集群时。如果我突然关闭主机节点,则不会发生切换。
背景
我正在构建一个由四个节点(最初)组成的系统。其中一个节点将是“工人协调员”,它将负责监控数据库中的一些数据,并在必要时将作业提交给其他工人。我正在考虑订阅集群事件并使用角色领导者更改事件来使参与者(在领导者节点上)成为协调者,但我认为在这种情况下集群单例会是一个更好的选择。
工作样本(但如果我优雅地离开集群)
配置