---
# System prepended metadata

title: 什麼是 Active Job？用來解決什麼問題？
tags: [Ruby on Rails 觀念]

---

###### tags: `Ruby on Rails 觀念` 
# 什麼是 Active Job？用來解決什麼問題？

簡單來說 **Active Job 是用來宣告任務，並把任務放到多種佇列(queue)後台執行的框架**。經典常見的任務可以是平常的系統定時清理、收費方式改變通知、或是定時寄送郵件等任務。任何可以細分的工作與同步執行的事情都可以用 Active Job 來做。

直接舉一個例子，假設我們必發送一封電子郵件給公司1500位職員。每封電子郵件大約需要 1 秒鐘的時間，所以發送總時間將會是 1500 秒，大約 25 分鐘。到底誰會願意等待 25 分鐘才能完成這項工作!?

如果我們使用 Active Job 來處裡，背景作業將與正常的請求流同時並行。我們可以執行其他應用程式也能同時向所有員工發送電子郵件。

## Active Job 工作圖示

![](https://i.imgur.com/GeVhj5i.png)

從上圖中我們可以了解，使用 Active Job 可以在進行當前任務時，又執行多個動作，就是靠的佇列(queue)，而預設是會把排程放在記憶體裡，但是為了避免伺服器中途掛掉的問題，我們會搭配其他套件來設置佇列的地方，常見的有 Sidekiq 跟 Resque 以及 Delayed Job

* Sidekiq 使用高效能的 Redise 來儲存要執行的任務，並且善用多執行序來增加效能，缺點是安裝使用上較麻煩
* Resque 是非同步處理任務的 Gem，另外提供了佇列管理器，可以實現將 Job 插入/取出佇列等功能
* Delayed Job 使用關聯式資料庫，方便安裝使用，但是佇列過多需擔心效能問題

## 參考

[What is active job and its purpose in ROR?](https://www.educative.io/answers/what-is-active-job-and-its-purpose-in-ror)

[RailsGuides](https://rails.ruby.tw/active_job_basics.html)

[為你自己學 Ruby on Rails](https://railsbook.tw/chapters/21-background-job)