iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 25
0
Modern Web

Ruby on Rails面試題挑戰系列 第 25

Ruby on Rails面試題挑戰 Day25 - 什麼是Active Job?

What is Active Job?
什麼是Active Job?


網站上有些工作比較耗時,在等待的過程中,使用者不知道怎麼回事,體驗就會比較不好。通常碰到這種情況我們會將這種工作先存起來,繼續往下執行下面的步驟,等主機有空檔時再來處理這些事情,也就是非同步處理的概念。

Rails內建的Active Job就是來幫我們處理這些事情的。

舉要給使用者註冊後的通知信,我們可以用下面的指令來生成

rails g job user_notice_email

app/jobs下面就會產生這個檔案,這個類別繼承自ApplicationJob

class UserNoticeEmailJob < ApplicationJob
  queue_as :default

  def perform(*args)
    # Do something later
  end
end

queue_as是表示這事情急不急,根據程度也可以改成:urgent:low_priority等等。

perform這邊就可以寫下我們要做的事,參數可以根據我們的需求做調整

還可以根據我們想要的時間來執行

# 希望這項工作可以盡快被執行
UserNoticeEmailJob.perform_later(user)

# 明天中午再執行
UserNoticeEmailJob.set(wait_until: Date.tomorrow.noon).perform_later(guest)

# 一個禮拜後再執行
UserNoticeEmailJob.set(wait: 1.week).perform_later(guest)

另外還有個小問題是Active Job預設是將這些排程工作存在記憶體當中,這樣萬一重開機或是機器出現什麼狀況,排程的工作就會消失,所以通常還會再搭配其他的套件,將排程的工作存在其他地方,常見的有Delayed::JobSidekiq

  • Delayed::Job:
    容易設定和使用,排程是存在資料庫裡,不過要小心過多的排程工作導致資料庫運行過慢
  • Sidekiq:
    使用Redis來排程工作,Redis(Remote Dictionary Server)是一種記憶體內(in-memory)鍵值(key-value)資料存放區,效能高但安裝使用上較麻煩

你可以這樣回答:

Active Job 讓我們可以製造背景工作且對他們進行排程,通常是使用在某些耗時較久或沒必較馬上被執行的任務上,例如寄出通知信。由於預設是存在記憶體,通常還會再搭配其他的套件,將排程的工作存在其他地方,常見的有Delayed::JobSidekiq

參考資料

1.Active Job Basics

2.53 Ruby on Rails Interview Questions and Answers

3.為你自己學 Ruby on Rails - 背景工作及工作排程

4.Ruby on Rails 實戰聖經 - 非同步處理


上一篇
Ruby on Rails面試題挑戰 Day24 - 什麼是PORO?
下一篇
Ruby on Rails面試題挑戰 Day26 - Gemfile和Gemfile.lock是什麼?
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言