模拟 apache ignite 节点故障进行单元测试

问题描述 投票:0回答:1

对于单元测试,我在同一 JVM 中运行多个 Ignite 节点(如答案 here 中所讨论)。

在我的单元测试中,我想模拟 Ignite 节点意外死亡时发生的情况,例如模拟突然的硬件故障及其对整个集群的影响。我不能只调用 Ignite.close() 因为这会 有序 关闭,我想要突然 无序 关闭,它可能带来所有问题。

我可以想到两种可能的方法来做到这一点:

  1. 当我在我的 JVM 中启动一个新的 ignite 节点时,以某种方式跟踪它产生的所有线程,然后在我想模拟它死亡时使用(已弃用的)方法 thread.stop 突然杀死它的所有线程。我看不到一种方法可以可靠地区分 JVM 中一个 Ignite 启动的线程与另一个 Ignite 启动的线程,除非我假设 Ignite 仅在启动时启动它的所有线程。

  2. 使用 Java 进程 API 启动一个单独的进程(参见第一个答案here),在该进程中启动点燃,然后使用 Process.destroy() 或 Process.destroyForcibly() 强制终止它。

有人知道更好的方法吗?

我正在使用 Java 8.

java ignite
1个回答
0
投票
  1. 当我在我的 JVM 中启动一个新的 ignite 节点时,以某种方式跟踪它产生的所有线程,然后在我想模拟它死亡时使用(已弃用的)方法 thread.stop 突然杀死它的所有线程。我看不到一种方法可以可靠地区分 JVM 中一个 Ignite 启动的线程与另一个 Ignite 启动的线程,除非我假设 Ignite 仅在启动时启动它的所有线程。

如果您在集群节点拓扑更改期间测试您的应用程序行为,则没有必要使用私有 API 或 Ignite 的内部线程和类。 Ignite 测试框架中已经维护了此类测试。此外,还有基于 Ducktape 框架(IEP-56)的额外集成测试,它通过 Docker 在单独的 JVM 中运行 Ignite 节点。

我不完全确定你的情况,但看起来,你需要像Test Containers这样的东西。

例如,这样的代码下载Docker镜像并运行带有瘦客户端固定端口的Ignite节点(不幸的是,瘦客户端无法连接到临时端口):

FixedHostPortGenericContainer<?> ignite = new FixedHostPortGenericContainer<>("apacheignite/ignite")
    .withFixedExposedPort(10800, 10800)

然后,调用

ignite.stop()
模拟意外的节点故障。

© www.soinside.com 2019 - 2024. All rights reserved.