开发者社区 > 云原生 > 容器服务 > 正文

如何路由到服务中的特定容器

我有一个基于微服务架构的多人游戏,我试图想象如何水平扩展。它目前在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 ||  |
          |  |-----------|  |
          |  +-----------+  |
          |                 |
          +-----------------+

拥有上述架构将大大降低应用程序的复杂性。问题是必须识别来自不同客户端的连接并将其路由到正确的容器。我还没有办法做到这一点。是否可以使用什么工具路由到服务中的特定容器?

在我的场景中使用的正确方法是什么?此外,如果手动将请求路由到目标容器不是一个可行的选项,那么构建此服务的正确方法是什么?
"

展开
收起
k8s小能手 2018-12-14 14:46:23 2648 0
1 条回答
写回答
取消 提交回答
  • 整合最优质的专家资源和技术资料,问答解疑

    这可以通过第三方库(如Istio)的帮助来实现。

    https://istio.io/docs/tasks/traffic-management/request-routing/

    您必须根据您的配置定义VirtualServices。对于您的游戏服务,您应该使用StatefulSet,通过这样做,您将能够识别路由您的流量所需的服务。

    2019-07-17 23:20:57
    赞同 展开评论 打赏

国内唯一 Forrester 公共云容器平台领导者象限。

相关电子书

更多
阿里云文件存储 NAS 在容器场景的最佳实践 立即下载
何种数据存储才能助力容器计算 立即下载
《容器网络文件系统CNFS》 立即下载