ð ã¯ããã« æ ªåŒäŒç€Ÿã¹ã¿ã¡ã³ã«ãŠãã©ãããã©ãŒã éšã§ SRE / DevEx ãªã©ã«åãçµãã§ããããããã§ããä»å㯠Ruby on Rails ã¢ããªã±ãŒã·ã§ã³ã« Solid Queue ãå°å
¥ãããè©±ãæžãããšæããŸãã ãããªäººã«èªãã§ãããããšããããæããŸãã Solid Queue ã«èå³ããã Ruby on Rails ã¢ããªã±ãŒã·ã§ã³ã§æè»œã«å®æå®è¡ãžã§ããäœããã ãã§ã«çšŒåããŠãã宿å®è¡ãžã§ãã® Solid Queue ãžã®ãªãã¬ã€ã¹ãæ€èšããŠãã ð¡ Solid Queueãšã¯ïŒ DBå®çµåãžã§ããã¥ãŒã®åºç€ Solid Queue 㯠Active Job åãã«èšèšããããDBããŒã¹ã®ãã¥ãŒã€ã³ã°ããã¯ãšã³ãã§ãã Sidekiq ã Resque ã®ããã« Redis ãªã©ã®å€éšãµãŒãã¹ãäžèŠ Recurring Tasks æ©èœãå©çšããããšã§ Cronã®ããã«ãèšå®ãããã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠãžã§ããèªåçã«å®æå®è¡ã§ãã å©çšããDBã¯æ¢åã¢ããªã±ãŒã·ã§ã³ãšå
±åããããšã Solid Queue ç¬èªã§åé¢ããããšãã§ãã ð å°å
¥ã®èæ¯ ãžã§ãã宿å®è¡ãããã£ãããã§ãã ã¹ã¿ã¡ã³ã®äž»åäºæ¥ TUNAGïŒããã°ïŒ 㯠TUNAGã®ã³ã¢éšåïŒä»¥éãTUNAGæ¬äœïŒãšæ©èœåäœã§åãåºããè€æ°ãµãŒãã¹ã飿ºããŠåäœããŠããŸãããæ©èœåäœã§åãåºããã¿ã¹ã¯æ©èœãµãŒãã¹ã§å®æçã«å®è¡ãããåŠçããããŸããã ããããªãããã¿ã¹ã¯æ©èœãµãŒãã¹ã«ã¯ãžã§ãã宿å®è¡ããåºç€ããªãã£ããããåºç€æ§ç¯ããå§ããããšãšãªããŸããã âïž æ¢åã®å®æå®è¡ã·ã¹ãã ïŒAWS/ECS飿ºã®ã¢ãŒããã¯ã㣠ãŸãã¯æ¢åã®å®æå®è¡ãã©ã®ããã«åããŠãããã確èªããŸããã TUNAGæ¬äœã§ã¯ elastic_whenever gem ãå©çšã㊠ECS Scheduled Task ã«ãŠ rake ã¿ã¹ã¯ãå®è¡ããŠããŸãã rake ã¿ã¹ã¯ã远å ããŠå®æå®è¡ãããŸã§ã®æµãã¯äžèšãšãªããŸãã ãããã¯ãã³ãŒãã«ãŠç®¡çããã¹ã±ãžã¥ãŒã«ãã¡ã€ã« config/schedule.rb ã§äžèšã®ããã«å®çŸ©ãã every ' */5 * * * * ' do # 5 åãã rake ' scheduled:foo:bar_baz ' end ãããã€æã«å®çŸ©å
容ãã Amazon EventBridge ã«ãŒã«ãäœæãã Amazon EventBridge ã«ãŒã«ã®ã€ãã³ãã¹ã±ãžã¥ãŒã«ã§ECSã¿ã¹ã¯ãèµ·åã㊠rake ã¿ã¹ã¯ãå®è¡ããã ECS Scheduled Task ãå©çšãã宿åŠçã«ã€ããŠã¯ 2021幎ã®ããã¯ããã°ã§ã玹ä»ããŠããŸã tech.stmn.co.jp ãã®ã¢ãŒããã¯ãã£ã®å Žåããžã§ããåããããã«AWSåŽã®èšå®ãè¡ãå¿
èŠããããŸããã ã©ã®ããã«å®çŸããŠããã®ãå
šäœåã®çè§£ãããé£ãããšæããŠããŸãã â
Solid Queueãéžãã çç±ïŒRedis/AWSããã®è±åŽ æ¢åã®å®æå®è¡ã®ä»çµã¿ãææ¡ããããã§ãæ°ããã¿ã¹ã¯æ©èœãµãŒãã¹ã«å°å
¥ãã宿å®è¡ã®åºç€ãšã㊠Solid Queue ãéžã³ãŸããã è€éãªã€ã³ãã©ç°å¢ã®èšå®ã¯ãªãã¹ãè¡ããããªã ãªãã¹ãæšæºä»¥å€ã®æ°ããã©ã€ãã©ãªã¯å¢ãããããªãã£ã Solid Queue ãå°ãããšããããå°å
¥ã詊ããŠã¿ããã£ã ECS Scheduled Task ãå©çšããä»çµã¿ã¯å®çžŸããããŸãããAWSåŽã®èšå®ãè¡ããªã©ã®æºåãå€ããä»åã¯ãªãã¹ããã®æéãæžããããã£ãã ã¹ã¿ã¡ã³ã§ã¯å©çšã©ã€ãã©ãªã®ã¢ããããŒããæ¯é±è¡ã£ãŠããããã®å¯Ÿè±¡ãå¢ãããããelastic_whenever ã®ãã㪠gem ããªãã¹ãå¢ãããããªãã£ããäžæ¹ã§ Solid Queue ã¯ãRuby on Rails ã®äžéšã§ãããããgem ãå¢ããŠã蚱容ã§ãããšèããŸããã 以äžãçç±ã®ïŒã€ã§ãããçµå±ã¯ã Solid Queue ã詊ããŠã¿ãã ãäžçªã®çç±ã§ãã ã¿ã¹ã¯æ©èœãµãŒãã¹ã¯åœ±é¿ç¯å²ãçµãããå°ãããµãŒãã¹ãªã®ã§å°å
¥ã詊ããŠã¿ãã«ã¯æé©ã§ããã ð¥ïž Mission Control â JobsïŒçšŒåç¶æ³ã®ç¢ºèª åŸè¿°ã®å°å
¥æé ã§èšå®ãå®äºãããžã§ããåãããã«ãªã£ãã Mission Control â Jobs ã§å®è¡ç¶æ³ã確èªã§ããŸãã Sidekiq ã®ããã·ã¥ããŒããšæ¯ã¹ããšéåžžã«ã·ã³ãã«ãªå°è±¡ã§ãã æ¬çªã§åããŠãã Mission Control â Jobs ã®ç»é¢ãããã¯ã¢ããããŠã玹ä»ããŸãã Recurring tasks ã¿ãïŒã¹ã±ãžã¥ãŒã«ã®äžå
管ç ããã Solid Queue ã«ãã宿å®è¡ã®æå€§ã®ã¡ãªããã瀺ãç»é¢ã§ãã åŸæ¥ã config/schedule.rb ãã¡ã€ã«ã Amazon EventBridge ã«ãŒã«ã«åæ£ããŠããã¹ã±ãžã¥ãŒã«å®çŸ©ãããªããžããªå
ã® config/recurring.yml ãã¡ã€ã«ã«éçŽããããã®å®è¡ç¶æ³ããã®ããã·ã¥ããŒãã§äžå
管çã§ããŸãã RecurringïŒïŒç¹°ãè¿ãïŒã®ã¿ã¹ã¯ãšããŠç»é²ãããžã§ãã確èªã§ããŸã ïŒã€ç®ã®ãžã§ãã§ããã°ãæãéã® 10:00 ã«ç¹°ãè¿ãå®è¡ããŸã Run now ãæŒäžãããšãžã§ãã峿å®è¡ã§ããŸã Finished jobs ã¿ã å®äºãããžã§ããäžèЧã§ç¢ºèªã§ããŸã Finished jobs 詳现 å®è¡ã«ããã£ãæéãªã©ã確èªã§ããŸã ð ïž å°å
¥æé ä»åå°å
¥ã®ããã«è¡ã£ãæé ã§ãã Solid Queue ãš Mission Control â Jobs ãå°å
¥ããŸãã ããããããšã«ãã£ãŠã¯èšå®ãç°ãªãå¯èœæ§ãããã®ã§ããããŸã§åèãšããŠèªãã§ãã ããã åææ¡ä»¶ Active Record ãã€ã°ã¬ãŒã·ã§ã³ã§ããŒã¿ããŒã¹ã¹ããŒãã®ãã€ã°ã¬ãŒã·ã§ã³ãè¡ã£ãŠãã Solid Queue ã®ããŒãã«ã¯æ¢åã®DBã«æå
¥ãããç¬èªã®DBã¯çšæããªã Solid Queue äž»ã«ã¯ Solid Queue ã® README ããã³ README ã®ç¿»èš³èšäºãåèã«ããŸãã github.com techracho.bpsinc.jp Gemfile ã« gem "solid_queue" ã远å ãã bundle install ã§äŸåãã gem ãã€ã³ã¹ããŒã«ããGemfile.lock ãæŽæ°ãã bin/rails solid_queue:install ãå®è¡ãã # bin/rails solid_queue:install create config/queue.yml create config/recurring.yml create db/queue_schema.rb create bin/jobs gsub config/environments/production.rb Solid Queue çšã®ãã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ãäœæãã åæé ã§ Solid Queue ã§å©çšããããŒãã«ã®ã¹ããŒãå®çŸ©ã db/queue_schema.rb ãã¡ã€ã«ãšããŠäœããããããã®ãã¡ã€ã«ãã§ããã ãã§ã¯ Active Record ãã€ã°ã¬ãŒã·ã§ã³ã§DBã«ããŒãã«ã¯äœãããªã ãã€ã°ã¬ãŒã·ã§ã³ãå®è¡ããããã«ãã¡ã€ã«ãäœæãã # bundle exec rails generate migration CreateSolidQueueTables invoke active_record create db/migrate/20250819042726_create_solid_queue_tables.rb äœæãã Solid Queue çšã®ãã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ã« db/queue_schema.rb ãã¡ã€ã«ã®å
容ãåæ ãã db/queue_schema.rb ã®ããŒãã«åãã«ã©ã åã¯æååã§æå®ãããŠããã®ã§æååã Symbol ã«çœ®ãæã ããã¯ãã€ã°ã¬ãŒã·ã§ã³ãã¡ã€ã«ã¯åºæ¬ã Symbol ã§å®çŸ©ããŠããããã®å¯Ÿå¿ æ£èŠè¡šçŸã«ãŠæååã眮ãæãã ãã€ã°ã¬ãŒã·ã§ã³ãå®è¡ Solid Queue çšããŒãã«ãšå€éšããŒãDBã«åæ ãããåãã㊠db/schema.rb ãæŽæ°ããã # bin/rails db:migrate == 20250819042726 CreateSolidQueueTables: migrating =========================== -- create_table(:solid_queue_blocked_executions, {force: :cascade}) -> 0.0317s ... çç¥ ... == 20250819042726 CreateSolidQueueTables: migrated (0.3559s) ================== -- execute("SELECT extversion FROM pg_extension WHERE extname = 'citus'") Model files unchanged. åäœç¢ºèªçšãžã§ãã bin/rails generate job ã§äœæãã ã¯ãããŠãžã§ããçæããå Žåã app/jobs/application_job.rb ãäœããã # bin/rails generate job FooBar::BazQuxJob invoke rspec create spec/jobs/foo_bar/baz_ qux_job_spec.rb create app/jobs/foo_bar/baz_qux_job.rb create app/jobs/application_job.rb åäœç¢ºèªçšãžã§ããä¿®æ£ãã queue_as ã§æå®ãã queue ãä»»æã§å€æŽãã å®è¡ããããšã確èªã§ããããã«ãã°åºåã ãå®è£
ãã class FooBar :: BazQuxJob < ApplicationJob queue_as :background # generate ãããšã㯠default ãšãªã£ãŠãã def perform (*args) Rails .logger.info( " FooBar::BazQuxJob called with args: #{ args.inspect }" ) end end èªåçæããã ApplicationJob ã確èªãã self.queue_adapter = :solid_queue ã§ããããš ããã«ããã ApplicationJob ãç¶æ¿ããã¯ã©ã¹ã Solid Queue ã«ãŠå®è¡ããã class ApplicationJob < ActiveJob :: Base self .queue_adapter = :solid_queue # Automatically retry jobs that encountered a deadlock # retry_on ActiveRecord::Deadlocked # Most jobs are safe to ignore if the underlying records are no longer available # discard_on ActiveJob::DeserializationError end config/recurring.yml ã«ãŠåäœç¢ºèªçšãžã§ããã¹ã±ãžã¥ãŒãªã³ã°ãã queue 㯠åäœç¢ºèªçšãžã§ã ã® queue_as ã§æå®ãã queue ãšäžèŽããã åäœç¢ºèªããããããã«çãåšæã®ïŒåããšã«å®è¡ãã default : &default foo_bar_baz_qux : class : FooBar::BazQuxJob queue : background schedule : every 1 minutes development : <<: *default production : <<: *default config/application.rb ãä¿®æ£ # require "active_job/railtie" ã®ã³ã¡ã³ãã¢ãŠããå€ããŠãActiveJob ãæå¹å æ»æŽ»ç£èŠã®ããã« supervisor ã®PIDãã¡ã€ã«ãäœæããããã«ãã config.solid_queue.supervisor_pidfile = Rails .application.root.join( " tmp/pids/solid_queue_supervisor.pid " ) config/queue.yml ãå¿
èŠã«å¿ããŠä¿®æ£ãã 䞊åã§ãžã§ããå®è¡ããå Žåãthreadsãprocesses ã調æŽãã 以äžã§ åäœç¢ºèªçšãžã§ãã宿å®è¡ã§ããç¶æ
ãšãªã£ãããšæããŸãã æ¬¡ã¯åãããŠã¿ãŸãã åãããŠã¿ã bin/jobs ã§èµ·åããŸãã Dockerã§èµ·åããéã以äžã®ã³ãã³ãã«ãŠãpid ãã¡ã€ã«ãåé€ããŠããèµ·åããããã«ããŸããã bash -c " rm -f tmp/pids/solid_queue_supervisor.pid && bin/jobs " å®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ãã° ã¢ããªã±ãŒã·ã§ã³èµ·åãåäœç¢ºèªçšãžã§ããïŒåå®è¡ããããŸã§ã®ãã°ã§ãã äžèšã®ïŒã€ã®ãã°ãïŒååºåãããŠããããšããããžã§ããã¹ã±ãžã¥ãŒãªã³ã°ã®åšæã§ãšã³ãã¥ãŒãããŠå®è¡ããŠããããšãåãããŸã Enqueued FooBar::BazQuxJob Performing FooBar::BazQuxJob Performed FooBar::BazQuxJob # tail -1000f log/development.log | grep -E "SolidQueue-1.2.2|ActiveJob" SolidQueue-1.2.2 Register Supervisor (31.3ms) pid: 1, hostname: "b9fb9f17bddb", process_id: 27, name: "supervisor-b90acad5c891087512fb" SolidQueue-1.2.2 Started Supervisor (136.9ms) pid: 1, hostname: "b9fb9f17bddb", process_id: 27, name: "supervisor-b90acad5c891087512fb" SolidQueue-1.2.2 Prune dead processes (9.2ms) size: 0 SolidQueue-1.2.2 Register Dispatcher (47.7ms) pid: 17, hostname: "b9fb9f17bddb", process_id: 28, name: "dispatcher-fd60cfd986a70188ddad" SolidQueue-1.2.2 Started Dispatcher (51.5ms) pid: 17, hostname: "b9fb9f17bddb", process_id: 28, name: "dispatcher-fd60cfd986a70188ddad", polling_interval: 1, batch_size: 500, concurrency_maintenance_interval: 600 SolidQueue-1.2.2 Register Worker (50.4ms) pid: 21, hostname: "b9fb9f17bddb", process_id: 29, name: "worker-7b1d65c64db3d68e456a" SolidQueue-1.2.2 Register Scheduler (49.5ms) pid: 25, hostname: "b9fb9f17bddb", process_id: 30, name: "scheduler-0aa92e643ddec8a6b637" SolidQueue-1.2.2 Started Worker (54.6ms) pid: 21, hostname: "b9fb9f17bddb", process_id: 29, name: "worker-7b1d65c64db3d68e456a", polling_interval: 0.1, queues: "*", thread_pool_size: 1 SolidQueue-1.2.2 Started Scheduler (74.4ms) pid: 25, hostname: "b9fb9f17bddb", process_id: 30, name: "scheduler-0aa92e643ddec8a6b637", recurring_schedule: ["foo_bar_baz_qux"] SolidQueue-1.2.2 Unblock jobs (17.6ms) limit: 500, size: 0 [ActiveJob] TRANSACTION (0.6ms) BEGIN /*application='****'*/ [ActiveJob] SolidQueue::Job Create (1.9ms) INSERT INTO `solid_queue_jobs` (`active_job_id`, `arguments`, `class_name`, `concurrency_key`, `created_at`, `finished_at`, `priority`, `queue_name`, `scheduled_at`, `updated_at`) VALUES ('f061f654-51e9-425d-aa84-2100f4e559dd', '{\"job_class\":\"FooBar::BazQuxJob\",\"job_id\":\"f061f654-51e9-425d-aa84-2100f4e559dd\",\"provider_job_id\":null,\"queue_name\":\"background\",\"priority\":null,\"arguments\":[],\"executions\":0,\"exception_executions\":{},\"locale\":\"en\",\"timezone\":\"Tokyo\",\"enqueued_at\":\"2025-10-26T01:20:00.038662472Z\",\"scheduled_at\":\"2025-10-26T01:20:00.038481305Z\"}', 'FooBar::BazQuxJob', NULL, '2025-10-26 10:20:00.070323', NULL, 0, 'background', '2025-10-26 10:20:00.038481', '2025-10-26 10:20:00.070323') /*application='****'*/ [ActiveJob] TRANSACTION (0.1ms) SAVEPOINT active_record_1 /*application='****'*/ [ActiveJob] SolidQueue::Job Load (0.2ms) SELECT `solid_queue_jobs`.* FROM `solid_queue_jobs` WHERE `solid_queue_jobs`.`id` = 15 LIMIT 1 /*application='****'*/ [ActiveJob] SolidQueue::ReadyExecution Create (0.2ms) INSERT INTO `solid_queue_ready_executions` (`created_at`, `job_id`, `priority`, `queue_name`) VALUES ('2025-10-26 10:20:00.106445', 15, 0, 'background') /*application='****'*/ [ActiveJob] TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1 /*application='****'*/ [ActiveJob] Enqueued FooBar::BazQuxJob (Job ID: f061f654-51e9-425d-aa84-2100f4e559dd) to SolidQueue(background) with arguments: SolidQueue-1.2.2 Enqueued recurring task (117.1ms) task: "foo_bar_baz_qux", active_job_id: "f061f654-51e9-425d-aa84-2100f4e559dd", at: "2025-10-26T01:20:00Z" [ActiveJob] [FooBar::BazQuxJob] [f061f654-51e9-425d-aa84-2100f4e559dd] Performing FooBar::BazQuxJob (Job ID: f061f654-51e9-425d-aa84-2100f4e559dd) from (background) enqueued at 2025-10-26T01:20:00.038662472Z with arguments: [ActiveJob] [FooBar::BazQuxJob] [f061f654-51e9-425d-aa84-2100f4e559dd] FooBar::BazQuxJob called with args: [] [ActiveJob] [FooBar::BazQuxJob] [f061f654-51e9-425d-aa84-2100f4e559dd] Performed FooBar::BazQuxJob (Job ID: f061f654-51e9-425d-aa84-2100f4e559dd) from SolidQueue(background) in 2.35ms [ActiveJob] TRANSACTION (0.2ms) BEGIN /*application='****'*/ [ActiveJob] SolidQueue::Job Create (1.3ms) INSERT INTO `solid_queue_jobs` (`active_job_id`, `arguments`, `class_name`, `concurrency_key`, `created_at`, `finished_at`, `priority`, `queue_name`, `scheduled_at`, `updated_at`) VALUES ('bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5', '{\"job_class\":\"FooBar::BazQuxJob\",\"job_id\":\"bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5\",\"provider_job_id\":null,\"queue_name\":\"background\",\"priority\":null,\"arguments\":[],\"executions\":0,\"exception_executions\":{},\"locale\":\"en\",\"timezone\":\"Tokyo\",\"enqueued_at\":\"2025-10-26T01:21:00.007415430Z\",\"scheduled_at\":\"2025-10-26T01:21:00.007366555Z\"}', 'FooBar::BazQuxJob', NULL, '2025-10-26 10:21:00.009421', NULL, 0, 'background', '2025-10-26 10:21:00.007366', '2025-10-26 10:21:00.009421') /*application='****'*/ [ActiveJob] TRANSACTION (0.2ms) SAVEPOINT active_record_1 /*application='****'*/ [ActiveJob] SolidQueue::Job Load (0.6ms) SELECT `solid_queue_jobs`.* FROM `solid_queue_jobs` WHERE `solid_queue_jobs`.`id` = 16 LIMIT 1 /*application='****'*/ [ActiveJob] SolidQueue::ReadyExecution Create (0.2ms) INSERT INTO `solid_queue_ready_executions` (`created_at`, `job_id`, `priority`, `queue_name`) VALUES ('2025-10-26 10:21:00.024004', 16, 0, 'background') /*application='****'*/ [ActiveJob] TRANSACTION (0.1ms) RELEASE SAVEPOINT active_record_1 /*application='****'*/ [ActiveJob] Enqueued FooBar::BazQuxJob (Job ID: bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5) to SolidQueue(background) with arguments: SolidQueue-1.2.2 Enqueued recurring task (34.3ms) task: "foo_bar_baz_qux", active_job_id: "bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5", at: "2025-10-26T01:21:00Z" [ActiveJob] [FooBar::BazQuxJob] [bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5] Performing FooBar::BazQuxJob (Job ID: bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5) from (background) enqueued at 2025-10-26T01:21:00.007415430Z with arguments: [ActiveJob] [FooBar::BazQuxJob] [bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5] FooBar::BazQuxJob called with args: [] [ActiveJob] [FooBar::BazQuxJob] [bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5] Performed FooBar::BazQuxJob (Job ID: bb5b5ceb-ce02-48d4-9a96-3e9dc91c9bf5) from SolidQueue(background) in 1.4ms ð§ ããã»ã¹ã確èªïŒ4ã€ã®åœ¹å²ãšå調åäœ Solid Queue ã¯ãDBããŒã¹ã§ãããªããå¹ççãªãžã§ãåŠçãè¡ããããäž»ã«ä»¥äžã®ïŒã€ã®ããã»ã¹ã§æ§æãããŠããŸãã ãããã®ããã»ã¹ããå
±éã®ããŒã¿ããŒã¹ãå©çšããŠå調åäœããããšã§ãå€éšãã¥ãŒïŒRedisãªã©ïŒãªãã§ã®ãžã§ãå®è¡ãå®çŸããŠããŸãã supervisor : å
šäœã®èŠªããã»ã¹ãšããŠã dispatcher ã worker ã scheduler ã®ååããã»ã¹ãèµ·åã»ç£èŠããŸãã dispatcher : ãã¥ãŒå
ã®ãžã§ããç£èŠãã worker ãããã«å®è¡ã§ããç¶æ
ïŒReadyïŒã«é
眮ãã圹å²ãæ
ããŸãã worker : dispatcher ã«ãã£ãŠé
眮ããã Job ãå®éã«ååŸããå®è¡ããŸãã scheduler : config/recurring.yml ã«åºã¥ãã宿å®è¡ã®æå»ãæ¥ããžã§ãã倿ããdispatcher ãä»ããŠãã¥ãŒã«ãšã³ãã¥ãŒããŸãã # ps -aux | grep solid-queue root 1 0.3 0.9 1026296 106708 ? Ssl 10:19 0:02 solid-queue-supervisor(1.2.2): supervising 17, 21, 25 root 17 0.2 1.0 974356 114088 ? Sl 10:19 0:02 solid-queue-dispatcher(1.2.2): dispatching every 1 seconds root 21 1.5 1.0 1043072 118048 ? Sl 10:19 0:12 solid-queue-worker(1.2.2): waiting for jobs in * root 25 0.0 0.9 965768 110944 ? Sl 10:19 0:00 solid-queue-scheduler(1.2.2): scheduling foo_bar_baz_qux root 58 0.0 0.0 3660 1688 pts/0 S+ 10:33 0:00 grep solid-queue Mission Control â Jobs Solid Queue 㯠Mission Control â Jobs ãããã·ã¥ããŒããšããŠå©çšããããšãæšå¥šããŠããŸãããŸããSolid Queue èªäœãšããŠã¯ Dashboard UI ãæã£ãŠããªããããREADME ã«åŸã£ãŠå°å
¥ãé²ããŸãã ãã¡ãã Mission Control â Jobs ã® README ããã³ README ã®ç¿»èš³èšäºãåèã«ããŸããã github.com techracho.bpsinc.jp Gemfile ã«äžèšã®ïŒè¡ã远å ãã propshaft 㯠Mission Control â Jobs ãå°å
¥ãããµãŒãã¹ã API-only Applications ã«çžåœããããã远å ãã gem " mission_control-jobs " gem " propshaft " bundle install ã§äŸåãã gem ãã€ã³ã¹ããŒã«ããGemfile.lock ãæŽæ°ãã config/application.rb ã«äžèšã®ïŒè¡ã远å ãã BasicèªèšŒãããã©ã«ãã ããå¥ã®èªèšŒæ¹åŒãå©çšããã®ã§OFFã«ãã config.mission_control.jobs.adapters = [ :solid_queue ] config.mission_control.jobs.http_basic_auth_enabled = false config/environments/production.rb ãªã©ã®ç°å¢ããšã®èšå®ãã¡ã€ã«ã«äžèšã®è¡ã远å Mission Control â Jobs ã®URLãžã®ã¢ã¯ã»ã¹ã¯ãã® Controller ãçµç±ããã éçºæã¯èªèšŒãã¹ããããããããã config/environments/development.rb ã«ã¯è¡ã远å ããªãã£ã config.mission_control.jobs.base_controller_class = " Foo::JobsDashboardController " Foo::JobsDashboardController ãå®è£
ãã ãã®ã¯ã©ã¹ã§èªèšŒãè¡ããèªèšŒã«å€±æããå Žåã401 Unauthorized ã®ã¬ã¹ãã³ã¹ãè¿åŽãã class Foo :: JobsDashboardController < ApplicationController before_action :authenticate! private def authenticate! # Implement your authentication logic here. rescue AuthenticatorError => e head :unauthorized end end config/routes.rb ãä¿®æ£ã㊠Mission Control Job ã®ãšã³ãžã³ã«ã¢ã¯ã»ã¹ã§ããããã«ããŠã³ããã Rails .application.routes.draw do # ... mount MissionControl :: Jobs :: Engine , at : " /foo/jobs " 以äžã§ Mission Control â Jobs ã衚瀺ã§ããããã«ãªã£ãããšæããŸãã ãã©ãŠã¶ãã config/routes.rb ã§æå®ãããã¹ã«ã¢ã¯ã»ã¹ããŠã¿ãŠãã ããã âš ãŸãšãïŒSolid Queueå°å
¥ã§åŸãããã¡ãªãã Solid Queue ã®å°å
¥ã¯æ¯èŒç容æã«è¡ãããšãã§ããŸããã ECS Scheduled Task ã®èšå®ãªã©ãäžèŠã§ã察象ãµãŒãã¹ã®ãªããžããªå
ã®ã³ãŒãä¿®æ£ã§ã»ãŒå®çµããã®ã¯åŸããå
¥ã£ãã¡ã³ããŒã®åŠç¿ã³ã¹ãäœæžã«ç¹ããã倧ããªã¡ãªããã ãšèããŸãã ãã®èšäºããã£ããã« Solid Queue ã«è§ŠããŠã¿ããšããæ¹ããããããããã§ãã ð€ ãããã« æ ªåŒäŒç€Ÿã¹ã¿ã¡ã³ã§ã¯ããããã¯ãéçºã«é¢ããå
šãŠã®é åã§ããããã¯ãè·çš®ã®æ¡çšãç©æ¥µçã«è¡ã£ãŠããŸãã ãèå³ããæã¡ããã ãããªãããã²ãå¿åããã ããŸããšããããã§ãã çãããšã話ã§ããããšã楜ãã¿ã«ããŠããŸãã herp.careers herp.careers herp.careers