Skip to content

Solid Cable, Solid Cache and Solid Queue

Real-time Messaging with Solid Cable

แก้ config/database.yml เพิ่ม cable ไปใน development (ถ้าใช้บน Production ก็เพิ่มใน production)

แล้วก็ไปแก้ config/cable.yml เพื่อไปบอกว่า Database ไหนที่เราจะใช้ ให้เปลี่ยนจาก Adapter ที่เป็น async เป็น solid_cable (เอาของ Production มาใช้ได้) ตรงค่าของ writing ก็ให้ตั้งชื่อให้ตรงกับที่เราเซตไว้ที่ไฟล์ config/database.yml ซึ่งในที่นี้คือ cable

เราจะไปเพิ่ม <%= turbo_stream_from @something, "channel_name" %> ตรงที่เราอยากจะรอ Event

Caching with Solid Cache

Referecens

Managing Asynchronous Tasks with Solid Queue

rails g job task_archiver_job
class TaskArchiverJob < ApplicationJob
  queue_as :default

  def perform(*args)
    Task.where(status: "completed").update_all(status: "archived")
  end
end

ปรับโค้ดเป็นแบบนี้ได้ เพราะ Method นี้ไม่ได้รับค่าอะไรเข้ามาใช้งาน

  def perform
    Task.where(status: "completed").update_all(status: "archived")
  end

เข้าไปแก้ config/database.yml เพิ่ม queue ใน development

ต่อไปเราจะ Configure ให้ Development Environment ของเราไปใช้ Solid Queue เป็น Queue Adapter ให้เข้าไปที่ไฟล์ config/environments/development.rb ให้แก้ค่าของ config.active_job.queue_adapter เป็น :solid_queue และค่าของ config.solid_queue.connects_to เป็น { database: { writing: :queue } }

ทดสอบการรัน Job โดยให้เข้าไปที่ Rails Console

TaskArchiverJob.perform_later

แล้วเราค่อยรันคำสั่งด้านล่างนี้

bin/jobs

เพื่อให้รัน Solid Queue

Solid Queue มี Scheduler Process ด้วย ทำให้เราสามารถสร้าง Recurring Jobs ได้ ให้เราเข้าไปที่ไฟล์ config/recurring.yml แล้วให้เพิ่ม development เข้าไป

development:
  periodic_cleanup:
    class: TaskArchiverJob
    queue: background
    schedule: every 30 seconds

Mission Control — Jobs

แก้ Gemfile เพิ่มบรรทัดด้านล่างนี้เข้าไป

gem "mission_control-jobs"

เสร็จแล้วสั่ง

mise exec ruby -- bundle install

หรือใช้คำสั่งด้านล่างนี้คำสั่งเดียวก็ได้

mise exec ruby -- bundle add mission_control-jobs

หลังจากติดตั้งเสร็จแล้วให้เรา Configure ตามนี้ Basic configuration

rails g controller Admin
class AdminController < ActionController::Base
  http_basic_authentication_with name: ENV['ADMIN_NAME'], password: ENV['ADMIN_PASSWORD']
end
class AdminController < ActionController::Base
  http_basic_authentication_with name: "admin", password: "password"
end

เพิ่มบรรทัดด้านล่างนี้ใน config/application.rb

config.mission_control.jobs.base_controller_class = "AdminController"