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.

Kien truc Solid Queue va Solid Cache trong Rails 8 voi xu ly job va caching dua tren co so du lieu

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.

Bo Ba Solid Stack trong Rails 8

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_executions va nhan jobs thong qua co che SKIP LOCKED, dam bao khong co hai worker nao xu ly cung mot job
  • Dispatchers di chuyen cac scheduled jobs tu bang solid_queue_scheduled_executions sang bang ready khi thoi diem thuc thi den
  • Schedulers quan ly cac tac vu dinh ky duoc khai bao trong file cau hinh YAML
ruby
# config/solid_queue.yml
production:
  dispatchers:
    - polling_interval: 1
      batch_size: 500
  workers:
    - queues: "*"
      threads: 5
      polling_interval: 0.1
      processes: 2

Cau 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.

ruby
# 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
end

Voi 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.

ruby
# 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
end

Cau 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.

Goi Y Phong Van

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.

ruby
# 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
end

Batch 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.

ruby
# config/solid_queue.yml
production:
  workers:
    - queues: [llm_calls, external_apis]
      fibers: 100
      polling_interval: 0.5

Voi 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:

ruby
# config/application.rb
config.active_support.isolation_level = :fiber

Cac 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.

ruby
# 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
end

Method 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.

Yeu Cau Adapter

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:

ruby
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
end

Recurring 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.

ruby
# 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 9am

Scheduler 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.

ruby
# 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.

ruby
# 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 cycle

Kien 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:

ruby
# 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
end

Cac 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.

yaml
# config/database.yml
production:
  primary:
    <<: *default
    database: myapp_production
  cache:
    <<: *default
    database: myapp_cache_production
    migrations_paths: db/cache_migrate

Viec 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.

Luu Y Quan Trong cho Moi Truong Production

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.

ruby
# config/solid_cache.yml
production:
  databases:
    - cache_shard_1
    - cache_shard_2
    - cache_shard_3
  store_options:
    max_age: 1209600  # 2 weeks

Cac 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.

ruby
# 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:

ruby
# Rails console
ActiveJob.jobs.failed.where(job_class: "ApiSyncJob").retry_all
ActiveJob.jobs.failed.where(job_class: "BrokenJob").discard_all

Kha 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

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 LOCKED cho 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.

Thử thách hôm nay

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ử.

Anthony Fillion-Maillet

Viết bởi

Anthony Fillion-Maillet

Ngườ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ẻ

#ruby-on-rails
#solid-queue
#solid-cache
#rails-8
#background-jobs
#caching
#interview

Chia sẻ

Bài viết liên quan