WebSockets的.丢失互联网,保持活跃的消息,应用程序架构等

Dmi*_*rin 17 javascript html5 xmlhttprequest long-polling websocket

嗯,这里有关于websockets的信息.技术本身是惊人的,这一点毫无疑问.在我开始在我的应用程序中使用它们之前,我只想让社区回答以下问题:

"...为了保持存在,应用程序可以在WebSocket上发送保持活动的消息,以防止它因空闲超时而被关闭......"

"...理想情况下,WebSocket的未来版本将支持超时发现,因此它可以告诉应用程序保持活动消息的时间......"

  1. 感觉就像似曾相识.之前我们不得不一次轮询服务器%period_time%以获取所需的更新信息.对于websockets,我们必须使用keep-alive消息在%period_time%上轮询websocket服务器,以确保Internet连接仍处于活动状态/ websocket服务器仍在工作.有什么好处?

    关于这些保持活跃的消息还有另外一件事.Websocket协议的优点是使用比HTTP(S)更少的流量.如果我们发送保持活跃的消息,似乎流量优势消失了.或者可能不是?

  2. 如果我使用websockets,我应该如何处理我的应用程序中的互联网丢失?我的意思是当互联网连接突然丢失时的真实情况(我的意思是没有发生"navigator.offline"事件).我应该使用某种setTimeout函数来查找保持活动消息,还是有更好的方法来处理这种情况?

  3. REST让我们清楚地了解应用程序应该如何工作以及请求应该如何.在websocket驱动的应用程序中执行此操作的最佳方法是什么?我应该用request.action字段(例如)JSON编码的消息吗?应用程序应该如何执行PUT请求?REST模型中有URL资源来处理这个问题,所以我应该使用这些方法的组合,还是可以简化?

kan*_*aka 16

我认为通过了解WebSockets的真正目的可以澄清大多数问题.WebSockets主要不是为了取代任何现有的并且运行良好的东西.例如,它不是设计成AJAX的低开销版本.目的是在浏览器和服务器之间提供双向,低延迟,全双工的通信通道.它的真正目的是启用Web应用程序的新域或改进滥用HTTP以实现双向通信的当前域.

考虑到这一点,让我评论你的要点:

  1. 定期WebSockets ping/pong消息的目的有两个:保持通道不被TCP超时关闭,以及更快地检测通道何时关闭(这在历史上是TCP的弱点).HTTP/AJAX轮询的目的是绕过HTTP不是双向的事实(即客户端轮询以使服务器有机会发回数据).WebSocket ping/pong帧通常为2个字节长.HTTP/AJAX轮询需要完整的标头,cookie等,每个请求/响应很容易超过一千字节.即使您通过WebSockets每秒发送一次ping/pong 10次,您仍然不太可能每2秒与HTTP/AJAX轮询的开销进行比较.但请注意,应用程序无法发送ping/pong消息.这是在浏览器和服务器之间.

  2. 如果您丢失了Internet连接,您将收到一个onclose事件.如果您的浏览器没有为您执行ping/pong消息,那么在网络连接断开后尝试发送消息之前,您可能不会收到onclose.

  3. 我不会用WebSockets替换有效的RESTful服务.你可能会做很多映射工作,但可能收效甚微(同样,WebSockets并不是为了取代已经运行良好的东西).我可以想象你可能有两种组合的情况:用于状态转移的REST,用于事件通知的WebSockets.例如,服务器发送一条WebSocket消息,指示"已更改的内容",该消息触发客户端执行REST请求以找出更改.

更新:

澄清:你可以通过WebSockets做REST,但它在哲学上是不匹配的.REST是一种架构风格,对底层传输系统没有任何意见.它是一种受约束的体系结构:"客户端 - 服务器","无状态","可缓存","分层系统","按需代码"和"统一接口".WebSockets不受这些限制; 它是一种通用的消息传输系统.您可以将WebSockets限制为RESTful,但在您非常了解REST和WebSockets之前不要这样做,并且可以确定何时正确执行此操作.


小智 5

“请停止说普通话,说说除了聊天和证券交易所应用程序之外,你知道多少在生产就绪应用程序中使用 websockets 的实际案例?”

我在太空飞船动作游戏中使用 websockets 来支持多人游戏。Websockets 是一项非常酷的技术,但我也发现它令人沮丧地不可预测 - 这可能只是我是一个新手并且犯了一些错误。如果我解决了更多的错误,我可能会放一个链接,但它崩溃太多了,所以我现在没有在实时服务器上。

我想这将使它成为一个非生产就绪的应用程序,但假设我不明白为什么其他有更多经验的人不会做得很好。