Solid Queue va Solid Cache trong Rails 8: Huong Dan Toan Dien cho Phong Van Ky Thuat 2026
Phan tich chuyen sau Solid Queue va Solid Cache, hai thanh phan database-backed mac dinh trong Rails 8. Job batches, fiber mode, Active Job Continuations, va kien thuc chuan bi phong van 2026.

Solid Queue va Solid Cache dai dien cho buoc chuyen doi ha tang mang tinh buoc ngoat nhat trong lich su phat trien cua Ruby on Rails. Ca hai thanh phan nay duoc tich hop mac dinh tu Rails 8, thay the Redis trong viec xu ly background jobs va caching bang cac giai phap dua hoan toan tren co so du lieu quan he, loai bo mot lop phuc tap van hanh ma truoc day bat ky ung dung Rails nao cung phai doi mat.
Rails 8 mac dinh su dung ba thanh phan dua tren co so du lieu: Solid Queue (xu ly background jobs), Solid Cache (bo nho dem) va Solid Cable (WebSockets). Su ket hop nay loai bo hoan toan su phu thuoc vao Redis cho phan lon ung dung Rails. Day la chu de xuat hien rat thuong xuyen trong cac buoi phong van ky thuat Rails 8 hien nay.
Solid Queue Thay The Redis-Based Job Backends Nhu The Nao
Solid Queue la mot Active Job backend su dung co so du lieu quan he, luu tru cac jobs truc tiep trong PostgreSQL, MySQL hoac SQLite. Co che cot loi nam o cau lenh SQL FOR UPDATE SKIP LOCKED, mot tinh nang co san tu PostgreSQL 9.5+ va MySQL 8+, cho phep bien mot bang du lieu thong thuong thanh hang doi cong viec dong thoi ma khong gay ra blocking giua cac worker.
Kien truc cua Solid Queue bao gom ba thanh phan chinh:
- Workers lien tuc poll bang
solid_queue_ready_executionsva nhan jobs thong qua co cheSKIP LOCKED, dam bao khong co hai worker nao xu ly cung mot job - Dispatchers di chuyen cac scheduled jobs tu bang
solid_queue_scheduled_executionssang bang ready khi thoi diem thuc thi den - Schedulers quan ly cac tac vu dinh ky duoc khai bao trong file cau hinh YAML
# config/solid_queue.yml
production:
dispatchers:
- polling_interval: 1
batch_size: 500
workers:
- queues: "*"
threads: 5
polling_interval: 0.1
processes: 2Cau hinh tren khoi chay hai worker processes voi 5 threads moi process, thuc hien polling moi 100ms. Dispatcher kiem tra cac scheduled jobs moi giay voi batch size 500 jobs moi lan.
Transactional Job Enqueuing: Loai Bo Race Condition Triet De
Mot trong nhung loi the manh me nhat cua Solid Queue so voi cac backend dua tren Redis chinh la transactional enqueuing. Khi mot job duoc enqueue ben trong mot database transaction, job do chi tro nen visible sau khi transaction duoc commit thanh cong. Cac backend dua tren Redis khong the cung cap dam bao nay, mot job hoan toan co the duoc thuc thi truoc khi transaction tao ra no hoan tat, dan den viec tham chieu den cac ban ghi chua ton tai.
# app/jobs/send_welcome_email_job.rb
class SendWelcomeEmailJob < ApplicationJob
self.enqueue_after_transaction_commit = true
queue_as :default
def perform(user_id)
user = User.find(user_id)
UserMailer.welcome(user).deliver_now
end
end
# app/models/user.rb
class User < ApplicationRecord
after_create do
SendWelcomeEmailJob.perform_later(id)
# Job only enqueued after the CREATE transaction commits
# No risk of the job running before the user record exists
end
endVoi enqueue_after_transaction_commit duoc bat, job se duoc hoan lai cho den khi transaction bao boc no thanh cong. Neu transaction bi rollback, job se khong bao gio duoc enqueue. Co che nay loai bo hoan toan mot lop race conditions ma cac hang doi dua tren Redis thuong xuyen gap phai.
Kiem Soat Dong Thoi va Hang Doi Uu Tien
Solid Queue cung cap san co che kiem soat dong thoi (concurrency controls) ma Sidekiq chi ho tro trong phien ban Enterprise tra phi. Tuy chon limits_concurrency gioi han so luong jobs cua mot loai cu the co the chay dong thoi.
# app/jobs/api_sync_job.rb
class ApiSyncJob < ApplicationJob
limits_concurrency to: 3, key: ->(account_id) { "api_sync_#{account_id}" }
def perform(account_id)
account = Account.find(account_id)
ExternalApi.sync(account)
end
endCau hinh nay dam bao toi da 3 API sync jobs chay dong thoi cho moi account, ngan chan vi pham rate limit ma khong can co che phoi hop ben ngoai. Cac jobs bi chan duoc luu trong bang solid_queue_blocked_executions va tu dong duoc giai phong khi co slot trong.
Do uu tien hoat dong tren hai cap do: do uu tien bang so cho moi job (so nho hon = uu tien cao hon) va thu tu hang doi trong cau hinh worker. Ca hai co the ket hop de kiem soat chi tiet thu tu thuc thi.
Mot cau hoi phong van Rails 8 pho bien yeu cau so sanh uu nhuoc diem giua Solid Queue va Sidekiq. Diem khac biet then chot: Solid Queue cung cap transactional guarantees va concurrency controls tich hop san hoan toan mien phi. Sidekiq vuot troi ve raw throughput cho cac workloads khoi luong lon (tren 10.000 jobs/phut) nho Redis hoat dong hoan toan tren bo nho. Doi voi 95% ung dung thuc te, Solid Queue cung cap hieu nang du dap ung. Xem bai so sanh chi tiet tai Rails background jobs.
Job Batches cho Cac Thao Tac Theo Nhom
Solid Queue 1.7.0 gioi thieu tinh nang job batches, cho phep nhom cac jobs lai va theo doi chung nhu mot tap hop. Tinh nang nay ho tro callbacks khi tat ca jobs trong batch hoan thanh, mot pattern truoc day chi co o Sidekiq Pro.
# app/jobs/batch_import_job.rb
class BatchImportJob < ApplicationJob
def perform(file_id)
file = ImportFile.find(file_id)
SolidQueue::Batch.enqueue(
on_finish: BatchFinishedJob,
on_success: NotifyUserJob,
on_failure: AlertOpsJob
) do |batch|
file.rows.each_slice(100) do |rows|
ProcessRowsJob.perform_later(rows.map(&:id))
end
end
end
endBatch theo doi tat ca jobs duoc enqueue trong block cua no. Khi tat ca jobs hoan thanh, on_finish duoc goi bat ke thanh cong hay that bai. Neu tat ca jobs thanh cong, on_success duoc goi. Neu bat ky job nao that bai, on_failure duoc goi. Dieu nay cho phep cac workflow nhu xu ly import, noi buoc cuoi cung phai cho tat ca cac phan hoan thanh.
Jobs duoc tao ngoai batch nhung duoc enqueue ben trong se tham gia vao batch do. Batch khong co job nao se hoan thanh ngay lap tuc va goi callbacks cua no.
Che Do Thuc Thi Fiber cho Workloads I/O-Bound
Solid Queue 1.6.0 bo sung che do thuc thi worker dua tren fiber su dung gem Async. Che do nay chay jobs tren fibers thay vi threads, mang lai loi ich dang ke cho workloads I/O-bound nhu goi API LLM, noi phan lon thoi gian la cho doi phan hoi.
# config/solid_queue.yml
production:
workers:
- queues: [llm_calls, external_apis]
fibers: 100
polling_interval: 0.5Voi 100 fibers, 100 jobs I/O-bound co the chay dong thoi trong mot process duy nhat voi overhead bo nho toi thieu. Day la su cai thien dang ke so voi 100 threads, voi tieu thu bo nho lon hon nhieu va gap van de contention tren GVL (Global VM Lock).
Che do fiber yeu cau Rails duoc cau hinh cho fiber isolation:
# config/application.rb
config.active_support.isolation_level = :fiberCac jobs CPU-bound nen tiep tuc su dung threads, vi fibers khong mang lai loi ich khi cong viec khong yield cho I/O.
Active Job Continuations trong Rails 8.1
Rails 8.1 gioi thieu Active Job Continuations, cho phep cac jobs chay lau duoc tam dung va tiep tuc tu cac checkpoints. Tinh nang nay giai quyet van de jobs phai khoi dong lai tu dau khi bi gian doan boi deploys hoac container restarts.
# app/jobs/process_import_job.rb
class ProcessImportJob < ApplicationJob
include ActiveJob::Continuable
def perform(import_id)
@import = Import.find(import_id)
step :validate do
@import.validate!
end
step :process_records do |step|
@import.records.find_each(start: step.cursor) do |record|
record.process
step.advance!(from: record.id)
end
end
step :finalize do
@import.mark_complete!
end
end
endMethod step dinh nghia cac giai doan rieng biet. Neu job bi gian doan, no se tiep tuc tu step cuoi cung da hoan thanh. Trong mot step, step.cursor theo doi tien do: step.advance!(from: record.id) luu vi tri cursor. Khi tiep tuc, find_each(start: step.cursor) bat dau tu vi tri xu ly cuoi cung.
Continuations yeu cau queue adapter phai implement stopping?. Solid Queue ho tro dieu nay tu v1.2.0. Delayed Job va Resque khong ho tro graceful interruption neu khong co them cong viec bo sung.
Cursor co the la bat ky gia tri nao co the serialize duoc. Cho cac vong lap long nhau, su dung array:
step :process_nested, start: [0, 0] do |step|
Account.find_each(start: step.cursor[0]) do |account|
account.records.find_each(start: step.cursor[1]) do |record|
record.process
step.set!([account.id, record.id + 1])
end
step.set!([account.id + 1, 0])
end
endRecurring Jobs Khong Can Cron
Solid Queue thay the viec lap lich dua tren cron bang mot scheduler tich hop san. Cac tac vu dinh ky duoc khai bao trong file cau hinh YAML va duoc quan ly boi scheduler process.
# config/recurring.yml
production:
cleanup_expired_sessions:
class: CleanupExpiredSessionsJob
schedule: every 6 hours
daily_report:
class: DailyReportJob
schedule: every day at 6am
queue: reports
weekly_digest:
class: WeeklyDigestJob
schedule: every Monday at 9amScheduler process doc file cau hinh nay va enqueue cac jobs tuong ung theo lich da dinh nghia. Khac voi cron, scheduler chay trong cung process supervisor va chia se cung database connection. Ho tro timezone duoc them vao tu Solid Queue 1.5.0.
Trien Khai voi Puma Integration
Rails 8 ket hop voi Kamal cung cap trien khai zero-configuration cho Solid Queue. Thiet lap bien moi truong SOLID_QUEUE_IN_PUMA=1 cho phep Puma fork va giam sat cac Solid Queue processes song song voi web server.
# config/puma.rb (Rails 8 default)
plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"]Mo hinh trien khai single-process nay don gian hoa viec dieu phoi container. Mot Docker image duy nhat chay dong thoi ca web server va job processors, giam chi phi van hanh cho cac ung dung vua va nho.
Sẵn sàng chinh phục phỏng vấn Ruby on Rails?
Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.
Solid Cache: He Thong Caching Database-Backed Co Kha Nang Mo Rong
Solid Cache la mot ActiveSupport::Cache::Store su dung co so du lieu quan he, tan dung hieu nang cua SSD hien dai de thay the Redis va Memcached lam bo nho dem mac dinh. Tien de cot loi: SSD chi cham hon RAM mot cach khong dang ke trong cac thao tac doc, nhung cung cap dung luong luu tru lon hon nhieu bac voi chi phi thap hon dang ke. Solid Cache dang duoc su dung trong production tai Basecamp voi dung luong 10TB va thoi gian luu giu 60 ngay, cat giam thoi gian render P95 xuong mot nua.
Solid Cache su dung chien luoc het han FIFO (First In, First Out) thay vi LRU (Least Recently Used). Mac du FIFO ve mat ly thuyet kem hieu qua hon LRU, dung luong luu tru lon hon rat nhieu lan se bu dap hoan toan, cac entry duoc luu trong cache lau hon, giam thieu cache misses tong the.
# config/environments/production.rb
config.cache_store = :solid_cache_store
# config/solid_cache.yml
production:
databases:
- cache
store_options:
max_age: 604800 # 1 week in seconds
max_size: 256 # Max entry size in KB
namespace: "app_v1"
expiry_batch_size: 100 # Entries cleaned per expiry cycleKien Truc Cache va Co Che Het Han
Solid Cache theo doi cac thao tac ghi thong qua mot bo dem noi bo. Khi bo dem dat 50% gia tri expiry_batch_size da cau hinh, mot tac vu nen duoc kich hoat de don dep cac entry da het han. Cach tiep can phan bo chi phi (amortized) nay tranh duoc hien tuong "stop-the-world" pauses co the xay ra voi co che LRU eviction trong cac Redis instances bi gioi han bo nho.
Bang solid_cache_entries luu tru toan bo du lieu cache:
# db/cache_schema.rb (generated by installer)
create_table :solid_cache_entries do |t|
t.binary :key, null: false, limit: 1024
t.binary :value, null: false, limit: 262144 # 256 KB default
t.datetime :created_at, null: false
t.index :key, unique: true
t.index :created_at # For FIFO expiry
endCac thao tac doc va ghi vao bang nay su dung cung connection pool voi phan con lai cua ung dung theo mac dinh. Cho cac ung dung high-traffic, cau hinh database rieng cho du lieu cache ngan chan cache churn anh huong den hieu nang database chinh.
Cau Hinh Co So Du Lieu Rieng cho Cache
Viec tach rieng Solid Cache sang mot co so du lieu chuyen dung kha don gian va duoc khuyen nghi cho cac workloads production tao ra luong cache traffic dang ke.
# config/database.yml
production:
primary:
<<: *default
database: myapp_production
cache:
<<: *default
database: myapp_cache_production
migrations_paths: db/cache_migrateViec tach rieng nay dam bao hang trieu thao tac ghi cache khong lam phinh to WAL (Write-Ahead Log) cua co so du lieu chinh va khong tranh gianh connection pool slots voi cac application queries.
Neu khong cau hinh co so du lieu rieng, cac thao tac doc ghi cua Solid Cache se tham gia vao bat ky ActiveRecord transaction nao dang bao boc. Dieu nay co nghia mot transaction chay lau se giu cac cache entries o trang thai uncommitted. Can luon cau hinh database cache chuyen dung cho cac ung dung production.
Sharding va Ma Hoa Du Lieu Cache
Solid Cache ho tro phan manh (sharding) du lieu cache qua nhieu co so du lieu de phan tan tai. Ngoai ra, Solid Cache con ho tro encrypted attributes, du lieu cache duoc ma hoa khi luu tru (encrypted at rest), dap ung yeu cau tuan thu bao mat cho cac ung dung xu ly thong tin nhay cam.
# config/solid_cache.yml
production:
databases:
- cache_shard_1
- cache_shard_2
- cache_shard_3
store_options:
max_age: 1209600 # 2 weeksCac entry duoc phan phoi qua cac shards bang co che consistent hashing dua tren cache key. Viec them hoac xoa shards se gay ra su tang tam thoi trong ty le cache miss khi cac entry duoc tai phan phoi, nhung khong xay ra mat du lieu.
Giam Sat voi Mission Control Jobs
Mission Control Jobs cung cap mot web dashboard de kiem tra va quan ly cac Solid Queue jobs. Dashboard hien thi trang thai cua workers, hang doi va cac trang thai jobs (dang xu ly, da hoan thanh, bi chan, that bai) thong qua mot Rails engine duoc mount vao ung dung.
# config/routes.rb
Rails.application.routes.draw do
mount MissionControl::Jobs::Engine, at: "/jobs"
end
# Gemfile
gem "mission_control-jobs", ">= 1.0.1"Mission Control cung cung cap console API cho cac thao tac hang loat tren failed jobs:
# Rails console
ActiveJob.jobs.failed.where(job_class: "ApiSyncJob").retry_all
ActiveJob.jobs.failed.where(job_class: "BrokenJob").discard_allKha nang truy cap lap trinh nay rat quan trong de xu ly cac that bai job quy mo lon ma khong can click thu cong qua giao dien dashboard.
Sources
- Rails 8.0 Release Notes - Tai lieu chinh thuc ve Solid Queue va Solid Cache defaults
- Solid Queue GitHub Releases - Changelog cho batches (v1.7.0), fiber mode (v1.6.0), va ho tro continuations (v1.2.0)
- Active Job Continuations PR - Chi tiet implementation cua Rails 8.1
- Introducing Solid Queue (37signals) - Ly do thiet ke va su dung production tai HEY
Cac Cau Hoi Phong Van Ky Thuat Trong Tam
Cac buoi phong van Rails 8 ngay cang tap trung vao Solid Stack. Duoi day la nhung cau hoi xuat hien thuong xuyen nhat, kem theo muc do chi tiet ma nha tuyen dung mong doi.
Hoi: Solid Queue dat duoc xu ly jobs dong thoi nhu the nao ma khong can Redis?
Solid Queue su dung FOR UPDATE SKIP LOCKED, mot menh de SQL cho phep nhieu workers poll cung mot bang ma khong bi blocking lan nhau. Moi worker khoa mot batch rows, xu ly chung va xoa cac execution records sau khi hoan thanh. Cac workers khac tu dong bo qua cac rows da bi khoa va claim nhung jobs khac.
Hoi: Transactional enqueuing giai quyet van de gi cu the?
Transactional enqueuing ngan chan viec jobs thuc thi truoc khi database transaction kich hoat chung commit thanh cong. Thieu co che nay, mot job co the tham chieu den mot ban ghi da bi rollback, gay ra loi ActiveRecord::RecordNotFound.
Hoi: Tai sao Solid Cache su dung FIFO thay vi LRU? FIFO don gian hon de trien khai trong co so du lieu va tranh duoc write amplification khi phai cap nhat access timestamps moi lan doc. Su danh doi nay duoc bu dap boi dung luong SSD, cac entry ton tai lau hon, nen ty le hit van cao mac du chien luoc eviction kem toi uu hon ve mat ly thuyet.
Hoi: Job batches trong Solid Queue hoat dong nhu the nao?
Jobs duoc enqueue trong block SolidQueue::Batch.enqueue duoc theo doi cung nhau. Batch goi on_finish khi tat ca jobs hoan thanh, on_success neu tat ca thanh cong, hoac on_failure neu bat ky job nao that bai. Dieu nay cho phep cac workflow nhu batch imports, noi buoc cuoi cung phu thuoc vao viec tat ca cac phan hoan thanh.
Hoi: Active Job Continuations la gi va khi nao nen su dung? Continuations cho phep jobs chay lau luu checkpoint tien do va tiep tuc sau khi bi gian doan. Su dung cho cac jobs xu ly datasets lon, nhu imports hoac batch updates, noi viec khoi dong lai tu dau sau moi lan deploy se lang phi thoi gian va tai nguyen dang ke.
Hoi: Khi nao mot ung dung nen tiep tuc su dung Redis thay vi Solid Stack? Redis van vuot troi cho cac ung dung xu ly hon 10.000 jobs moi phut, cac workloads yeu cau cache reads duoi mili-giay, hoac cac ung dung da su dung Redis cho cac muc dich khac nhu Pub/Sub, rate limiting hoac session storage. Solid Stack huong den su don gian trong van hanh, khong phai thong luong dinh cao.
Luyen tap cac cau hoi nay va nhieu cau hoi khac tren module ActiveJob va Background Jobs cua SharpSkill va module Caching Strategies.
Sẵn sàng chinh phục phỏng vấn Ruby on Rails?
Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.
Dieu Can Nho ve Solid Queue va Solid Cache trong Rails 8
- Solid Queue thay the hang doi jobs dua tren Redis bang giai phap database-backed su dung co che
FOR UPDATE SKIP LOCKEDcho xu ly dong thoi - Transactional enqueuing loai bo race conditions giua database writes va job execution, mot dam bao ma Redis khong the cung cap
- Job batches (v1.7.0) cho phep cac thao tac theo nhom voi completion callbacks, truoc day la tinh nang cua Sidekiq Pro
- Che do thuc thi fiber (v1.6.0) cai thien throughput cho workloads I/O-bound nhu goi API LLM
- Active Job Continuations (Rails 8.1) cho phep jobs chay lau luu checkpoint va tiep tuc sau khi bi gian doan
- Concurrency controls tich hop san, recurring jobs va Puma integration di kem voi Solid Queue hoan toan mien phi
- Solid Cache su dung SSD-backed FIFO caching voi kha nang sharding va ma hoa tuy chon, loai bo Memcached va Redis khoi stack ha tang
- Cau hinh database rieng cho Solid Cache ngan chan cache churn anh huong den hieu nang co so du lieu chinh
- Mission Control Jobs cung cap giam sat production va quan ly jobs hang loat thong qua web dashboard va console API
- Doi voi phan lon ung dung Rails 8 trong nam 2026, Solid Stack la lua chon mac dinh duoc khuyen nghi. Redis chi con can thiet cho cac truong hop high-throughput vuot qua 10.000 jobs moi phut
Bắt đầu luyện tập!
Kiểm tra kiến thức với mô phỏng phỏng vấn và bài kiểm tra kỹ thuật.
Bạn có tìm ra lỗi trong Ruby on Rails không?
Một đoạn mã thật, một lỗi ẩn, mỗi ngày một lượt. Không cần tài khoản để thử.

