动态垂直 - 如何为简单的vert.x游戏正确设计vert.x架构?

4

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

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

我在思考如何将这个功能分解成verticles。我的第一个想法是创建一个verticle来处理http连接(并设置http服务器将选定的事件公开到事件总线以供http客户端使用),另一个verticle来表示游戏大厅,第三个verticle来表示实际游戏。 大厅和游戏verticles只会知道事件总线,它们不会处理http。

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

相反,我想做的是每个游戏实例都有一个verticle,这是我的想象方式是否正确?如果是,最好的方法是什么?特别是动态创建和销毁verticle实例以及将一些信息(ID等)传递给新创建的verticle的部分如何实现?

附加问题-如何限制玩家只能听取来自他所属的游戏的事件(并发送)呢?使他不会影响其他游戏。 基本上与传统Java Servlet / EE应用程序中的会话/访问管理类似。

1个回答

8
由于一段时间没有回答,我按照最初在问题中描述的方式实现了它。 实际上,它进展得相当顺利,演示代码可以在这里找到:https://github.com/michalboska/codingbeer-vertx 有一个Verticle(GameLobbyVerticle)为每个游戏启动一个新的GameVerticle实例。 GameVerticle实例通过成员变量记住特定游戏实例的所有状态。 每个实例还创建了一些EventBus端点(地址包含唯一的游戏ID,这样每个GameVerticle实例都有自己独特的eventbus端点),并监听系统消息,玩家输入并将事件广播给已连接的玩家。每个实例都有“公共队列”(通过eventbus桥接由WebSocket客户端访问)和“私有队列”(不可通过桥接访问,用于我们不希望客户端欺骗的系统消息)。
容器.deployVerticle和容器.undeployVerticle API执行动态部署和未部署。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接