我有一个应用程序,其主要功能通过Websockets或长轮询实时工作。
然而,大部分站点都是以RESTful的方式编写的,这对于未来的应用程序和其他客户端非常好。但是,我正在考虑将所有站点功能转换为websocket API,远离REST。这将使我更容易地将实时功能集成到站点的所有部分中。这样做是否会使构建应用程序或移动客户端更加困难?
我发现一些人已经在做类似的事情:SocketStream
我有一个应用程序,其主要功能通过Websockets或长轮询实时工作。
然而,大部分站点都是以RESTful的方式编写的,这对于未来的应用程序和其他客户端非常好。但是,我正在考虑将所有站点功能转换为websocket API,远离REST。这将使我更容易地将实时功能集成到站点的所有部分中。这样做是否会使构建应用程序或移动客户端更加困难?
我发现一些人已经在做类似的事情:SocketStream
虽然其他回答也有一定的价值并提出了一些好的观点,但是我会反其道而行之,并同意你的看法——通过Websockets来实现不只是实时功能的迁移非常诱人。
我正在认真考虑将我的应用从RESTful架构转移到更多采用基于Websockets的RPC风格。这不是一个“玩具应用程序”,我也不仅谈论实时特性,所以我有保留意见。但我认为采用这种方式会带来很多好处,可能会成为一个非常出色的解决方案。
我的计划是使用DNode、SocketIO和Backbone。借助这些工具,我的Backbone模型和集合可以通过简单地调用函数的RPC风格在客户端和服务器之间传递。不再需要管理REST端点、序列化/反序列化对象等等。虽然我还没有使用socketstream,但它看起来值得一试。
在我能够明确表示这是一个好的解决方案之前,我还有很长的路要走,而且我确信它并不是每个应用程序的最佳解决方案,但我相信这种组合会非常强大。我承认有一些缺点,例如失去了缓存资源的能力。但我有一种感觉,优势将超过它们。
我很想了解你在探索这种解决方案方面的进展情况。如果您有任何github实验,请指向它们。我目前没有,但希望很快就会有。
以下是我收集的待读链接列表。我不能保证它们都有价值,因为我只是浏览了其中许多内容。但希望其中一些可以帮到你。
使用Express和Socket.IO的绝佳教程。它将express会话公开给socket.io,并讨论如何为每个经过身份验证的用户设置不同的房间。
使用身份验证、Joyent主机等node.js/socket.io/backbone.js/express/connect/jade/redis的教程:
使用Pusher和Backbone.js(使用Rails)的教程:
在客户端使用backbone.js,服务器端使用node.js、express、socket.io、dnode构建应用程序。
使用 DNode 和 Backbone:
HTTP、REST和WebSockets是非常不同的。HTTP是无状态的,所以Web服务器不需要知道任何信息,你可以在Web浏览器和代理中进行缓存。如果使用WebSockets,服务器将变得有状态,并且需要在服务器上与客户端建立连接。
只有在需要从服务器向客户端推送数据时才使用WebSockets,这种通信模式不包含在HTTP中(只有通过变通方法实现)。如果其他客户端创建事件需要对其他连接的客户端可用,例如在需要根据其他客户端行为采取行动的游戏中,或者如果你的网站正在监控某些内容并且服务器一直向客户端推送数据,例如股票市场(实时)。
如果不需要从服务器推送数据,通常更容易使用无状态的HTTP REST服务器。HTTP使用简单的请求-应答通信模式。
HTTP已经为创建/更新/删除资源定义了良好的操作。您需要在WebSockets的低级别实现这些操作。
WebSocket连接在单个服务器上垂直扩展,而HTTP连接在水平方向上扩展。有一些专有的、非基于标准的WebSocket水平扩展解决方案。
HTTP具有许多良好的功能,如缓存、路由、多路复用、压缩等。如果选择WebSocket,则必须在WebSocket之上构建这些功能。
搜索引擎优化对HTTP URL很有效。
所有代理、DNS和防火墙尚未完全了解WebSocket流量。它们允许端口80,但可能会先窥探流量并限制流量。
WebSocket的安全性是全有或全无的方法。
请查看文章以获取更多详细信息。
使用TCP(WebSockets)作为主要的网站内容传递策略唯一的问题在于,关于如何使用TCP设计网站架构和基础设施的阅读材料非常少。
因此,你无法从别人的错误中学习,并且开发速度会变慢。这也不是一个“经过试验和测试”的策略。
当然,您也将失去HTTP的所有优势(无状态和缓存是最大的优势)。
请记住,HTTP是为提供网络内容而设计的TCP抽象。
还有,我们不能忘记SEO和搜索引擎不支持WebSockets。因此,您可以忘记SEO。
个人认为不应该使用WebSockets来提供网站,但如果您有小型玩具网站或个人网站,请尽管使用。尝试它,保持前沿。对于企业或公司而言,您无法证明使用WebSockets是值得冒险的。
不要使用WS用于提供网站,而是用于提供Web应用程序
我通过一些艰难的方式学到了一个小教训。我做了一个可以在 Ubuntu AWS EC2 云服务上运行的数字计算应用(使用强大的GPU),我想为它制作一个前端以便实时观看进度。
由于它需要实时数据,很明显我需要Websockets来推送更新。
这开始于一个概念验证,非常好用。但当我们想要向公众开放时,我们必须添加用户会话,所以我们需要登录功能。不管怎么看,WebSocket都必须知道它所处理的用户,因此我们采用了使用WebSockets来验证用户的捷径。这似乎是显而易见的且很方便。
我们实际上花费了相当多的时间来使连接变得可靠。我们从一些廉价的websocket教程开始,但发现我们的实现无法在连接断开时自动重新连接。当我们转向Socket-io后,一切都得到了改善。Socket-io 是必需品!
说了那么多,老实说,我认为我们错过了一些很棒的socket-io功能。Socket-io有很多更多的功能可以提供,如果您在初始设计中考虑到它,我相信您可以从中获得更多收益。相比之下,我们只是用socket-io的websocket功能替换了旧的websockets,就这样结束了。(没有房间、没有频道……)重新设计可能会使一切更强大。但我们没有时间做这件事。这是我们下一个项目需要记住的事情。
接下来,我们开始存储越来越多的数据(用户历史记录、发票、交易等)。我们将其全部存储在AWS DynamoDB数据库中,并再次使用socket-io将CRUD操作从前端传递到后端。我认为我们走错了方向。这是一个错误。
说了这么多,我们下周就要上线了。我们及时完成了一切工作,而且速度非常快,但是它能扩展吗?
我是否想从服务器接收更新?
使用Socket.io的缺点包括:
我仍将在我的项目中使用Socket.io,但对于REST可以很好地解决的基本Web表单,不使用它。
WebSockets(或长轮询)基于传输主要用于服务器和客户端之间的(近乎)实时通信。虽然有许多情况需要这些类型的传输,例如聊天或某种实时提要或其他内容,但并不是某些 Web 应用程序的所有部分都必须与服务器双向连接。
REST 是基于资源的架构,被广泛理解,并且相对于其他架构具有自己的优点。WebSockets 更倾向于实时数据流/提要,这将要求您创建一些基于服务器的逻辑,以便在资源和提要之间进行优先级或区分(如果您不想使用 REST)。
我认为,随着这种传输方式越来越普及并以数据类型/表单不可知的交付形式更好地得到理解/记录,未来可能会出现更多 WebSockets 中心化框架,例如 socketstream。然而,我认为,这并不意味着它会/应该取代 REST,只因为它提供了在许多用例和场景中并非必需的功能。
那不是一个好主意。标准甚至还没有最终确定,支持在各种浏览器中也不同等等。如果你现在想这样做,你最终会需要回退到Flash或长轮询等技术。未来它可能仍然没有太多意义,因为服务器必须支持保持连接对每个用户开放。大多数Web服务器的设计是为了快速响应请求并尽快关闭它们,而不是保持连接。甚至你的操作系统也必须调整以处理大量同时连接(每个连接使用更多的临时端口和内存)。尽可能使用REST来构建网站。