【问题标题】:Dynamic verticles - how to properly design vert.x architecture for a simple vert.x game?Dynamic verticles - 如何为简单的 vert.x 游戏正确设计 vert.x 架构?
【发布时间】:2014-12-03 14:50:09
【问题描述】:

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

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

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

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

相反,我想做的是为每个游戏实例设置一个垂直范围。我的意思是,当在大厅中创建一个新游戏时,大厅 Verticle 将启动游戏 Verticle 的一个新实例,向它(以某种方式)传递一个新游戏 ID(因此它可以绑定到仅针对该游戏 ID 的事件)并且这个游戏 Verticle 会将特定游戏的状态存储在它的实例变量中。游戏结束后,verticle 会指示连接的浏览器返回大厅并自行销毁。

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

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

【问题讨论】:

    标签: java architecture real-time vert.x


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      相关资源
      最近更新 更多