在 Kubernetes 上使用 Websockets 构建消息应用程序

Architect a message application using Websockets on Kubernetes

我想在 Kubernetes 上使用 Websockets 运行 构建一个消息应用程序,并且想知道如何解决一些问题...

上下文

因此,假设您正在构建一个聊天应用程序...您的聊天应用程序需要经常与后端通信才能工作(例如接收发送的消息、发送消息等),因此假设后端会使用 Node 构建并且前端使用 Electron 构建,我认为在这种情况下使用 Web-sockets 是有意义的。

问题 1 - 负载平衡

您的 Web 套接字服务器性能不佳,因此您想修复它。在这种情况下,我认为制作 Web 套接字服务器的多个实例并平均平衡它们之间的传入流量(负载平衡器)是有意义的。对于 HTTP/HTTPS 请求,这是有意义的,请求被重定向到哪个服务器实例并不重要,因为它是一个 "one time" 请求,但是 Web 套接字是不同的,如果客户端连接到实例 3,那将是有意义的如果其余传入请求进入实例 3(因为服务器可能会保持客户端状态(例如客户端是否经过身份验证))

问题 2 - 按关注点划分

随着聊天应用程序变得越来越大,越来越多的事情需要由 Web 套接字服务器处理......所以将它分成不同的关注点......(例如消息传递,用户身份验证等)但是假设必须保留客户端状态,那么这些不同的关注点如何知道该状态? (关注点之间的共享状态)

问题 3 - 事件发射

您为每个客户端实现了一个事件,每次用户发送消息时都会触发该事件。当有多个实例时如何实现? (例如,客户端 1 连接到 Web 套接字服务器实例 1,客户端 1 发送消息...客户端 2 连接到 Web 套接字服务器实例 2 并且需要为客户端触发事件...)

Websockets:一个请求 - 长运行 连接

您关于负载平衡的问题将得到处理。客户端将负载平衡到不同的实例。使用 Websockets 时,客户端会一个请求 进行连接,然后它们会保持与后端的 TCP 连接,并在相同的连接 上发送多条消息。

关注点分离

more things need to be handled by the Web-socket servers... So it would make sense to split it into different concerns... (e.g. messaging, user authentication etc.)

是的,您应该进行 separation of concerns. E.g. you could have one authentication service do a OpenID Connect 身份验证,并且用户可以在连接时使用 访问令牌 Websockets 或发送其他 API 请求。

Web 客户端通常允许最多两个 Websocket 连接到同一个域,因此最好只有一个 Websocket 服务。但是你可以使用某种消息代理,例如MQTT over Websocket 并将消息路由到不同的服务。

正在发送消息

You implemented an event which fires, for each client, every time a user sends a message.

如果您使用我上面描述的消息代理,所有客户端都可以订阅频道,当您发布一条消息,它将被路由到所有订阅者。