我正在开发一个网络应用程序,我想知道哪种方法应该适合我的项目。
基本上,我想向用户显示的是一些从对其他服务器的请求中获取的通知。我的 node.js 应用程序获取所有信息,然后将其传播给用户,将副本保存到我的 MongoDB 中。
这个想法很简单,但是阅读了我发现这两种技术的方法:
Ajax:客户端会一直检查服务器上是否有新内容。这将通过使用 jquery ajax get 到我的服务器 API 来完成(每 30/60 秒)。
Socket.io : 客户端连接一次,然后保持永久 TCP 连接(更实时)。
现在我已经说明了情况,我有以下问题:
我不会有太多的 ajax 请求吗?想象一下,我想每分钟检查一次服务器,如果我们将应用程序扩展到 100 个用户,它每分钟会给我 100 个查询。拥有一个套接字会在系统资源上“更便宜”吗?
socket.io 会对移动设备造成问题吗?带宽和性能。服务器的响应总是 JSON 格式的信息。
我读到 now.js 可以用于此,但似乎不再支持该项目,所以不确定使用它是否是个好主意。
这两种方法的缓存如何?我正在考虑为每个用户创建一个缓存文件,这将由服务器端的 node.js 更新。我想这可以很好地与 ajax 一起使用,但是 socket.io 呢?
socket.io 是否与许多浏览器完全不兼容?我的应用会更专注于移动设备,我认为这会让我考虑选择 ajax。
有什么替代方案推荐吗?
我希望这可以让我和其他处于同样情况的人清醒:) 谢谢
最佳答案
这里讨论了 webSocket 和 Ajax 之间的许多通用权衡:
websocket vs rest API for real time data?
此处讨论了移动设备的一些权衡问题:
Cordova: Sockets, PushNotifications, or repeatedly polling server?
简而言之,如果您的数据主要是服务器驱动的,然后需要发送给客户端,并且您希望客户端看到新数据时有相当长的延迟,那么这正是 webSockets 擅长的问题. webSockets 在这种情况下工作得最好,因为客户端不需要频繁轮询,服务器不需要处理来自大量客户端的定期轮询请求。相反,每个客户端只需设置一个持久的 webSocket 通信 channel ,然后服务器可以随时根据需要向下发送数据。
Would I not have too many requests with ajax ? imagine I want a check every minute to the server, if we scale the app to 100 users, it will give me 100 queries per minute. Would it be "cheaper" in system resources to have a socket ?
套接字在不活动时需要很少的资源,所以是的,一个持久的 webSocket 比许多客户端无休止地轮询更有效。这就是为什么发明 webSockets 的原因,因为它们更擅长解决这个特定问题。
Would the socket.io be a problem for mobile devices ? bandwith and performance. The response of the server is always info in JSON format.
socket.io 不是带宽或性能问题。尝试在后台使用 webSockets 存在一些移动问题,因为移动设备也在尝试进行主动电源管理,尽管客户端轮询也存在类似问题。
How is the caching on both methods ? I was considering to create a cache file for each user and this would be updated by the node.js in the server side. I guess this could work really well with ajax but what about socket.io ?
不清楚您对缓存的要求是什么?在 webSocket 实现中,服务器获取数据,然后将其发送给每个用户。通常不需要服务器端缓存。在客户端 Ajax 轮询实现中,服务器必须将数据存储在某处并“等待”每个客户端请求数据。 webSocket 或 Ajax 都没有“内置”缓存机制。
Is it true that socket.io is not compatible at all with many browsers ? My app would be more focused to mobile devices and I think this could make me think about choosing ajax instead.
socket.io 与所有具有 webSockets 的浏览器完全兼容,除了 IE9 和更早版本之外,几乎所有的浏览器都在使用。如果您使用 socket.io 库,如果 webSockets 不存在,它将自动退回到长轮询。无论您是进行常规轮询还是 webSocket,您的移动问题都可能相似,因为移动设备想要对长时间运行的事物进行电源管理,但您不想停止轮询。我不认为这是避免使用 webSockets/socket.io 的理由。 socket.io 在失去连接时有一些非常好的自动重新连接逻辑,这非常有用。
在移动世界中,我认为您会发现,如果不使用某种可以插入本地“推送”系统的本地应用程序组件,就无法可靠地在后台进行实时通知。该设备,因为这是唯一既省电又与电源管理完全兼容的系统。只要网页不是前台任务或设备处于空闲状态,就会对其进行电源管理。
关于Ajax 与 Socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319618/
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#
当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab