我面临建筑假设的问题。小背景: 我正在编写一个游戏服务器,可以为指定的玩家创建房间,并在该房间内(websocket),服务器正在监听任何事件(例如玩家丢失,互联网断开连接等)。整体性是可扩展的,因此在一些LB监督下将部署多个Tomcat节点。 目前我已经把这个过程想象成(记得关于tomcat集群):
客户端通过REST API登录GameServer,会话保存在所有节点之间共享的RedisDB中。服务器返回HTTP 200。
客户已登录系统,他决定搜索游戏。调用“/ search / game”端点。
2.1。系统处理用户请求并将播放器添加到临时队列,即RedisDB(下一个或同一个实例现在不确定),并将HTTP 200返回给客户端。
一个特定节点上的调度程序每10-20秒运行一次。看看RedisDB是否有任何记录,如果是真的,那么服务器会保持并置玩家并为他们创建游戏室,直到RedisDB为空或者有奇怪的玩家。
我不确定如何在websocket中并置特定的播放器并使其对其他节点可见。我已经google了一段时间,并在
上找到了一个熟悉的例子stack:Spring Websocket in a tomcat cluster
用户Thanh Nguyen Van提到了两种处理多个tomcat实例上的websockets流量的方法,因此我决定使用Apache ActiveMq JMS和Apache Camel作为处理websockets流量解决方案。
我已经在沙盒应用程序上成功实现了它,其中3个不同的用户可以登录系统并相互发送私人消息。整体使用ActiveMq
,Camel
,STOMP
,SockJS
和Spring Boot
实施。
足够公平......但这是我坚持的部分。我觉得我已经拥有了我需要的所有积木,但我不能把它们放在一起。
首先,我不确定给定的过程是否适合所提出的问题。我正在考虑points 2 and 3
而不是调用REST endpoint
并将玩家添加到RedisDB
作为队列缓冲区,也许我应该在玩家之间创建一个websocket(但玩家如何知道游戏websocket端点?另一个临时缓冲队列?)以及如何检测来自客户端的任何传入事件,例如GameRoom套接字中的互联网断开/游戏松动?或者我可能从错误的方面面临问题,除了Spring生态系统中的ActiveMQ
和Apache Camel
之外,还有更好的工具来处理多个tomcat实例上的websocket流量?