WebSockets是否真的应该由Web服务器处理?

16

目前WebSocket标准尚未得到批准,但是从草案中可以看出,该技术旨在在Web服务器中实现。pywebsocket实现了一个WebSocket服务器,可以作为独立的服务器或作为Apache插件加载。

那么我想知道的是:WebSocket的理想用途是什么?使用专用的WebSocket服务器实现服务是否有意义,还是应该重新考虑在WebSocket-enabled Web服务器上运行?

1个回答

30

WebSocket协议设计时考虑了三种模型:

  • WebSocket服务器完全独立于任何Web服务器运行。
  • WebSocket服务器与Web服务器分开运行,但流量通过代理从Web服务器传输到WebSocket服务器(允许WebSocket和HTTP流量共存于同一端口)。
  • WebSocket服务器作为Web服务器中的插件运行。

选择的模型取决于您正在构建的应用程序以及可能限制您选择的其他约束条件。

例如,如果您的应用程序将从单个Web服务器提供服务,并且WebSocket连接始终返回到同一服务器,则在Web服务器中仅作为插件/模块运行WebSocket服务器可能是有意义的。

另一方面,如果您拥有通用的WebSocket服务可供许多不同的网站使用(例如,您可以从WebSocket服务器提供连续的低延迟流量更新),则可能需要将WebSocket服务器与任何Web服务器分开运行。

基本上,您的WebSocket服务与Web服务之间的集成越紧密,就越有可能将它们一起运行并在同一端口上运行。

还有一些限制可能会强制执行某个模型:

  • 如果您控制服务器但不控制入站防火墙规则,则只能将WebSocket服务器运行在与HTTP/ HTTPS服务器相同的端口(例如80和443)。在这种情况下,您必须使用Web服务器插件或代理到实际的WebSocket服务器。
  • 另一方面,如果您没有超级用户权限访问运行WebSocket服务器的服务器,则通常无法使用80和443端口(1024以下是特权端口范围),在这种情况下,无论HTTP/S和WebSocket服务器是否在同一端口上运行都没有关系。
  • 如果您在Web服务器中使用基于cookie的身份验证(例如OAuth)并希望重用此身份验证来建立WebSocket连接,则可能需要将WebSocket服务器与Web服务器一起运行(集成紧密的特殊情况)。

2
@kanaka 再次给出了很棒的答案。就像我喜欢在编写代码时遵循关注点分离的思想一样,我也喜欢将这种思想延伸到架构中。在某些情况下,插件模型是可以接受的,但是当涉及构建更大型的应用程序或者消息速率达到一定水平时,将 Web 服务器(用于 Web 应用程序功能)和 WebSocket 服务器(用于实时双向功能)分离是一个好主意。这是我对所有使用 node.js 和 socket.io 构建的应用程序的担忧。 - leggetter
2
@leggetter,另一方面,如果Web服务和WebSocket是同一个关注点的一部分,则功能内聚原则适用,并且会推动将它们保持在一起。例如,如果初始页面加载是通过HTTPS完成的,然后使用通过WebSockets发送的数据实时更新页面的某些部分,并且新数据与最初通过HTTPS提供的内容密切相关(并且具有相同的访问控制等),则将Web服务和WebSockets作为一个内聚单元可能更有意义。 - kanaka
1
同意。一些架构正在朝这个方向发展。其中一个可能是单页式应用程序。我还没有在这个领域做过很多研究,但我认为SocketStream可能符合要求,尽管他们实际上允许您交换底层通信机制(socket.io/Pusher)。 - leggetter
为什么人们通常使用像Pusher或Ably这样的外部服务,而不是部署自己的WebSocket服务器? - Amin

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