Websocket连接应该是常规的还是特定的?
例如如果我正在建立一个股票交易系统,那么我可能会拥有实时的股价,实时的交易信息,对订单簿的实时更新,或者是实时聊天,以使交易者能够合谋和操纵市场。我应该使用一个websocket来处理上述所有数据流,还是最好使用多个websocket来处理不同的主题?
答案 0 :(得分:0)
这一切都取决于。让我们看看您的选择,假设您的股票交易员,聊天和订单簿都是作为单独的服务器/微服务构建的。
您可以让每个服务器运行自己的WebSocket服务器,以流式传输与该服务器相关的事件。
专业人士
这是一种简单的方法。每个服务器都是独立的。
缺点
缩放不佳。打开的TCP连接的数量将随着并发用户数量的增加而付出一定的代价。当您需要复制服务器以实现冗余时,由于所有副本都需要广播相同的事件,因此增加了复杂性。您还必须构建自己的后备,以便从丢失的WebSocket连接中恢复过期的客户端数据。需要在客户端上为每种事件类型创建事件处理程序。如果通过HTTP获取初始数据,而事件是通过单独的WebSocket连接发送的,则可能必须添加版本处理以防止数据争用。
有许多可用的发布/订阅解决方案,例如Pusher,PubNub或SocketCluster。通常的想法是,您的服务器将主题/主题上的事件发布到消息队列中,WebSocket服务器会监听该消息队列,并将事件转发到连接的客户端。
专业人士
扩展更容易。该服务器只需要发送一条消息,而随着并发用户数量的增加,您可以添加更多的WebSocket服务器。
缺点
您很可能仍必须处理断开连接期间丢失事件的恢复。仍然可能需要版本控制来处理数据争用。并且仍然需要为每种类型的事件编写处理程序。
这部分更加无耻,因为它涵盖了Resgate,这是我参与过的一个开源项目。但这也适用于诸如Firebase之类的解决方案。术语“实时API网关”是指一个 API网关,它不仅可以处理HTTP请求,而且还可以通过WebSocket进行双向操作。
对于Web客户端,您很少对事件感兴趣-对状态更改感兴趣。事件只是描述更改的手段。通过网关获取数据,它可以跟踪客户端当前对哪些资源感兴趣。然后,只要使用数据,它就可以使客户端保持最新状态。
专业人士
缩放良好。客户端不需要事件处理的自定义代码,因为系统会为您更新客户端数据。处理从丢失的连接中恢复。没有数据竞赛。操作简单。
缺点
主要用于客户端渲染的网站(使用React,Vue,Angular等),因为它无法与带有服务器渲染页面的网站一起使用。难以应用于已经存在的HTTP API。