Rails 8 新特性全解析:Solid Queue / Cache / Cable,抛弃 Redis 方案实战
——当 Rails 决定替你砍掉整个 Redis 依赖,这不是噱头,是一场架构范式的革命。
一、为什么 Rails 8 要"干掉" Redis?
先说一句得罪人的话:Redis 很强,但 95% 的应用根本用不到它的极限性能,却要为它付出全部的运维代价。
你要维护 Redis server,要配置 persistence,要监控内存,要搭建 HA 高可用集群,还要理解两套完全不同的数据存储语义。对小团队来说,这不是技术选型,这是技术负担。
David Heinemeier Hansson 在 Rails World 上的那句话至今振聋发聩:
"Rails 8 的想法是摆脱趋势跟踪,拒绝一些行业中流行的想法——比如不敢碰 Linux 服务器,或者非要给自己的应用塞一个 Redis。"
于是,Rails 8 带来了三把刀:Solid Queue、Solid Cache、Solid Cable——全部基于数据库驱动,全部零额外依赖。Redis?可以退场了。
二、Solid Queue:用 PostgreSQL 取代 Sidekiq + Redis
2.1 核心原理:FOR UPDATE SKIP LOCKED
Solid Queue 的技术内核极其优雅。它利用 PostgreSQL 9.5 引入的 FOR UPDATE SKIP LOCKED 语句,让多个 Worker 在竞争同一批 Job 时互不阻塞——完美模拟了 Redis 那种高速、原子性的任务锁定行为,而无需任何外部服务。
数据只存三张表:
表格
表名 用途
solid_queue_jobs 所有 Job 的元数据
solid_queue_scheduled_executions 排程中的 Job
solid_queue_ready_executions 可立即执行的 Job
配合 PostgreSQL 的 MVCC 机制,大量 insert/delete 被 autovacuum 自动消化,你甚至不需要调优。
2.2 实战:从零搭建
新建 Rails 8 项目(自动集成):
bash
rails new myapp
# Solid Queue 已是默认后端,无需任何配置
已有项目升级:
ruby
# Gemfile
gem 'solid_queue'
bash
bin/rails generate solid_queue:install
bin/rails db:migrate
核心配置 config/queue.yml:
yaml
production:
dispatchers: 2
workers:
- queues: [critical]
concurrency: 10
- queues: [default, mailers]
concurrency: 5
scheduler:
dynamic_tasks_enabled: true # 运行时动态增删定时任务
启动:
bash
bin/jobs start # Fork 模式(默认,最佳性能)
bin/jobs start --mode async # Async 模式,单进程多线程,省资源
bin/jobs start --skip-recurring # 开发环境跳过定时任务
2.3 杀手级功能:动态任务调度
这是 Sidekiq Enterprise 才有的付费功能,Solid Queue 免费送:
ruby
# 运行时添加定时任务
SolidQueue::RecurringTask.create(
job_class: "DailyReportJob",
cron_expression: "0 0 * * *",
queue_name: "reports"
)
# 运行时移除
task = SolidQueue::RecurringTask.find_by(job_class: "DailyReportJob")
task.destroy
2.4 对比 Sidekiq + Redis:一张表看清差距
表格
维度 Sidekiq + Redis Solid Queue
吞吐模型 多线程(但 Redis 是单点瓶颈) 数据库原生 MVCC
内存占用(200 QPS) ~1GB(12 Worker) ~320MB(4 Worker)
月账单(AWS t3.medium) ~$84 ~$42
监控 UI ✅ 自带 Web UI ✅ Mission Control(免费替代 Sidekiq Dashboard)
故障转移 Redis 主从切换有窗口期 实测 12 秒内完成,37 个任务零丢失自动续跑
并发控制 ❌ 付费功能 ✅ 免费内建
外部依赖 必须 Redis 无需任何额外服务
但请注意: Solid Queue 要求 Redis 配置为单节点或主从模式(不支持 Redis Cluster),因为它的原子操作依赖 Lua 脚本在单个 Redis 实例上执行。如果你已在用 Redis Cluster,要么拆出专用实例,要么接受部分高级功能降级。
三、Solid Cable:用数据库取代 Redis 做 WebSocket
Action Cable 终于不再被 Redis 绑架了。
Solid Cable 的工作方式: 消息存入数据库表,通过轮询机制检查更新。虽然是轮询,但在大多数场景下性能与 Redis 相当,且不受 PostgreSQL 适配器 8KB 消息负载限制。
yaml
# config/cable.yml
production:
polling_interval: 0.1
message_retention: 1.hour
autotrim: true
兼容 MySQL、SQLite、PostgreSQL。如果你的应用本来就不需要 Redis,Solid Cable 让你彻底摆脱对它的依赖。
四、Solid Cache:磁盘缓存取代内存缓存
Redis 和 Memcached 的替代品来了。Solid Cache 利用磁盘存储,提供:
更大的数据集(不受内存限制)
加密支持
保留策略(Retention Policy)
更低的成本(磁盘比内存便宜一个数量级)
对于缓存 HTML 片段、API 响应这类场景,Solid Cache 是降维打击。
五、AI 后台任务实战:Solid Queue + 优先级队列 + 智能重试
当你的 Rails 应用接入 AI(GPT、Embedding 等),传统的作业管理思维会彻底失效。AI 任务慢、贵、受限、易失败,必须用专门的模式来治理。
5.1 优先级队列设计
ruby
# app/jobs/ai_chat_job.rb
class AiChatJob < ApplicationJob
queue_as :ai_realtime # 实时交互,毫秒级响应
def perform(conversation_id, message)
# 调用 AI 聊天 API
end
end
# app/jobs/batch_embedding_job.rb
class BatchEmbeddingJob < ApplicationJob
queue_as :embeddings # 批量向量化,可延迟一整夜
def perform(document_ids)
# 批量生成向量
end
end
5.2 分级调度配置
yaml
# config/solid_queue.yml
production:
dispatchers:
- polling_interval: 1
batch_size: 500
workers:
- queues: [ai_realtime]
threads: 3
polling_interval: 0.1 # 0.1秒检查一次,极快响应
- queues: [critical, default]
threads: 3
polling_interval: 0.5
- queues: [ai_batch, embeddings]
threads: 2
polling_interval: 2 # 2秒检查一次,节省数据库压力
关键认知: polling_interval 是最容易被忽视但最致命的参数。每个 Worker 线程都按这个间隔查询数据库,间隔越短、队列越多,数据库压力越大。务必根据实际负载调优。
5.3 智能重试:指数退避 + 抖动
AI 任务最常见的失败原因是速率限制(HTTP 429)和超时。固定间隔重试等于对已受限的 API 发起 DDoS 攻击。
ruby
# app/jobs/concerns/ai_base_job.rb
module AiBaseJob
extend ActiveSupport::Concern
included do
# 速率限制:重试5次,多项式退避 + 抖动
retry_on Faraday::TooManyRequestsError,
wait: :polynomially_longer,
attempts: 5
# 网络超时:重试3次,多项式退避
retry_on Faraday::TimeoutError,
wait: :polynomially_longer,
attempts: 3
# AI 通用错误:固定等待10秒,最多3次
retry_on OpenAI::Error,
wait: 10.seconds,
attempts: 3
# 记录不存在直接丢弃,不重试
discard_on ActiveRecord::RecordNotFound
end
end
六、Rails 8 部署革命:Kamal 2
别忘了,Rails 8 还带来了 Kamal 2——一行命令完成生产部署:
bash
kamal setup # 两分钟内配置好生产服务器
kamal deploy # 零停机部署
内置 Thruster 代理,不再需要 Nginx
Kamal Proxy 取代 Traefik,支持 Let's Encrypt 自动 SSL
集成 1Password / Bitwarden 管理密码
Docker 容器开箱即互联网就绪
七、灵魂拷问:你真的需要 Redis 吗?
表格
场景 推荐方案
日均 < 100 万 Job,PostgreSQL 够用 Solid Queue,零额外依赖
日均 > 1000 万 Job,极致吞吐需求 Sidekiq + Redis,依然是王者
不需要 Redis 做其他事 Solid Cable + Solid Cache,全栈数据库驱动
小型项目 / 独立开发者 SQLite 后端,Rails 8 官方支持,部署成本趋近于零
结语
Rails 8 的"三大 Solid"不是要挑战 Redis 的性能极限——它是在问你一个更务实的问题:你真的需要 Redis 吗?
对 99% 的应用来说,把整套基础设施收敛到 PostgreSQL,是 2026 年最合理的架构选择。能用数据库解决的事情,就不要再引入一个新服务。这不仅是技术简化,更是思维简化。
正如那篇引爆社区的文章所说:
"开发者太常在堆功能,而不是解决问题。Redis 是强,但大多数时候我们根本用不到它的极限,而却要为它付上运维成本、部署复杂度与系统风险。"
把 Redis 留给真正需要它的 1%,其余的——交给 Solid Queue 就够了。