gpt4 book ai didi

java - Dynamic Verticles - 如何为简单的 vert.x 游戏正确设计 vert.x 架构?

转载 作者:搜寻专家 更新时间:2023-11-01 01:42:36 27 4
gpt4 key购买 nike

我正在尝试为 Vert.x 开发一个概念验证——一个简单的实时浏览器游戏。

让我们想象一个类似于在线扑克的游戏 - 您有一个大厅,里面有许多您可以加入的现有游戏。您还可以创建一个新游戏(因此该大厅中的游戏数量是可变的)。在此之前,您有一个玩家连接的异步 http 服务器(集群)。特别是在特定游戏中,一切都是实时的,因此当玩家执行某些操作时,其他人会立即看到它,而无需刷新或定期的 ajax 轮询。

我在考虑如何将此功能分解为 Verticle。我的第一个想法是创建一个 Verticle 来处理 http 连接(并设置 http 服务器以将事件总线上的选定事件公开给 http 客户端),另一个 Verticle 代表游戏大厅,第三个 Verticle 代表实际游戏。大厅和游戏 Verticles 只会知道事件总线,它们根本不会处理 http。

我唯一不清楚的是这些 Verticles 的范围,尤其是游戏 Verticle,因为会有更多(动态数量的)游戏。默认情况下,您部署固定数量的特定 Verticle 实例(在简单​​的应用程序中,通常只有一个)。在这种情况下,这个 Verticle 必须在事件总线上监听游戏事件,确定该事件属于哪个游戏,反序列化游戏状态,更改它,序列化并再次存储。然后通知所有连接的玩家。

我想做的是拥有一个 Verticle-per-game-instance 范围。我的意思是,当在大厅创建新游戏时,大厅 Verticle 将启动游戏 Verticle 的新实例,并(以某种方式)传递给它一个新的游戏 ID(因此它只能绑定(bind)到该游戏 ID 的事件)这个游戏 Verticle 会将特定游戏的状态存储在内存中的实例变量中。当游戏结束时,Verticle 会指示连接的浏览器返回大厅并自行销毁。

我的想象方式是否正确?如果是这样,实现这一目标的最佳方法是什么?特别是关于动态创建和销毁 Verticle 实例的部分,将一些信息(ID 等...)传递给新创建的 Verticle?

一个奖励问题 - 我如何限制玩家只能收听(和发送)他所属游戏中的事件?这样他就不会影响其他游戏了。基本上与传统 Java Servlet/EE 应用程序中的 session /访问管理类似。

最佳答案

由于一段时间没有答案,我按照我最初在问题中描述的方式实现了它。它实际上进行得很顺利,演示代码可以在这里找到:https://github.com/michalboska/codingbeer-vertx

有一个 Verticle (GameLobbyVerticle) 为每个游戏启动一个新的 GameVerticle 实例。 GameVerticle 实例会记住(在成员变量中)与特定游戏实例相关的所有状态。

每个实例还创建一些 EventBus 端点(地址包含唯一的游戏 ID,这样每个 GameVerticle 实例都有自己唯一的事件总线端点)并监听系统消息、玩家的输入并向连接的玩家广播事件。每个实例都有“公共(public)队列”(WebSocket 客户端可通过事件总线桥访问)和“私有(private)队列”(无法通过桥访问,意味着我们不希望客户端欺骗的系统消息)。

动态部署和取消部署是通过 container.deployVerticle 和 container.undeployVerticle API 完成的。

关于java - Dynamic Verticles - 如何为简单的 vert.x 游戏正确设计 vert.x 架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27274649/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com