我有一个基于微服务架构的多人游戏,我试图想象如何水平扩展。它目前在Docker Swarm中精心策划,但我正在考虑转移到Kubernetes。
以下是有关游戏的详细信息:
这是一张带牌的桌面游戏
多个玩家坐在同一张桌子上并互相玩耍
因为它现在有效,我有一个负责所有表的容器。当玩家加入桌子时,他坐下来建立一个连接到该特定容器的websocket连接。所有桌子上的所有玩家都连接到同一个容器。游戏逻辑和游戏事件可以轻松推送给所有客户。
它就是这样的。位于同一个表中的所有客户端都连接到同一个容器,因此可以轻松地来回推送动态游戏数据。
Client 1+
| Container A +Client 3
| +---------------+ |
+---> |---------------| <----+
|| Table 1 || |Client 4
Client 2+----> |---------------| <----+
|---------------|
|| Table 2 ||
|---------------|
|---------------|
|| Table 3 ||
+---------------+
| . |
| . |
| . |
+---------------+
但是,当您尝试通过增加容器数量来扩展此问题时,您遇到的问题是位于同一个表上的客户端连接到不同的容器。这意味着必须在位于这些容器之间的数据库中更新每个游戏动作和所有共享动态游戏数据。然而,这变得越来越难以编写和维护:
Container 1 Container 2
Client 1+ +-------------+ +-------------+ +Client 3
+----> |-------------| |-------------| <------+
|| Table 1 || || Table 1 ||
+----> |-------------| |-------------| <------+Client 4
Cleint 2+ |-------------| |-------------|
|| Table 2 || || Table 2 ||
+-------------+ +-------------+
| | | |
| | | |
| | | |
+----+--------+ +-----------+-+
| |
| |
| |
| +------------------------+ |
+> | Redis DB | <+
+------------------------+
而不是像这样设计组件,以某种方式将必须坐在同一个表上的客户端路由到同一个容器会更加简单。这是为了避免将每个玩家动作和每个公共表更新写入数据库。它看起来像这样:
Game Service
+-----------------+
Client 1+ | | + Client 3
| | Container 1 | |
+------> +-----------+ <-------+
| |-----------| |
Client 2 +-----> || Table 1 || <-------+ Client 4
| |-----------| |
| |-----------| |
| || Table 2 || |
| |-----------| |
| +-----------+ |
| |
| Container 2 |
| +-----------+ |
| |-----------| |
| || Table 3 || |
| |-----------| |
| |-----------| |
| || Table 4 || |
| |-----------| |
| +-----------+ |
| |
+-----------------+
拥有上述架构将大大降低应用程序的复杂性。问题是必须识别来自不同客户端的连接并将其路由到正确的容器。我还没有办法做到这一点。是否可以使用什么工具路由到服务中的特定容器?
在我的场景中使用的正确方法是什么?此外,如果手动将请求路由到目标容器不是一个可行的选项,那么构建此服务的正确方法是什么?
"
这可以通过第三方库(如Istio)的帮助来实现。
https://istio.io/docs/tasks/traffic-management/request-routing/
您必须根据您的配置定义VirtualServices。对于您的游戏服务,您应该使用StatefulSet,通过这样做,您将能够识别路由您的流量所需的服务。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。