如果一个分布式P2P游戏可以处理100个连接,如何测试它



对于学校的一个大项目,我们制作了著名的beergame的P2P变体。GUI是在JavaFX中构建的。

我必须研究如何测试质量属性场景,如下所示:

100名玩家可以连接到游戏并进行游戏。

连接到游戏是通过GUI中的输入进行的,玩家需要在其中输入主机(游戏领导者)的IP地址(如果通过WAN,则带有端口)。我们正在实现RAFT作为状态一致性算法。

我做的第一步是研究创建100个客户端/计算机的最佳方法。我很快得出结论,Docker是唯一一款可以同时运行100个容器的软件。我现在真正的问题是如何在容器化环境中测试应用程序。

我考虑过了,测试在每个容器上玩游戏的流程的唯一真正方法是使用某种UI测试框架(如TestFX)浏览每个客户端的其他设置(每个客户端都需要使用不同的用户名加入游戏)的UI元素。

我找到了一个框架,可以让你测试UI,但它需要一个带有图形界面的主机操作系统才能运行(或者至少,这是我在互联网上短暂搜索的假设)。

有没有一种方法可以在IntellJ本身做到这一点。为游戏创建100个容器,每个容器都有一个唯一的IP地址,以便它们可以连接到游戏主机。

编辑@Karol Dowbecki

我们的通信方式是通过TCP/IP和UPnP每100毫秒发送一次序列化的appendentry(心跳),其中包含必须提交的更改(如果什么都没有发生,则appendentry没有日志条目)。因此,如果玩家执行了一个动作,它会向当时的领导者(游戏领导者/主机)发送一个AppendEntry,然后将其转发回所有其他节点,并等待大多数节点将其发送回(两阶段提交),然后将它添加到每个玩家的日志条目列表中(游戏的所有数据)。如果一个新玩家加入游戏,该玩家将在1个心跳中接收该游戏的所有logEntries,这是一个巨大的序列化json对象,之后它将从下到上重新计算步骤(logEntries),直到最后一个步骤,即玩家加入游戏。

那么,您的建议是捕获这些经过网络的序列化appendEntries,对它们进行反序列化,并将其与预期结果进行比较?如果我必须扫描每个AppendEntry,这将是非常困难的,因为每个客户端每秒向领导者发送10个AppendEntry(如果客户端是玩家),并向所有节点发送10个。

AppendEntries也会来回切换。每次玩家加入LogIndex(LogEntries的索引,基本上是发生了多少游戏状态变化的索引)时,都会增加1,这最终定义了游戏状态发生了多少变化。所以我并不是在来回发送静态信息。它随着每个加入的玩家而变化。此外,当玩家"断开连接"时,这会再次影响LogIndex。我必须能够跟踪100人加入游戏并仍然在那里的事实。

您不必创建100个游戏实例。这样做会有一个相当大的缺点,通过编写客户端UI脚本,很难判断瓶颈是在客户端还是在服务器中(协调省略问题)。

如果您了解所使用的有线协议以及预期的玩家行为,那么可以使用ApacheJMeter或Gatling创建测试计划。您可以使用Wireshark来检查和记录客户端使用的有线协议。

这不会创造一个真正的玩家体验,但只要你能重现最受欢迎的玩家的动作,就足以对服务器进行压力测试。提到的框架还将具有许多功能,可以帮助您发现问题,例如在一段时间内增加和减少连接,绘制结果等。

相关内容

最新更新