-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add GoodJob as Active Job backend #47
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -57,7 +57,7 @@ | |
# Exclude healthcheck endpoint from force SSL since healthchecks should not go through | ||
# the reverse proxy. | ||
# See https://api.rubyonrails.org/classes/ActionDispatch/SSL.html | ||
config.ssl_options = { redirect: { exclude: -> request { /health/.match?(request.path) } } } | ||
config.ssl_options = { redirect: { exclude: ->(request) { /health/.match?(request.path) } } } | ||
|
||
# Log to STDOUT by default | ||
config.logger = ActiveSupport::Logger.new(STDOUT) | ||
|
@@ -75,9 +75,13 @@ | |
# Use a different cache store in production. | ||
# config.cache_store = :mem_cache_store | ||
|
||
# Use a real queuing backend for Active Job (and separate queues per environment). | ||
# config.active_job.queue_adapter = :resque | ||
# config.active_job.queue_name_prefix = "app_rails_production" | ||
# Use "GoodJob" for Active Job backend - docs at https://github.com/bensheldon/good_job | ||
# GoodJob was picked as a default because it uses Postgres (already a part of this template) | ||
# and has good adoption and maintenence. | ||
Comment on lines
+79
to
+80
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should get moved to an ADR and a link to that should be added here. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Will do, thanks! |
||
config.active_job.queue_adapter = :good_job | ||
# This mode of execution runs jobs async in the same thread pool as the Rails server. | ||
# Choose the best way to run queued jobs for your project. | ||
config.good_job.execution_mode = :async | ||
|
||
config.action_mailer.delivery_method = :sesv2 | ||
config.action_mailer.perform_caching = false | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
# frozen_string_literal: true | ||
|
||
class CreateGoodJobs < ActiveRecord::Migration[7.1] | ||
def change | ||
# Uncomment for Postgres v12 or earlier to enable gen_random_uuid() support | ||
# enable_extension 'pgcrypto' | ||
|
||
create_table :good_jobs, id: :uuid do |t| | ||
t.text :queue_name | ||
t.integer :priority | ||
t.jsonb :serialized_params | ||
t.datetime :scheduled_at | ||
t.datetime :performed_at | ||
t.datetime :finished_at | ||
t.text :error | ||
|
||
t.timestamps | ||
|
||
t.uuid :active_job_id | ||
t.text :concurrency_key | ||
t.text :cron_key | ||
t.uuid :retried_good_job_id | ||
t.datetime :cron_at | ||
|
||
t.uuid :batch_id | ||
t.uuid :batch_callback_id | ||
|
||
t.boolean :is_discrete | ||
t.integer :executions_count | ||
t.text :job_class | ||
t.integer :error_event, limit: 2 | ||
t.text :labels, array: true | ||
t.uuid :locked_by_id | ||
t.datetime :locked_at | ||
end | ||
|
||
create_table :good_job_batches, id: :uuid do |t| | ||
t.timestamps | ||
t.text :description | ||
t.jsonb :serialized_properties | ||
t.text :on_finish | ||
t.text :on_success | ||
t.text :on_discard | ||
t.text :callback_queue_name | ||
t.integer :callback_priority | ||
t.datetime :enqueued_at | ||
t.datetime :discarded_at | ||
t.datetime :finished_at | ||
end | ||
|
||
create_table :good_job_executions, id: :uuid do |t| | ||
t.timestamps | ||
|
||
t.uuid :active_job_id, null: false | ||
t.text :job_class | ||
t.text :queue_name | ||
t.jsonb :serialized_params | ||
t.datetime :scheduled_at | ||
t.datetime :finished_at | ||
t.text :error | ||
t.integer :error_event, limit: 2 | ||
t.text :error_backtrace, array: true | ||
t.uuid :process_id | ||
end | ||
|
||
create_table :good_job_processes, id: :uuid do |t| | ||
t.timestamps | ||
t.jsonb :state | ||
t.integer :lock_type, limit: 2 | ||
end | ||
|
||
create_table :good_job_settings, id: :uuid do |t| | ||
t.timestamps | ||
t.text :key | ||
t.jsonb :value | ||
t.index :key, unique: true | ||
end | ||
|
||
add_index :good_jobs, :scheduled_at, where: "(finished_at IS NULL)", name: :index_good_jobs_on_scheduled_at | ||
add_index :good_jobs, [ :queue_name, :scheduled_at ], where: "(finished_at IS NULL)", name: :index_good_jobs_on_queue_name_and_scheduled_at | ||
add_index :good_jobs, [ :active_job_id, :created_at ], name: :index_good_jobs_on_active_job_id_and_created_at | ||
add_index :good_jobs, :concurrency_key, where: "(finished_at IS NULL)", name: :index_good_jobs_on_concurrency_key_when_unfinished | ||
add_index :good_jobs, [ :cron_key, :created_at ], where: "(cron_key IS NOT NULL)", name: :index_good_jobs_on_cron_key_and_created_at_cond | ||
add_index :good_jobs, [ :cron_key, :cron_at ], where: "(cron_key IS NOT NULL)", unique: true, name: :index_good_jobs_on_cron_key_and_cron_at_cond | ||
add_index :good_jobs, [ :finished_at ], where: "retried_good_job_id IS NULL AND finished_at IS NOT NULL", name: :index_good_jobs_jobs_on_finished_at | ||
add_index :good_jobs, [ :priority, :created_at ], order: { priority: "DESC NULLS LAST", created_at: :asc }, | ||
where: "finished_at IS NULL", name: :index_good_jobs_jobs_on_priority_created_at_when_unfinished | ||
add_index :good_jobs, [ :priority, :created_at ], order: { priority: "ASC NULLS LAST", created_at: :asc }, | ||
where: "finished_at IS NULL", name: :index_good_job_jobs_for_candidate_lookup | ||
add_index :good_jobs, [ :batch_id ], where: "batch_id IS NOT NULL" | ||
add_index :good_jobs, [ :batch_callback_id ], where: "batch_callback_id IS NOT NULL" | ||
add_index :good_jobs, :labels, using: :gin, where: "(labels IS NOT NULL)", name: :index_good_jobs_on_labels | ||
|
||
add_index :good_job_executions, [ :active_job_id, :created_at ], name: :index_good_job_executions_on_active_job_id_and_created_at | ||
add_index :good_jobs, [ :priority, :scheduled_at ], order: { priority: "ASC NULLS LAST", scheduled_at: :asc }, | ||
where: "finished_at IS NULL AND locked_by_id IS NULL", name: :index_good_jobs_on_priority_scheduled_at_unfinished_unlocked | ||
add_index :good_jobs, :locked_by_id, | ||
where: "locked_by_id IS NOT NULL", name: "index_good_jobs_on_locked_by_id" | ||
add_index :good_job_executions, [ :process_id, :created_at ], name: :index_good_job_executions_on_process_id_and_created_at | ||
end | ||
end |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you think we need a
queue_name_prefix
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You have a lot more Rails expertise than I do so please LMK if this is the wrong line of thinking, but since jobs are queued using a table in the DB I don't think that we'd need to worry about a prefix since we won't be sharing the database across environments? I would think that the queue prefix might be more necessary if we were doing something like sharing a Redis instance across multiple environments, for example.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good point!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
After looking at this and thinking about it more, I think we should move this line:
out of the per-environment files and into
/app-rails/config/application.rb
. What do you think? Good Jobs should definitely be used in themock-production
environment. I'm not sure what it might do to the test environment, though. Thoughts?