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

标签 java architecture real-time vert.x

我正在尝试为 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/

相关文章:

node.js - 如何防止 node.js 中的流式 http/s 服务器内存泄漏?

Java编译缺少return语句错误

architecture - 用例图中的CRUD?

android - 本地移动应用程序的实时服务器更新

php - 数据处理的设计模式? (MVC 替代方案)

asp.net-mvc-3 - ASP.Net MVC 架构 - 绕过 Controller 层?

python - 通过单击复平面输入复数

java - 无法使用 File.list() 读取目录

java - 如何获取单选按钮的 ID 并转换为字符串?

java - 如何让多个客户端连接到java服务器