Mic*_*ska 4 java architecture real-time vert.x
我正在尝试为Vert.x开发一个概念验证 - 一个简单的实时浏览器游戏.
让我们想象一下类似于在线扑克的游戏 - 你有一个大厅,你可以加入许多现有的游戏.您还可以创建一个新游戏(因此该游说中的游戏数量是可变的).在此之前,您有一个玩家连接的异步http服务器(集群).特别是在特定游戏中,一切都是实时的,所以当玩家执行某些动作时,其他人立即看到它而不刷新或定期进行ajax轮询.
我在想如何将这个功能分解为Verticle.我的第一个想法是创建一个Verticle来处理http连接(并设置http服务器以将事件总线上的选定事件暴露给http客户端),另一个Verticle表示游戏大厅和第三个Verticle来表示实际游戏.大厅和游戏Verticle只会知道事件总线,他们根本不会处理http.
我唯一不清楚的是这些Verticle的范围,特别是游戏Verticle,因为会有更多(动态数量)游戏.默认情况下,您部署固定数量的特定Verticle实例(在简单的应用程序中,通常只有一个).在这种情况下,这一个Verticle必须在事件总线上监听游戏事件,决定该事件属于哪个游戏,反序列化游戏状态,更改它,序列化并再次存储.然后通知所有连接的玩家.
我想做的是,每个游戏实例范围都有一个Verticle.我的意思是,当在大厅中创建新游戏时,大厅Verticle将启动游戏Verticle的新实例,以某种方式将其传递给新游戏ID(因此它可以仅绑定到该游戏ID的事件)并且这个游戏Verticle将在其实例变量中存储该特定游戏在内存中的状态.当游戏结束时,Verticle会指示连接的浏览器返回大厅并自行销毁.
我的想象方式是正确的吗?如果是这样,实现这一目标的最佳方法是什么?特别是关于动态创建和销毁Verticle实例的部分,将一些信息(ID等)传递给新创建的Verticle?
一个额外的问题 - 如何限制玩家只能从他所属的游戏中收听(和发送)事件?这样他就不会影响其他游戏.与传统Java Servlet/EE应用程序中的会话/访问管理基本类似.
由于一段时间没有答案,我按照我最初在问题中描述的方式实现了它.它实际上很顺利,演示代码可以在这里找到:https://github.com/michalboska/codingbeer-vertx
有一个Verticle(GameLobbyVerticle)为每个游戏启动GameVerticle的新实例.GameVerticle实例记住(在成员变量中)与特定游戏实例相关的所有状态.
每个实例也创造了几个EventBus端点(地址包含独特的游戏ID,这样每个GameVerticle实例都有自己独特的eventbus端点)和听系统消息,玩家的输入,广播事件连接的球员.每个实例都有"公共队列"(WebSocket客户端可通过eventbus桥访问)和"私有队列"(通过网桥无法访问,用于我们不希望客户端欺骗的系统消息).
使用container.deployVerticle和container.undeployVerticle API完成动态部署和取消部署.