所以我使用socket.io
在我的websockets应用程序中建立了一个实时聊天室。
但我还有一个辅助功能,需要实时聊天功能unrelated
。所以我想知道我应该在不同的端口上运行一个单独的应用程序吗?
这是否在性能和可扩展性方面提供了任何技术优势?或者网站应该使用一个处理所有Web套接字数据的应用程序。
我不是服务器方面的专家,所以我想知道在技术方面是否有正确的方法。
请注意:我不是只是在寻找意见,而只是分享过度集中的利弊的事实真相。
假设有任何利弊。缺少关于websocket框架的文档并没有真正详细说明这一特定方面。
答案 0 :(得分:1)
问:所以我想知道我应该在不同的端口上运行一个单独的应用程序吗?
简短的回答是肯定的,因为不相关的服务可能期望不同的增长模式,因此您希望尽可能多地分离功能,以便您可以在不同端口上的同一个盒子上部署一个或多个服务。
更长的答案是你应该这样做以在内部分离内容,但如果你能让你的客户端通过端口80或443访问所有服务肯定会很好 - 使用WebSockets你可以使用WebSocket URL来区分服务并共享同一个端口。
要实现此目的,您可以引入支持端口共享的WebSocket网关应用程序。然后,您的客户端可以为每个WebSocket服务命中端口80,但您可以为不同的应用程序使用不同的端口。
如果您的WebSocket网关应用程序支持WebSockets的端口共享,则意味着您的服务器在具有不同路径的同一端口上接受...例如。
ws://example.com:80/chat_service
ws://example.com:80/unrelated_service
一般来说,为了在整个互联网上获得流量,最好使用端口80和443,如果可以的话,端口共享,以便在途中穿过任意数量的中间代理/防火墙。
问:这是否在性能和可扩展性方面提供了任何技术优势?或者网站是否应该使用一个处理所有Web套接字数据的应用程序?
就像应用程序服务器一样,没有理由为什么一个WebSocket服务器不应该为多个不同的Web应用程序提供服务。如果您希望应用程序具有不同的增长率,则应将它们分成单独的Web应用程序,共享库。
为了提高性能,如果您的应用程序通过WebSocket将大量数据推送到客户端,您可能需要考虑所有服务的总网络接口流量,以确保不会超出网卡的带宽。这与您的单独端口问题无关。
对于可伸缩性,如果功能不相关,则可以更加可扩展,以保持独立并在必要时共享库。这是因为您可能会遇到不相关服务的不同增长级别。
我建议为客户端保持简单并为服务器提供可扩展性的组合如下:
使用可以端口共享的WebSocket网关。所有客户都可以使用80或443分开的路径。
将WebSocket网关配置为通过单独端口上的单独应用程序进行代理,以允许服务器独立扩展。
+----------+
+------| App:Chat |
+--------+ +---------+ | +----------+
| Client |-----internet------| gateway |------+ (port 8081)
+--------+ +---------+ |
(port80) | +----------+
+------| App:App2 |
+----------+
(port 8082)
Kaazing WebSocket gateway等网关解决方案提供此类功能,一次最多可免费使用50个连接。
(免责声明:我曾经为Kaazing担任服务器工程师。)
答案 1 :(得分:0)
我没有给你一个明确的答案,但有两件事可能会有所帮助
1)O'Reilly有一本关于浏览器网络的好书,你可以在网上免费阅读,以了解我们所知道的互联网系列管道是如何工作的。这是关于WebSockets的章节(在本书的后半部分)http://chimera.labs.oreilly.com/books/1230000000545/ch17.html。我只是浏览了一下,发现了一个关于多路复用的段落,这段似乎与你的研究有关。
2)为什么你可能希望拥有单独的连接而想到的一个原因是它们充当FIFO队列,因此如果你的第二个用例涉及大的有效负载,那么聊天会话将在该有效负载传输时基本上挂起。当然,还有其他原因可以采用这种方式或其他方式,希望其他人可以给你一个更完整的答案。