Websocket API to replace REST API?



我有一个应用程序,它的主要功能是实时工作的,通过websockets或长轮询。

然而,该站点的大部分内容都是以RESTful的方式编写的,这对于将来的应用程序和其他客户端来说是很好的。然而,我正在考虑过渡到websocket API的所有网站功能,远离REST。这将使我更容易将实时功能集成到网站的所有部分。这会使构建应用程序或移动客户端变得更加困难吗?

我发现有些人已经在做这样的事情了:SocketStream

并不是说这里的其他答案没有价值,它们提出了一些好的观点。但我要反对普遍的共识,同意你的观点,即转向websockets不仅仅是为了实时功能,这是非常有吸引力的。

我正在认真考虑通过websockets将我的应用程序从RESTful架构转移到更多的RPC样式。这不是一个"玩具应用",我也不是在谈论实时功能,所以我确实有一些保留意见。但我看到走这条路有很多好处,我觉得这可能是一个特殊的解决方案。

我的计划是使用DNode, SocketIO和Backbone。有了这些工具,我的Backbone模型和集合可以通过简单地调用rpc风格的函数在客户机和服务器之间传递。不再需要管理REST端点、序列化/反序列化对象等等。我还没有使用socketstream,但它看起来值得一试。

在我确定地说这是一个好的解决方案之前,我还有很长的路要走,我确信它不是每个应用程序的最佳解决方案,但我确信这种组合将非常强大。我承认有一些缺点,比如失去了缓存资源的能力。但我有一种感觉,利大于弊。

我很有兴趣了解你们在探索这种解决方案方面的进展。如果你有任何github实验,请告诉我。我还没有,但希望很快就有了。

下面是我收集的待读链接列表。我不能保证它们都是值得的,因为我只浏览了其中的许多。但希望有人能帮上忙。


很棒的使用Socket的教程。IO与Express。它将express会话暴露给套接字。IO,并讨论了如何为每个经过身份验证的用户拥有不同的房间。

  • http://www.danielbaulig.de/socket-ioexpress/

node.js/socket.io/backbone.js/express/connect/jade/redis with authentication, Joyent hosting等教程

  • http://fzysqr.com/2011/02/28/nodechat-js-using-node-js-backbone-js-socket-io-and-redis-to-make-a-real-time-chat-app/
  • http://fzysqr.com/2011/03/27/nodechat-js-continued-authentication-profiles-ponies-and-a-meaner-socket-io/

push with Backbone.js教程(使用Rails):

  • http://blog.pusher.com/2011/6/21/backbone-js-now-realtime-with-pusher

在客户端用backbone.js构建应用,用express, socket构建node.js。

  • http://andyet.net/blog/2011/feb/15/re-using-backbonejs-models-on-the-server-with-node/
  • http://addyosmani.com/blog/building-spas-jquerys-best-friends/
  • http://fzysqr.com/2011/02/28/nodechat-js-using-node-js-backbone-js-socket-io-and-redis-to-make-a-real-time-chat-app/
  • http://fzysqr.com/2011/03/27/nodechat-js-continued-authentication-profiles-ponies-and-a-meaner-socket-io/

使用Backbone with DNode:

  • http://quickleft.com/blog/backbone-without-ajax-part-ii
  • http://quickleft.com/blog/backbone-without-ajax-part-1
  • http://sorensen.posterous.com/introducing-backbone-redis
  • https://github.com/cowboyrushforth/minespotter
  • http://amir.unoc.net/how-to-share-backbonejs-models-with-nodejs
  • http://hackerne.ws/item?id = 2222935
  • http://substack.net/posts/24ab8c

HTTP REST和WebSockets是非常不同的。HTTP是无状态的,所以web服务器不需要知道任何东西,你可以在web浏览器和代理中获得缓存。如果你使用WebSockets,你的服务器将变得有状态,并且你需要在服务器上与客户端建立连接。

请求-回复通信vs推送

只有当你需要数据从服务器推送到客户端时才使用WebSockets,这种通信模式不包括在HTTP中(只有通过变通)。如果其他客户端创建的事件需要对其他连接的客户端可用,例如在用户应该对其他客户端行为采取行动的游戏中,PUSH是有用的。或者如果你的网站正在监控一些东西,服务器将数据一直推送到客户端,例如股票市场(实时)。

如果不需要从服务器PUSH数据,通常使用无状态HTTP REST服务器更容易。HTTP使用简单的请求-应答通信模式。

我可以使用TCP (WebSockets)作为主要的web内容交付策略的唯一问题是,关于如何使用TCP设计您的网站架构和基础设施的阅读材料很少。

所以你不能从别人的错误中学习,发展也会变慢。这也不是一个"久经考验"的策略。

当然,你也将失去HTTP的所有优点(无状态和缓存是更大的优点)。

请记住,HTTP是TCP的抽象,设计用于提供web内容。

我们不要忘记SEO和搜索引擎不做websockets。所以你可以忘记SEO。

我个人不建议这样做,因为风险太大。

不要用WS服务网站,用它来服务web应用

然而,如果你有一个玩具或个人网站,尽一切办法去做。试一试,走在前沿。对于一个企业或公司来说,你无法证明这样做的风险。

