标题有点误导,所以让我进一步解释。
我有一个非线程安全的DLL我别无选择,只能用作后端的一部分 服务器。我不能直接在我的服务器中使用它,因为线程会发出它的原因 它崩溃了。因此,我创建了一个由N个节点组成的akka.net集群,每个节点都包含一个节点 演员。我最初对那个坏dll的所有API调用现在都被路由了 通过循环组向这些节点发送消息。由于每个节点只有一个,单个 线程的演员,我得到安全的访问权限,但是当我有N个运行时,我得到了一种并行性。
在制作中,我在心跳上配置了auto-down = false
和默认时间
等等。这非常有效。我可以根据需要启动新节点,将它们添加到组中,
我可以使用Cluster.Leave
删除它们,这也很开心。
我的问题是调试。在我们的开发环境中,我们保留了每个20个节点的集群 暴露如上所述的包含此dll的单个actor。我们还有一组充当的节点 种子节点,什么都不做。
当我们的应用程序运行时,它会加入群集。这允许它通过循环来引导请求
路由器到我们在集群中保持的节点。在进行开发,测试和调试应用程序时,如果我配置要使用的内容auto-down = false
每当测试运行崩溃或我们停止应用程序而不通过时,我们最终会遇到问题
适当的集群离开逻辑。例如,当我们使用调试器中的停止按钮终止应用程序时。
如果没有自动关闭,这会让我们失去群集中缺少的成员,导致领导者不允许 添加到群集。这意味着下次我运行应用程序进行调试时,我无法加入群集而且是 卡住。
似乎我必须设置自动设置以使调试工作。如果已设置,那么当我崩溃我的应用程序时 5秒后,节点将从群集中删除。当我接下来开火的时候 应用程序,群集恢复了快乐状态,我可以加入。
这个问题是,如果我正在调试应用程序并暂停它任何时间,它几乎是立即的 被视为无法访问,然后5秒后被抛出群集。基本上,我无法使用这些设置进行调试。
所以,我设置failure-detector.acceptable-heartbeat-pause = 600s
让我有更多时间暂停应用
在调试时。我将在10分钟内关闭,但我不会经常在调试器中停留那么久,所以它是可以接受的
交易。这个问题当然是当我崩溃应用程序或在调试器中停止它时,群集会认为它
在接下来的10分钟内存在。没有人试图直接与这些节点对话,所以理论上这不是一个大问题,但我保留
遇到我刚刚参加的测试自己被选为角色领导者的情况。所以角色领导者现在已经死了,但群集
还不知道。这似乎阻止我加入任何新的群集,直到我的10分钟结束。当我试图离开时
群集很好,我的死节点卡在退出状态,并没有被删除10分钟。而且我永远不会得到
被通知删除,强迫我在离开时设置超时,这将导致它放弃。
似乎没有任何方式可以说"永远不会让我成为领导者"。当我运行没有为集群设置角色的应用程序时 它似乎经常被选为集群领导者,导致同样的问题 当角色领导者已经死亡但未知如此,但是在更大的层面上。
所以,我真的没有看到任何方法,但也许有人有一些技巧来解决这个问题。我希望能够调试 我的集群成员没有被抛出集群,但我也不希望集群认为领导节点 在他们不在的时候到处都是,阻止我在下次尝试时重新加入。
有什么想法吗?