【发布时间】:2017-06-01 23:41:19
【问题描述】:
我们有一个网站在 Windows Server 2008 + SQLServer 2008 + Ruby + Sinatra + Sequel/Puma 上运行
我们已经为我们的网站开发了一个 API。 当多个客户端同时请求接入点时,客户端开始收到 RequestTimeout 异常。
我调查了一下,我注意到 Puma 管理多线程很好。 但 Sequel(或 Sequel 之下的任何层)一次只处理一个查询,即使它们来自不同的客户端。
事实上,如果我启动多个 Web 服务器,每个服务器侦听一个不同的端口,并且我为每个客户端分配一个不同的端口,则不会发生 RequestTimeout 异常。
我还不知道问题是 Sequel、ADO、ODBC、Windows、SQLServer 还是什么。 事实是我无法切换到任何其他技术(如 TinyTDS)
下面是一小段带有屏幕截图的代码,您可以使用它来复制错误:
require 'sinatra'
require 'sequel'
CONNECTION_STRING =
"Driver={SQL Server};Server=.\\SQLEXPRESS;" +
"Trusted_Connection=no;" +
"Database=pulqui;Uid=;Pwd=;"
DB = Sequel.ado(:conn_string=>CONNECTION_STRING)
enable :sessions
configure { set :server, :puma }
set :public_folder, './public/'
set :bind, '0.0.0.0'
get '/delaybyquery.json' do
tid = params[:tid].to_s
begin
puts "(track-id=#{tid}).starting access point"
q = "select p1.* from liprofile p1, liprofile p2, liprofile p3, liprofile p4, liprofile p5"
DB[q].each { |row| # this query should takes a lot of time
puts row[:id]
}
puts "(track-id=#{tid}).done!"
rescue=>e
puts "(track-id=#{tid}).error:#{e.to_s}"
end
end
get '/delaybycode.json' do
tid = params[:tid].to_s
begin
puts "(track-id=#{tid}).starting access point"
sleep(30)
puts "(track-id=#{tid}).done!"
rescue=>e
puts "(track-id=#{tid}).error:#{e.to_s}"
end
end
上面的代码中有2个接入点:
delaybyquery.json,通过加入同一张表产生延迟 5 次。请注意,该表必须有大约 1000 行才能获得 查询工作真的很慢;和
delaybycode.json,通过调用 ruby sleep 来产生延迟 功能。
两个接入点都接收到一个 tid (tracking-id) 参数,并且都写入 在 CMD 中输出,因此您可以同时关注两个进程的活动 窗口并检查哪个接入点正在阻止来自其他接入点的传入请求 浏览器。
为了测试,我在同一个 chrome 浏览器中打开了 2 个标签。 以下是我正在执行的 2 个测试。
第 1 步:运行网络服务器
c:\source\pulqui>ruby example.app.rb -p 81 我得到下面的输出
第 2 步:按代码测试延迟
我调用了这个 URL: 127.0.0.1:81/delaybycode.json?tid=123 5 秒后,我调用了另一个 URL 127.0.0.1:81/delaybycode.json?tid=456 下面是输出,您可以在其中看到两个调用并行工作
click here to see the screenshot
第 3 步:按查询测试延迟
我调用了这个 URL: 127.0.0.1:81/delaybyquery.json?tid=123 5 秒后,我调用了另一个 URL 127.0.0.1:81/delaybyquery.json?tid=456 下面是输出,您可以在其中看到调用一次正在工作 1。 对访问点的每次调用都以查询超时异常结束。
【问题讨论】:
-
请点击链接查看截图。抱歉,但 StackOverflow 还不允许我发布图片。
标签: ruby sinatra puma sequel sequel-gem