我得到了一点教训。我做了一个在Ubuntu AWS EC2云服务上运行的数字运算应用程序(使用强大的gpu),我想为它做一个前端,只是为了实时观察它的进展。由于它需要实时数据,很明显我需要websockets来推送更新

它从一个概念验证开始,并且工作得很好。但是当我们想要向公众开放时,我们必须添加用户会话,所以我们需要登录功能。不管你怎么看,websocket都必须知道它在和哪个用户打交道,所以我们采取了使用websocket认证用户的捷径。这似乎是显而易见的,而且很方便。

实际上,我们不得不花一些时间安静地使连接可靠。我们从一些便宜的websocket教程开始,但发现我们的实现不能在连接断开时自动重新连接。当我们切换到socket-io时,这一切都得到了改善。

说了这么多,说实话,我认为我们错过了一些很棒的socket-io功能。 Socket-io提供了更多的功能,我相信,如果您在最初的设计中考虑到这一点,您可以从中获得更多。相反,我们只是用socket-io的websocket功能取代了旧的websocket,仅此而已。(没有房间,没有频道……)重新设计可以让一切变得更强大。但是我们没有时间。这是我们下一个项目要记住的。

接下来,我们开始存储越来越多的数据(用户历史、发票、交易等)。我们将所有这些数据存储在AWS dynamodb数据库中,并且再次使用socket-io将CRUD操作从前端通信到后端。我想我们在那儿拐错弯了。

  • 因为不久之后我们发现亚马逊的云服务(AWS)为RESTful应用程序提供了一些很棒的负载平衡/扩展工具
  • 我们现在的印象是,我们需要编写大量的代码来执行握手的CRUD操作。
  • 最近我们实现了Paypal的整合。我们设法让它工作了。但是,所有的教程都是用RESTful api 来做的。我们不得不重写/重新思考他们的例子,用websockets实现它们。不过我们很快就搞定了。但是我们确实感觉是在逆潮流而行。

说了这么多,我们下周就要直播了。我们及时赶到,一切正常。

我会考虑同时使用。每种技术都有其优点,没有放之四海而皆准的解决方案。

工作的划分是这样的:

  1. WebSockets将是应用程序与需要会话的服务器通信的主要方法。这消除了许多旧浏览器需要的hack(问题是对旧浏览器的支持会消除这种hack)

  2. RESTful API用于从浏览器缓存中受益的非面向会话的(即不需要认证)的GET调用。web应用程序使用的下拉列表的参考数据就是一个很好的例子。然而。

  3. HTML和Javascript。它们组成了web应用程序的UI。这些通常有利于放置在CDN上。

  4. 使用WSDL
  5. Web服务仍然是企业级和跨企业通信的最佳方式,因为它为消息和数据传递提供了定义良好的标准。首先,你应该将其卸载到Datapower设备,以代理到你的web服务处理程序。

所有这些都发生在HTTP协议上,它已经通过SSL提供了使用安全套接字。

对于移动应用程序,websockets不能重新连接回断开的会话(如何在关闭连接后重新连接到websocket),管理这不是微不足道的。所以对于移动应用,我仍然会推荐REST API和轮询。

在使用WebSockets和REST时要注意的另一件事是可伸缩性。WebSocket会话仍然由服务器管理。适当地使用rest式API是无状态的(这意味着没有需要管理的服务器状态),因此可伸缩性可以水平增长(这比垂直更便宜)。

我想从服务器更新吗?

  • 是的:socket . io
  • 没有休息:

Socket的缺点。io是:

  • 可扩展性:WebSockets需要开放连接和不同的操作设置来实现web规模。
  • 学习:我没有无限的学习时间。事情必须完成!

我仍然会使用Socket。io在我的项目,但不是基本的web表单,REST将做得很好。

基于WebSockets(或长轮询)的传输主要用于服务器和客户端之间的(近)实时通信。虽然有很多场景需要这些类型的传输,例如聊天或某些实时提要或其他东西,但并非某些web应用程序的所有部分都必须与服务器双向连接。

REST是基于资源的体系结构,它很容易理解,并且提供了它自己优于其他体系结构的优点。WebSockets更倾向于实时的数据流/feed,这需要你创建某种基于服务器的逻辑,以便优先考虑或区分资源和feed(以防你不想使用REST)。

我认为将来会有更多以WebSockets为中心的框架,比如socketstream,届时这种传输将以数据类型/表单无关的形式得到更广泛的理解和更好的记录。然而,我认为,这并不意味着它会/应该取代REST,仅仅因为它提供了许多用例和场景中不一定需要的功能。

我想指出这篇博客文章是由我来回答这个问题的最佳答案。

总之,YES

这篇文章包含了这类API的所有最佳实践。

这不是个好主意。这个标准甚至还没有最终确定,对不同浏览器的支持也不尽相同,等等。如果你现在想这样做,你最终需要回退到flash或长轮询等。在将来,它可能仍然没有多大意义,因为服务器必须支持将连接开放给每个用户。大多数web服务器的设计都是为了快速响应请求并尽可能快地关闭请求。甚至您的操作系统也必须进行调整,以处理大量的同时连接(每个连接消耗更多的临时端口和内存)。在尽可能多的站点中坚持使用REST。

相关内容

  • 没有找到相关文章