我有几个在localhost上运行的分布式应用程序实例;每个实例都通过某些端口与其他实例进行通信,所有实例共同构成一个整体。 (我实际上是在谈论ZooKeeper,在Linux上运行)
现在我想编写单元测试来模拟整体分区 例如。我有5个实例,我想将它们分成两组,每组3和2,这样一个组中的实例就无法与另一个组中的实例进行通信。当3台机器在一个数据中心,2台机器在另一台数据中心,数据中心被分区时,它将模拟真实情况。
问题主要是使套接字选择性地工作:与一个套接字说话,但不要与另一个套接字说话。我想到的一个解决方案是抽象通信层并将测试规则注入其中(以“如果我是来自一个组的实例我不允许与另一个组的实例对话 - 关闭套接字”的形式或忽略数据或其他任何“)。
但也许存在一些工具,可能是一些测试框架? 一般来说,您如何在分布式应用程序中测试此类案例?
附:虽然问题被标记为“java”(因为ZooKeeper是用Java编写的),但是听到任何其他语言的解决方案或者语言独立的解决方案 - 可能是一些linux大师技巧。
答案 0 :(得分:3)
也许这个答案可以节省几个小时的谷歌搜索。
Linux有一个非常好的防火墙实用程序iptables
。它允许您阻止进程之间的通信,如下所示:
iptables -A INPUT -p tcp --sport <source port> --dport <dest port> -j DROP
虽然不是一个完整的单元测试框架,但在我的情况下,这有助于手动测试。
答案 1 :(得分:1)
我很想说这是集成测试而不是单元测试(或者对这样的事情进行适当的单元测试真的很难)。
我需要几次测试这些东西,我已经使用虚拟化(例如VMWare)来测试系统。您可以从运行多个映像的一台物理计算机上测试节点的重启,关闭等。
答案 2 :(得分:0)
过去我断开了网线。您始终可以通过操作系统禁用网络接口。
答案 3 :(得分:0)
尝试封锁。 https://github.com/dcm-oss/blockade
这是一个基于docker的工具,可以模拟您想要的行为。仅在Linux上运行,但如果您想从另一个操作系统运行它,则会有一个用于安装的Vagrant文件。