iT邦幫忙

DAY 18
2

建立API為中心的輕量級網站系列 第 18

redis 應用:在 sinatra 建立 resque Server

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 建立完成,
當丟工作到背景執行時,就可在此看到執行的情況。

系列文章列表


上一篇
在 redis 的計數應用
下一篇
redis 應用:resque 的基本使用
系列文
建立API為中心的輕量級網站30

1 則留言

我要留言

立即登入留言