问题标签 [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 Cluster 1.0.8 和 1.1.1 有哪些变化
我有一个 AKKA.NET 集群,它在使用 AKKA.NET 集群 1.0.8 版本及其相关依赖项时工作。使用版本 1.1.1 时相同的集群不起作用。集群在本地形成,但远程机器无法发现集群。这个本地集群也适用于 1.1.1。这可能是网络问题还是我做错了什么?
这是 Web.Config 的 Akka 配置部分。同样的配置适用于 1.0.8 但不适用于 1.1.1
HOCON 中是否有任何 API 更改或任何配置更改?任何帮助表示赞赏。谢谢!
[编辑:2]
日志的要点链接https://gist.github.com/yashu2203/21e84af600cc3198961c0a6fe0300bb9
akka.net - 跟踪发送到集群中节点的消息
如果集群中有n 个节点,并且我正在将一些消息路由给它们,那么有没有办法跟踪从集群路由器(RoundRobinPool 或任何其他如果可用)中发送到哪个节点的消息。
即在发送完所有消息后,最后,我需要一个类似的列表。'message
-1,4,7 已发送到 A 节点',
'message-2,5,8 到 B 节点',
' message-3,6,9 到 C-node' 等等。
任何帮助将不胜感激。
akka.net - Akka.Net 为什么我的池演员没有根据负载放大或缩小
我正在尝试使用以下配置构建一个可以根据工作负载向上/向下扩展的参与者系统。
在我的主循环中,我正在创建 3000 条消息并推送给演员进行处理
在我看来,我们在上面的 for 循环中是否看到任何错误,它看起来像是将所有消息发送到一个参与者 ref 而不是路由器。
我ReceiveActor
是一个非常简单的日志记录应用程序
我还覆盖AroundPreStart
并PostStop
查看启动和停止了多少演员。但我看到,当应用程序启动时,它只创建lower-bound
或最少 2 个演员,我期待这将基于pressure-threshold
默认 1 创建更多演员,但我看到它没有发生,并且当有没有任何消息要处理。
有人可以帮我理解我在这里做错了什么。- 谢谢
更新1:
我想我弄清楚了实际问题。在发布消息时,我需要更改我的逻辑以将路径附加到我的部署配置routees.paths = ["/user/analysis"]
,并使用和函数来使用类似这样的东西Ask
获得正确的参考 。analysisRef.Ask<Routees>
f# - 如何在 F# 中的集群配置中创建参与者
我正在创建一个Akka.Cluster
包含三个节点 A、B 和 C 的示例,其中 A 是灯塔。到目前为止,从日志来看,当没有演员或演员是本地的(使用spawn
and创建spawnOpt
)时,集群可以正常工作。我想从 B 创建一个演员并从 C 访问它。
和
我明白了
2016-08-31 01:59:00.1185|INFO|Akka.Actor.EmptyLocalActorRef|Message String from akka://calculatorSystem/deadLetters to akka://calculatorSystem/user/r-actor was not delivered. 1 dead letters encountered.
使用
抛出异常
Akka.Configuration.ConfigurationException
Akka.dll 中发生未处理的类型异常
附加信息:Configuration problem while creating [akka://calculatorSystem/user/r-actor] with router dispatcher [akka.actor.default-dispatcher] and mailbox and routee dispatcher [akka.actor.default-dispatcher] and mailbox [].
节点 C 上的测试函数为
HOCON(节点 B)
如何创建可由集群中的另一个节点调用的参与者?
akka.net - Akka.net 集群调试
标题有点误导,让我进一步解释一下。
我有一个非线程安全的 dll,我别无选择,只能用作后端服务器的一部分。我不能直接在我的服务器中使用它,因为它的线程问题会导致它崩溃。因此,我创建了一个由 N 个节点组成的 akka.net 集群,每个节点托管一个 actor。我所有最初对那个坏 dll 的 API 调用现在都通过循环组通过消息路由到这些节点。由于每个节点只有一个单一的、单线程的参与者,我可以安全访问,但是当我有 N 个节点运行时,我得到了某种并行性。
在生产中,我auto-down = false
在心跳等方面配置了默认时间。这完美地工作。我可以根据需要启动新节点,将它们添加到组中,我可以删除它们,Cluster.Leave
这也很高兴。
我的问题是调试。在我们的开发环境中,我们保留了一个由 20 个节点组成的集群,每个节点都暴露一个如上所述的包装此 dll 的单个参与者。我们还有一组节点充当种子节点,不做任何其他事情。
当我们的应用程序运行时,它会加入集群。这允许它通过循环路由器将请求定向到我们在集群中保持的节点。在进行应用程序的开发、测试和调试时,如果我配置要使用的东西,auto-down = false
每当测试运行崩溃或我们在没有通过适当的集群离开逻辑的情况下停止应用程序时,我们最终都会遇到问题。例如当我们在调试器中使用停止按钮终止应用程序时。
如果没有自动关闭,这会给我们留下一个丢失的集群成员,导致领导者不允许添加到集群中。这意味着下次我运行该应用程序进行调试时,我无法加入集群并卡住了。
看来我必须设置自动关闭才能使调试工作。如果已设置,那么当我的应用程序崩溃时,节点会在 5 秒后从集群中删除。当我下次启动我的应用程序时,集群又回到了快乐的状态,我可以很好地加入。
这样做的问题是,如果我正在调试应用程序并暂停它任何时间,它几乎立即被视为无法访问,然后 5 秒后被抛出集群。基本上,我无法使用这些设置进行调试。
所以,我设置failure-detector.acceptable-heartbeat-pause = 600s
让我有更多时间在调试时暂停应用程序。我将在 10 分钟内关闭,但我不会经常在调试器中坐那么久,所以这是一个可以接受的权衡。这个问题当然是当我使应用程序崩溃或在调试器中停止它时,集群认为它在接下来的 10 分钟内仍然存在。没有人试图直接与这些节点对话,所以理论上这不是一个大问题,但我不断遇到我刚刚运行的测试本身被选为角色领导者的情况。所以角色领导者现在已经死了,但集群还不知道。这似乎阻止了我在 10 分钟结束之前加入集群的任何新内容。当我尝试很好地离开集群时,我的死节点卡在退出状态并且 10 分钟内没有被删除。而且我也不总是收到删除通知,
似乎没有任何方式可以说“永远不要让我成为领导者”。当我在没有为集群设置角色的情况下运行应用程序时,它似乎经常将自己选为集群领导者,这会导致与角色领导者死亡但未知但更大级别时相同的问题。
所以,我真的看不出有什么办法解决这个问题,但也许有人有一些技巧可以解决这个问题。我希望能够调试我的集群成员而不会将其从集群中抛出,但我也不希望集群认为领导节点在他们不在的时候就在附近,从而阻止我在下一次尝试时重新加入。
有任何想法吗?
akka.net - 没有种子的 Akka.net 集群
我今天刚接触到 Akka.net,它看起来非常适合我的一个项目。但我需要一种零配置集群,用户只需在其(本地)网络上的多台机器上启动应用程序,它们就会自动形成一个集群。我不确定 Akka.net 是否可行,因为我没有种子节点可以放入配置文件中。
我想,如果可以选择以编程方式设置种子节点,我可以广播以查找其他节点,但并不能真正保证所有节点都以相同的种子节点集开始。是否可以用种子节点 B 启动节点 A,用种子节点 A 启动节点 C 等等?
akka.net - Akka.net Lighthouse 不断尝试连接到失败的节点
我正在尝试学习 akka.net 聚类。
我以为我明白当一个节点出现故障时,它会从集群中删除。但这似乎并没有发生。
我启动了一个 Lighthouse 实例(作为种子节点)并创建了一个超级简单的 Akka.net 项目,然后进行连接。这一切都很好。
但是当我杀死节点时,灯塔会一遍又一遍地寻找它。最终它会说Leader无法履行职责。
我知道节点没有优雅地离开集群,但我想我会有节点崩溃。
我认为当这种情况发生时,八卦系统应该从集群中删除死节点,然后一切都会继续。(然后,如果节点重新联机,它可能会要求重新添加到集群中。
但我一定是错过了什么。因为 Lighthouse 只是一遍又一遍地重试。
为什么它这样做而不是等待它再次连接?
microservices - 容错冗余
这可能会导致有偏见和基于意见的答案,如果是这样,我会结束这个问题,但是......
我有一个相当基本的要求,即提高我们的正常运行时间和速度。作为其中的一部分,我正在研究两种主要的竞争方法,传统的 pub/sub 和 akka.net。我们目前没有任何问题,也没有预期需要并发控制。
我们拥有的是几个基本的工作流程,它们是数据分析、操作和结果的持久性:
第 1 步)捕获要完成的工作(即哪些对象需要做一些工作)
步骤 2) 执行该工作负载并产生结果
步骤 3) 保存结果
使用传统的 pub/sub 这似乎相当容易。每个步骤都有微服务,在每个步骤结束时推送一条消息,其中包含下一步所需的数据(或更多可能有用的点数据)。使用任何自消息队列/主题/订阅软件,这提供了一个很好的能力:
1) 在地理上将负载分布在世界各地到源数据所在的位置
2)增加订阅增加吞吐量的“工人”数量
3) 推动可以支持以最小的学习曲线连接“工人”的想法的核心
4)任何组件(或组件的一组工作人员)在工作流的下方有/有一个队列,其中消息排队并等待所述组件重新联机(即使整个组件断开连接)
5)添加新的组件来做一些新的和不同的事情,就像注册一个主题的新订阅一样简单。
这一切都是开箱即用的轻松快乐......假设这里遵循了合理的聚合和有界上下文模式。我不是在寻求如何编写好的分布式代码的建议,我在寻找如何部署它、支持它、调试 rouge/missing/corrupt 消息等。这就是我想知道 Akka.net 提供什么的原因。
我已经看到有 Akka.net clustering 。它可能还没有准备好生产,但我最好了解它可以/可以为我们做什么。
所以我的主要问题是:
1) 消息在到达之前存储在哪里?只要发布者可以访问消息传递总线/软件端点,任何此类软件都将存储并保存消息,等待订阅者连接并获取它的消息(关于订阅已经注册的明显假设,因此消息排队等待它)。Akka.net 集群如何处理所有这些?
2) Akka.net 集群中的这些队列和邮箱的操作支持有哪些工具?哪些工具可以让操作员深入了解邮箱中已接收但等待处理的内容,以及存在哪些工具可用于查看已“发布”和尚未“接收”的内容?大多数竞争的 Pub/Sub 软件都有操作工具,所以我在这里寻找一些比较。
3) 你如何调试 rouge、丢失或损坏的消息。我们都知道我们应该信任我们的软件,但是一条坏消息会导致系统失控,那么我该如何从系统中弹出一条坏消息呢?我如何修改一条消息,使其行为不同,因为业务需要在凌晨 3:30 修复某些内容?我如何用“它在系统中并且它正在等待接收”或“它已经收到并且就在邮箱中”来回答“我的消息在哪里”?
4) 如果一个组件出现 HARD(回收、硬件故障等等),什么会恢复邮箱、队列等?任何实际正在处理的消息都有可接受的丢失容忍度,但是邮箱中的 1000 条消息丢失不是那么容忍的,有什么持久性和容忍度?
5)我所做的轻量级审查似乎主张在您的软件中构建一个主管模式来编组消息(我猜是管理和释放并发锁?)。鉴于并发在这里不是问题,您支持什么开箱即用的发布/订阅机制,这不是两个(或代码中内部定义的 x)组件之间的基本消息远程处理?在大多数 pub/sub 软件中再次使用订阅和主题,您的第一个对象会推送一条消息(它是中心的,因此它是一个潜在的单点故障)但该组件(也没有任何其他代码)必须知道什么会使用该消息。它的扩展必杀技比较了我们手动将消息从一个对象推送到下一个对象(以及下一个对象)的旧学校方式,为同一消息必须去的每个新类重建或重新编译。我渴望不必构建我们自己的消息路由器。
6) 当特定组件的所有实例都脱机时(比如上面的步骤 3),什么会记住实际上有一些东西需要排队并记住这些消息(比如从上面的步骤 2 中盲目推送的那些)?在其他软件中,在您删除订阅之前,消息会根据为 TTL 等定义的规则不断排队。为此提供了什么?
.net - Akka.Net:在两个或多个独立集群之间进行通信的最佳方法是什么?
Akka.Net 集群需要一个 ActorSystem,但是如果我有多个需要同步或异步协调的 ActorSystem(分布式应用程序)怎么办?
如何处理共享消息库?也许最好不要共享任何东西(除了通用消息库)并使用动态消息,例如:DynamicJsonMessageBase。
如何处理服务发现?
背景:我正在使用 Akka.Net 设计一个微服务架构,它可能会使用 Lighthouse 进行发现,使用 REST HTTP API 用于后端代理/门户,并结合用于向非 Actor 服务发送/接收消息的传输机制。
akka - Akka.net 如何防止父母重新启动子演员
这可能更像是一个设计而不是实现问题。假设我有以下演员层次结构,它形成了一个 Akka 集群
(我故意没有放置种子节点以节省空间) Api 角色也可以是冗余的
所以工作流程很明显 - 用户交互/通过脚本在不同的工作节点上启动一堆不同的作业。作业是“一劳永逸”类型,用户不等待结果,结果正在写入数据库。然后坏事发生了——API 节点重新启动或更糟(被破坏、淹没、被哥斯拉吃掉等)。我知道我不能让子演员活着,因为它们是不再有效的父演员状态的一部分。如果我理解正确,即使路由器演员已经充当它的路由的父级? 问题:将工作角色与 api 角色解耦的最佳方法是什么?如果可能的话
如果不是,那么我想我将不得不实施某种工人演员恢复工作流程?
提前致谢