你必須很努力

Day24 - Ruby on Rails 中的 Resque 的介紹與應用

2020/09/29
字數統計: 1k閱讀時間: 4 min

前言

Resque (pronounced like "rescue") is a Redis-backed library for creating background jobs, placing those jobs on multiple queues, and processing them later.

以上擷取自 Resque GitHub 介紹

Resque 是非同步處理任務的 Gem,類似的 Gem 還有 Sidekiq...等,以這 2 個 Gem 為例,皆是使用 Redis 儲存 Job,兩者差異會在此文比較 (Resque vs Sidekiq 比較),下篇文章會改介紹 Sidekiq

後續的文章會以此 repo 作為範例

非同步處理

使用者在瀏覽網頁時,舉凡像是操作到寄 Email、產生 PDF、匯入/匯出 Excel...等,不會希望網頁卡在那,等 Server 處理完後,才能繼續操作 (或要重新整理等),此時會透過「非同步處理」的方式來實作,進而讓使用者可以邊瀏覽網頁時,Server 在背後處理,等完成後,再透通知使用者...

介紹

在 Resque 中,一個後台任務被抽象為由三種角色共同完成:

角色 說明
Job (任務) 1 個 Job 就是 1 個需要在後台完成的任務,1 個 Job 就是 1 個 Class
Queue (佇列) 佇列是由 Redis 實現的,Resque 還提供了佇列管理器,可以實現將 Job 插入/取出佇列等功能
Worker (執行者) 當佇列中有 Job 時,Worker 取出 Job 並執行

一個 Worker,可以處理 1 個佇列,也可以處理多個佇列,並且可以透過增加 Worker 的程序/執行緒數來加快佇列的執行速度

如何安裝

放在 Gemfile 檔案中,可參考此 commit

1
2
3
4
# Gemfile
gem 'resque', '~> 2.0'

# 記得要 bundle

加上 Web 介面,可參考此 commit

1
2
3
# config/routes.rb
require 'resque/server'
mount Resque::Server.new, at: '/resque'

Rakefile 檔案中,加入以下,可參考此 commit

1
2
3
# Rakefile
require 'resque/tasks'
task 'resque:setup' => :environment

寫個 Resque 確認能否執行

可參考此 commit

1
2
3
4
5
6
7
8
9
10
11
# app/controllers/users_controller.rb
Resque.enqueue(HelloWorldWorker, @user.id, 'hello world')

# app/jobs/hello_world_worker.rb
class HelloWorldWorker
@queue = :hello_world_worker

def self.perform(user_id, string)
puts "#{user_id} say #{string}"
end
end

如何執行

終端機輸入

備註: 更多參數說明,請看 Resque GitHub

1
QUEUE=* INTERVAL=1 rake resque:work

更多指令

1
2
3
4
5
6
7
8
9
10
11
12
13
resque -h

Usage: resque [options] COMMAND

Options:
-r, --redis [HOST:PORT] Redis connection string
-N, --namespace [NAMESPACE] Redis namespace
-h, --help Show this message

Commands:
remove WORKER Removes a worker
kill WORKER Kills a worker
list Lists known workers

Resque Web 介面

Resque vs Sidekiq 比較

先說結論,較新的專案,會直接使用 Sidekiq,Resque 已不在考慮中...

Resque 是在 2009 年發布,而 Sidekiq 則是 2012 年發布,Sidekiq 更新速度、效能也比 Resque 好,連 Sidekiq GitHub 介紹都直接說我比 Resque 快,還有一頁是使用者感言,裡面搜尋「Resque」也能看到被比較的心得感言。

若想看細節差異,可參考 Stack Overflow 這篇 Resque vs Sidekiq?,另外還有找到這篇 Switching From Resque to Sidekiq,看完便知道為何現在較少用過 (甚至沒聽過 Resque) 的原因...

參考資料

  1. Ruby on Rails 實戰聖經 - 非同步處理
  2. RailsCasts - #271 Resque

小結

剛進入公司時,一開始對於 Redis、Resque、Sidekiq 三者之間傻傻分不清,不知彼此的關係,以及為何要同時存在 2 套背景處理的 Gem,隨工作一段時間,加上這次鐵人賽寫相關文章時,才搞懂為何會有這樣的配置,隨專案越來越大,不斷增加新功能同時,舊 code 有可能變成舊技術 (甚至技術債),就像現在 Ruby on Rails 最新版本為 6.0.3.3 ,幾年後,也會變成舊版本,說不定寫法會大改也不是不無可能,更別提其他技術,也會有同樣的情況發生,端看團隊如何解決這件事,要是仍能正常運作且沒什麼問題的話,不一定要換或升到最新,除非有遇到版本相容性、或其他問題時,才會依當時情境想新的解決方案...


鐵人賽文章連結:https://ithelp.ithome.com.tw/articles/10245939
medium 文章連結:https://link.medium.com/Qz9SocIv99
本文同步發布於 小菜的 Blog https://riverye.com/

備註:之後文章修改更新,以個人部落格為主

原文連結:https://riverye.com/2020/09/29/Day24-Ruby-on-Rails-中的-Resque-的介紹與應用/

發表日期:2020-09-29

更新日期:2020-09-29

CATALOG
  1. 1. 前言
  2. 2. 非同步處理
  3. 3. 介紹
  4. 4. 如何安裝
  5. 5. 寫個 Resque 確認能否執行
  6. 6. 如何執行
    1. 6.0.1. 更多指令
    2. 6.0.2. Resque Web 介面
  • 7. Resque vs Sidekiq 比較
  • 8. 參考資料
  • 9. 小結