resque 是利用 redis 建立了背景工作的機制。
網頁的回應時間有一定的限制,
如果同時需要一些動作,
像存取另個網站的內容,
或者要送出信件,
往往需要額外的時間等待回應,
會造成這個網頁的query回應時間在等這些事的回應,
這時就需要把這些工作丟到背景執行,
就不會延遲網頁的回應。
安裝好 resque 後,就內附了一個 resque 的 server,
可以掛在 sinatra 裡的一個目錄,
之前的 sinatra 的程式都寫在同一個檔,
在維護及調整上不具彈性,
將改成這樣子的設定,
原來的simple.rb 改為 i5app.rb
也加上'resque/server'這一行:
# -*- encoding: utf-8 -*-
require 'sinatra'
require 'sinatra/flash'
require 'resque/server'
$LOAD_PATH << File.expand_path(File.dirname(__FILE__)+'/lib')
class I5app < Sinatra::Base
get '/' do
"Hi, 新鐵人五<br /><a href='/env'>環境變數</a>"
end
get '/env' do
env.map{|k,v| "#{k}: #{v}<br />"}
end
end
編輯 config.ru
require './i5app'
use Rack::Static, :urls => ["/css", "/img"], :root => "public"
run Rack::URLMap.new \
"/" => I5app.new
再編輯 config.yml 檔來指定各個檔案的位置:
---
environment: production
chdir: /home/SITES/I5
address: 127.0.0.1
user: twtw
group: users
socket: /tmp/i5.sock
pid: /home/SITES/I5/logs/thin.pid
rackup: /home/SITES/I5/config.ru
log: /home/SITES/I5/logs/thin.log
max_conns: 1024
timeout: 30
max_persistent_conns: 512
daemonize: true
若要直接用 thin 執行時下這樣的指令:
thin -C config.yml start
就會以 socket 的方式執行;
若還是在開發時期,要用 shotgun 的話,
就以此指令執行:
shotgun -s thin -p 5555
而在 nginx 的設定檔上,就根據是用socket或port來配合修改:
# for I5
upstream i5 {
server 127.0.0.1:5555;
#server unix:/tmp/i5.sock;
}
當這樣仍能正常執行之後,
再把 resque server 掛進來。
config.ru 改成這個樣子:
require './i5app'
use Rack::Static, :urls => ["/css", "/img"], :root => "public"
Resque::Server.use Rack::Auth::Basic do |username, password|
password == 'my_resque_password'
end
run Rack::URLMap.new \
"/" => I5app.new,
"/resque" => Resque::Server.new
加第10行前,第9行要加個',',
上面的第4~6是進入resque目錄時,密碼對才能進入。
這樣進入到 http://myserver/resque
就可以看到 resque server 建立完成,
當丟工作到背景執行時,就可在此看到執行的情況。
系列文章列表