我想使用运行在Kubernetes上的Websockets构建一个消息应用程序,并想知道如何解决一些问题.
上下文
所以,假设你正在构建一个聊天应用.您的聊天应用程序需要经常与后端通信才能工作(例如接收发送的消息、发送消息等),因此假设后端将使用Node构建&前端是使用电子构建的,我认为在这种情况下使用Web套接字是有意义的。
问题1-负载平衡
您的Web套接字服务器的性能很差,所以您想要修复它。在这个场景中,我认为创建Web服务器的几个实例是有意义的&在它们之间均衡传入的流量(负载均衡器)。对于HTTP/HTTPS请求,这是合理的,请求被重定向的服务器实例并不重要,因为它是“一次”请求,但是Web套接字是不同的,如果客户端连接到实例3,则如果传入请求的其余部分进入实例3(因为服务器可能保持客户端状态(比如客户机是否经过身份验证),则会有意义。
问题2-关注点除法
随着聊天应用程序变得越来越大,Web套接字服务器需要处理的事情越来越多.所以把它分成不同的问题是有意义的.(例如消息传递、用户身份验证等)但假设必须保持客户端状态,这些不同的关注点如何才能知道该状态?(关注事项之间的共同状态)
问题3-事件发射
您实现了一个事件,每次用户发送消息时,都会为每个客户端触发该事件。在有几个例子的情况下,如何做到这一点?(例如,客户机1连接到Web套接字服务器实例1,客户端1发送消息.客户机2连接到Web套接字服务器实例2&需要为客户端触发该事件.)
发布于 2019-11-29 11:44:46
Websockets:一个请求-长时间运行的连接
您有关负载平衡的问题将得到处理。客户端将被负载平衡到不同的实例。当使用Websockets时,客户端执行one请求连接,然后将该TCP连接保持到后端,并在同一连接上发送多条消息。
分离关注点
更多事情需要由网络套接字服务器来处理.所以把它分成不同的问题是有意义的.(例如消息传递、用户身份验证等)
是的,你应该做分离关注点。例如,您可以让一个身份验证服务执行OpenID连接身份验证,并且用户可以在连接Websockets或发送其他API请求时使用访问令牌。
web客户端通常允许最多两个到同一个域的Websocket连接,所以最好只有一个Websocket服务。但是您可以使用某种消息代理,例如基于Websocket的MQTT并将消息路由到不同的服务。
发出讯息
您实现了一个事件,每次用户发送消息时,都会为每个客户端触发该事件。
如果您使用我前面描述的message,所有客户端都可以订阅通道,并且当您发布消息时,它将被路由到所有订阅者。
https://stackoverflow.com/questions/59109860
复制