Rails本地服务器同时发送和接收请求

时间:2016-11-11 03:30:49

标签: ruby-on-rails http concurrency puma

所以也许这不是一个好的做法,但在这一点上,我的网络应用程序与它的' API在同一个应用程序/同一服务器下。我想知道在这种情况下是否有任何方法可以加快服务器进程请求的速度?

例如,当我向同一服务器下的API发送请求时,我使用:

require 'rest-client'

tasks = RestClient.get 'localhost:8000/tasks', 
{
  content_type: :json,
  accept: :json, 
 "X-User-Email" => "blahblah@gmail.com", 
 "X-User-Token" => "blahblah"
}

然而,有时需要非常长的时间来获得结果。或者它会导致服务器'超时读取数据。错误。我想知道是不是因为服务器正在向自己发送请求并同时从自己接收请求。我尝试在端口8000上打开另一台服务器,向端口3000服务器发送请求,速度要快得多。轨道在多线程中是不是很糟糕?

$ rails s -p 8000 -P 42323

此外,如果我先刷新端口8000服务器页面并发送请求,那么刷新端口3000服务器页面也会快得多。是因为Rack已经缓存了响应吗?

如果我错误地使用了不同的术语,我很抱歉。

修改

我已尝试从API和应用程序控制器进行调试。似乎最大的延迟发生在实际命中API控制器之前。如果从端口8000向端口8000 API发送请求,则为服务器输出:

Started GET "/" for 127.0.0.1 at 2016-11-11 17:37:14 +0800
  User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1234567]]
Processing by TasksApplicationController#index as HTML


Started GET "/tasks" for 127.0.0.1 at 2016-11-11 17:38:14 +0800
Processing by APIController#index as JSON

所以在开始加载API路线之前,ONE MINUTE已经过去了!

因此,如果我尝试运行两个本地服务器并将请求从端口3000发送到端口8000服务器,则这是更快版本的输出:

Started GET "/tasks" for 127.0.0.1 at 2016-11-11 17:42:25 +0800
Processing by APIController#index as JSON

不同之处在于输出的这部分消失了,因此1分钟的延迟消失了。

Started GET "/" for 127.0.0.1 at 2016-11-11 17:37:14 +0800
  User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1234567]]
Processing by TasksApplicationController#index as HTML

为什么如果我向端口8000服务器发送请求从8000服务器,我有这个额外的部分,导致这么多的时间延迟?

1 个答案:

答案 0 :(得分:0)

问题很可能是由于您在开发模式下运行Webrick。虽然Webrick是一个多线程服务器,Rails是多线程的,但在开发模式下,Rails使用Rake :: Lock中间件来防止并发请求。

要使Webrick在开发模式下完全支持多线程,您需要通过创建以下初始化来修补中间件并删除Rake :: Lock:

配置/初始化/ multithreaded_webrick.rb:

if (!empty($recipe)) {
    echo $recipe;
} else {
    echo $no_picture;
}

修改我找到了此信息的原始来源:

How rails resolve multi-requests at the same time?

除初始化者外,您可能还需要设置:

# Remove Rack::Lock so WEBrick can be fully multi-threaded.
require 'rails/commands/server'

class Rails::Server
  def middleware
    middlewares = []
    middlewares << [Rails::Rack::Debugger] if options[:debugger]
    middlewares << [::Rack::ContentLength]

    Hash.new middlewares
  end
end