Websockets + Spring boot + Kubernetes

6

我正在创建一个Facebook多人游戏,目前正在评估我的技术栈。

我的游戏需要使用Websockets,我想使用Spring Boot。现在,我找不到有关在Kubernetes中正常工作的Websocket服务器的信息?例如,如果我在Kubernetes Pod中部署5个服务器实例,负载平衡/转发是否会正确地处理浏览器中加载的游戏客户端和Kubernetes中的服务器之间的Websockets,并且是否需要进行任何其他工作以启用它?每个Pod /服务器都将是无状态的,每个玩家的当前游戏信息将存储/读取自Redis或其他内存数据库。

如果这样不能正常工作,我该如何解决并仍然使用Kubernetes?也许只需向堆栈添加一个RabbitMQ实例来处理Websockets?


2
Websockets的“问题”在于它们不易负载均衡,因为连接是持久的。如果您有3个服务器,并且在连接时您轮流将用户连接到哪个服务器,则最初会在服务器上拥有相等的负载。随着用户断开连接,您将开始出现不平等的负载。根据您的系统设计,这可能不是一个问题。使用队列服务器来支持套接字的想法很好,但也要考虑使用redis。 - Leon
K8S只是编排工具。它的网络运行在传输层(TCP/UDP)或者如果使用Ingress,则运行在HTTP上。因此,Kubernetes不会有任何问题。然而,正如@Leon在评论中所说,您需要仔细考虑WebSocket连接的负载均衡和分发。 - Yanislav Kornev
1个回答

0

解决这个问题的一种适当方式是使用“粘性会话”。这意味着用户根据cookie的设置被固定在特定的pod上。

以下是配置Ingress资源对象使用粘性会话的示例:

#
# https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/affinity/cookie
#
apiVersion: extensions/v1beta1  
kind: Ingress  
metadata:  
  name: nginx-test-sticky
  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/affinity: "cookie"
    ingress.kubernetes.io/session-cookie-name: "route"
    ingress.kubernetes.io/session-cookie-hash: "sha1"
spec:
  rules:
  - host: $HOST
    http:
      paths:
      - path: /
        backend:
          serviceName: $SERVICE_NAME
          servicePort: $SERVICE_PORT

现在说到这一点,处理这个问题的正确方式是使用消息代理或支持集群的websocket实现,例如socketcluster(https://socketcluster.io)。


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