【发布时间】: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