我目前正在建立一个聊天只是为了好玩。我以前从未这样做过,一般来说,我这样做是为了尝试 EventSource API (Server-Sent Events)在 JavaScript 中。我大约 3 天前才听说它,我认为它很有趣,而且比设置 WebSocket 容易得多。
我知道长轮询会占用大量资源。但是,由于我从未听说过 EventSource,它对服务器有何影响?它是否使用相同数量的资源?
我注意到,在 Google Chrome 开发者工具 的Networks 选项卡 中,EventSource 确实创建了一个具有较大内容大小的请求(随着时间的推移)。有 1 个内容大小较大的请求是否更好?
我的聊天当前正在运行两个 EventSource。一个用于聊天本身(每 2500 毫秒 运行一次)和聊天中的“正在输入..”机制(每 250 毫秒 运行一次)。
聊天大约一分钟后,两个请求的合并内容大小约为 150kb。但是,这会增加更多的消息。
我担心我的房东会暂停我的帐户。这是发生在我一个使用轮询或长轮询的 friend 身上的事情(我忘记了)。不过,我不确定 EventSource 使用的资源是否与轮询或长轮询一样多。
最佳答案
长轮询比 EventSource 使用更多的资源,因为它不断地建立和销毁连接。使用 EventSource,只使用一个连接,客户端等待数据,而不是检查服务器是否有新数据。
使用长轮询时,客户端将在这些情况下断开连接:
当服务器没有数据时,客户端将等待直到超时,直到服务器有数据。如果有数据,则客户端断开连接并创建另一个连接。如果客户端超时,客户端将断开连接并建立另一个连接。因此,您可以从许多地方看到头顶。
长轮询
事件源
Accept: text/event-stream header 的 GET 请求发起WebSockets
Upgrade: websocket header 的 HTTP GET 请求发起资源消耗:
EventSource 的开销主要只是连接的存在。它在这个意义上类似于 websockets,其中建立和维护单个连接。因此,由于持续的建立/销毁周期,您将使用长轮询获得最多的开销,其次是来自 websocket 的开销(因为它们是双向的),而来自 EventSource 的开销最少,这是单向的。
更好的选择:
对于客户端和服务器之间的实时和双向通信,您真的没有比 websocket 更好的东西了。在这种解决方案中,客户端和服务器相互监听数据,而不是相互催促数据。
SSE 请求
我认为您问这个问题的前提是您认为 Chrome 中显示的是个人请求。由于 EventSource 与服务器建立了一个套接字,您实际上是在读取通过 EventSource 套接字发送的累积数据量。因此,当您发送数据时,您正在重复使用同一个连接,您无需担心请求大小。
总而言之,大多数主机暂停轮询的原因是短轮询和长轮询都需要大量请求。如果您使用 EventSource 或 websockets,则您使用的是使用套接字的实时通信,它不会向 HTTP 服务器发送请求“垃圾邮件”。 (如果我发送 100 个数据有效负载,EventSource 和 websockets 将使用相同的连接,长轮询将至少重新连接 100 次)你唯一需要注意的是你的服务器可以处理的最大并发连接数,因为套接字使用比轮询更少的 CPU 和资源。
需要考虑的有关 EventSource/SSE 的事项:
关于javascript - 运行 EventSources 对服务器的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870457/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'