如何在多个服务器实例中运行WebSockets?

16

在扩展方面,运行多个HTTP服务器实例非常有用。

然而,似乎这在WebSockets上不起作用,因为每个服务器实例都会有自己的客户端连接集。

如果所有服务器实例都需要共享一个公共连接集,则如何在多个服务器实例上运行WebSockets?


1
考虑在服务器前运行粘性会话代理,而不是让所有打开的客户端连接共享在所有服务器之间。 - matanster
3个回答

2

我正在寻找开发websocket应用程序的方法,以便随时扩展,但似乎没有太多文章讨论这个问题。

方案1 推荐的方法是使用Redis缓存,就像Heroku建议的那样,使用Service Bus或将其存储到数据库中,就像SignalR的Scaleout中提到的3种方法。然而,有一个问题,必须存在轻微的延迟,因为为了让第二个实例知道,调度程序或后台工作者/服务应该持续运行以检测缓存/队列/数据库中的新更改。

方案2 在我的情况下,我想要高频率几乎是实时的。因此,它应该在实例之间具有持久连接。但是挑战在于,我们无法在无状态的Web服务器之间进行连接。

因此,我们仍然需要中间长时间运行的后台/工作服务,并从代码实现自己的net/socket/TCP并维护连接池,但这不是一个容易的任务。

我考虑使用服务器上的Websocket客户端(用于此服务),因此与客户端和实例之间通信的模式几乎相同。请参见:1 2。剩下的一件事是在每个实例的启动/关闭时将实例IP / URL更新到分布式缓存或数据库中。

最后一个选择是探索新的WebRTC


1
我还没有尝试过,但考虑将连接设置为粘性可能会解决问题。您可以在负载均衡器中设置此设置。

-3
到目前为止,我发现最好的解决方案是http://pusher.com/
易于设置。文档很棒。

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