我愛 Redis,但我決定轉向 SolidQueue:Rails 8 背後的技術選擇與更簡單的未來

本篇文章更新時間:2026/01/15
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


我為什麼想從 Redis 退場:讀《I Love You, Redis, But I’m Leaving You for SolidQueue》有感

編輯前言:Rails 8 移除了 Redis 這件事,本質上不只是技術選型的調整,而是對整個開發者生態的一次「簡化宣言」。這篇文章讓我重新檢視:我們真的需要這麼複雜的技術堆疊嗎?

原文來源:I Love You, Redis, But I’m Leaving You for SolidQueue

核心觀點 (Key Takeaways)

  • Redis 很強,但它的維運成本往往被低估;SolidQueue 讓 PostgreSQL 成為足以取代 Redis 的通用解法。
  • Rails 8 的 SolidQueue、SolidCache、SolidCable 是基於資料庫的新世代基礎設施,讓「不用 Redis」成為可能。
  • 對 95% 的應用而言,PostgreSQL 的吞吐量就足以支撐背景工作隊列,不需要 Redis 的極致效能。

深入解析

這篇文章從開頭就拋出一個可能會讓 Rails 社群心頭一震的訊息:Rails 8 不再默認使用 Redis。換句話說,過去十多年你熟悉的 Sidekiq + Redis 組合,不再是唯一選項,甚至不是預設路線。

作者並不是在唱衰 Redis,而是坦誠描述:Redis 的強大,也伴隨著不容忽視的「複雜度負擔」。

原文直接列出 Redis 的「隱藏成本」:你要維護 Redis server、設定 persistence、監控 memory、維護 HA、高可用叢集、甚至還得理解兩套資料儲存語意。

這些對小團隊來說都是沈重負擔。而 SolidQueue 的設計則完全反其道而行:用你已經在用的資料庫,處理你原本需要 Redis 才能做到的事。

SolidQueue 如何取代 Redis?

核心概念其實非常簡單:靠 PostgreSQL 9.5 引入的 FOR UPDATE SKIP LOCKED。這讓 worker 在競爭同一批 job 時,不會卡住彼此,進而模擬 Redis 那種高速、原子性的任務鎖定行為。

SolidQueue 把工作分散在三個資料表:

  • solidqueuejobs:所有 job 的 metadata
  • solidqueuescheduled_executions:排程中的 job
  • solidqueueready_executions:可立即執行的 job

這套設計加上 PostgreSQL 的 MVCC 機制,使大量 insert/delete 也能被 autovacuum 消化掉,不需額外調整。

內建排程與 concurrency control:Redis 組合包直接退場

以前你可能需要 Sidekiq + sidekiq-cron + Redis 才能做到的一堆事,SolidQueue 直接內建。

  • recurring jobs 用 config/recurring.yml 設定即可
  • concurrency limits 原本是 Sidekiq Enterprise 才有的付費功能,SolidQueue 竟然免費

這裡我很喜歡作者一句話:

SolidQueue 給你這些功能「for free」,而且完全靠資料庫原生機制,不需要外部協調。

Mission Control:不需付費的 Sidekiq Dashboard 替代品

Mission Control Jobs 提供:

  • 即時 job 狀態
  • 失敗 job 的堆疊追蹤
  • 排程視覺化
  • queue throughput 趨勢圖
  • SQL 查詢 job 內容

這點我認為非常重要:SQL 是大家都會用的語言,不需要額外工具,不需要學 Redis 指令。

筆者心得與啟發

讀完這篇文章後,我最大的感想是:開發者太常在堆功能,而不是解決問題。 Redis 是強,但大多數時候我們根本用不到它的極限,而卻要為它付上維運成本、部署複雜度與系統風險。

Rails 8 想傳達的訊息很明確:

能用資料庫解決的事情,就不要再引入一個新服務。

這不僅是技術簡化,更是思維簡化。 SolidQueue 不是要挑戰 Redis 的效能,而是提出一個更務實的提問:你真的需要 Redis 嗎?

如果你的工作量真的高到一天處理幾千萬 job,當然 Redis 還是必要。但對 99% 的應用來說,把整套基礎設施收斂到 PostgreSQL,是再合理不過的演化。

這篇文章也讓我開始反思自己在做系統架構時,是否太容易「想當然爾」地依賴 Redis、K8s、Sidekiq 等成熟技術,而沒有仔細問自己:「我到底是不是需要這麼複雜的堆疊?」

對於正在寫 Rails 8 或準備升級的團隊,我強烈建議把 SolidQueue 實際跑起來試試看。或許你會驚訝:把 Redis 移除後,你的整個開發流程竟然變得更輕盈。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Mastodon