Viết bởi
Anthony Fillion-MailletNgười sáng lập SharpSkill
Lập trình viên fullstack hơn 10 năm. Anh điều hành SharpSkill và chịu trách nhiệm về mọi nội dung đăng tại đây.
Cập nhật ngày 10 tháng 10, 2026
Thẻ
Chia sẻ
Bài viết liên quan

Ruby on Rails 8: Tính năng mới và Hướng dẫn nâng cấp toàn diện 2026
Rails 8 giới thiệu Solid Trifecta, xác thực tích hợp, Kamal 2 và Propshaft. Hướng dẫn đầy đủ với mã mẫu và các bước nâng cấp từ Rails 7.

Việc Làm Lập Trình Viên Ruby on Rails 2026: Nơi Tìm Kiếm, Mức Lương, Cách Chuẩn Bị
Hướng dẫn toàn diện về việc làm lập trình viên Ruby on Rails năm 2026. Khám phá nền tảng tuyển dụng, kỳ vọng mức lương và chiến lược chuẩn bị phỏng vấn kỹ thuật.

Rails Service Objects năm 2026: Design Patterns, PORO và Câu hỏi Phỏng vấn Kỹ thuật
Thành thạo service objects trong Rails với các pattern PORO, Result monad và clean architecture. Bao gồm câu hỏi phỏng vấn thực tế và ví dụ code production-ready cho Rails 8.