Skip to content

Commit 7f660a7

Browse files
dhhnpezza93
andauthored
Add Solid Cable (rails#52889)
* Add Solid Cable Co-authored-by: Nick Pezza <[email protected]>
1 parent 3d25103 commit 7f660a7

File tree

10 files changed

+36
-3
lines changed

10 files changed

+36
-3
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ gem "tailwindcss-rails"
2323
gem "dartsass-rails"
2424
gem "solid_cache"
2525
gem "solid_queue"
26+
gem "solid_cable"
2627
gem "kamal", require: false
2728
gem "thruster", require: false
2829
# require: false so bcrypt is loaded only when has_secure_password is used.

Gemfile.lock

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,8 @@ GEM
547547
rake
548548
serverengine (~> 2.0.5)
549549
thor
550+
solid_cable (1.1.0)
551+
rails (>= 7.2)
550552
solid_cache (1.0.4)
551553
activejob (>= 7.2)
552554
activerecord (>= 7.2)
@@ -704,6 +706,7 @@ DEPENDENCIES
704706
selenium-webdriver (>= 4.20.0)
705707
sidekiq
706708
sneakers
709+
solid_cable
707710
solid_cache
708711
solid_queue
709712
sprockets-rails (>= 2.0.0)

railties/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
* Use [Solid Cable](https://github.com/rails/solid_cable) as the default Action Cable adapter in production, configured as a separate queue database in config/database.yml. It keeps messages in a table and continously polls for updates. This makes it possible to drop the common dependency on Redis, if it isn't needed for any other purpose. Despite polling, the performance of Solid Cable is comparable to Redis in most situations. And in all circumstances, it makes it easier to deploy Rails when Redis is no longer a required dependency for Action Cable functionality.
2+
3+
*DHH*
4+
15
* Use [Solid Queue](https://github.com/rails/solid_queue) as the default Active Job backend in production, configured as a separate queue database in config/database.yml. In a single-server deployment, it'll run as a Puma plugin. This is configured in `config/deploy.yml` and can easily be changed to use a dedicated jobs machine.
26

37
*DHH*

railties/lib/rails/generators/app_base.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,10 @@ def run_kamal
756756
def run_solid
757757
return if skip_solid? || !bundle_install?
758758

759-
rails_command "solid_cache:install solid_queue:install"
759+
commands = "solid_cache:install solid_queue:install"
760+
commands += " solid_cable:install" unless skip_action_cable?
761+
762+
rails_command commands
760763
end
761764

762765
def add_bundler_platforms

railties/lib/rails/generators/rails/app/templates/Gemfile.tt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ gem "solid_cache"
1818

1919
# Use the database-backed Solid Queue adapter for Active Job [https://github.com/rails/solid_queue]
2020
gem "solid_queue"
21+
22+
# Use the database-backed Solid Cable adapter for Action Cable [https://github.com/rails/solid_cable]
23+
gem "solid_cable"
2124
<% end -%>
2225
<% if depend_on_bootsnap? -%>
2326

railties/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,8 @@ production:
7373
<<: *primary_production
7474
database: <%= app_name %>_production_queue
7575
migrations_paths: db/queue_migrate
76+
cable:
77+
<<: *primary_production
78+
database: <%= app_name %>_production_cable
79+
migrations_paths: db/cable_migrate
7680
<%- end -%>

railties/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,8 @@ production:
105105
<<: *primary_production
106106
database: <%= app_name %>_production_queue
107107
migrations_paths: db/queue_migrate
108+
cable:
109+
<<: *primary_production
110+
database: <%= app_name %>_production_cable
111+
migrations_paths: db/cable_migrate
108112
<%- end -%>

railties/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,9 @@ production:
6262
<<: *default
6363
database: storage/production_queue.sqlite3
6464
migrations_paths: db/queue_migrate
65+
cable:
66+
<<: *default
67+
database: storage/production_cable.sqlite3
68+
migrations_paths: db/cable_migrate
6569
<%- end -%>
6670
<%- end -%>

railties/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,8 @@ production:
7373
<<: *primary_production
7474
database: <%= app_name %>_production_queue
7575
migrations_paths: db/queue_migrate
76+
cable:
77+
<<: *primary_production
78+
database: <%= app_name %>_production_cable
79+
migrations_paths: db/cable_migrate
7680
<%- end -%>

railties/test/generators/app_generator_test.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,10 +645,12 @@ def test_configuration_of_solid
645645

646646
assert_gem "solid_cache"
647647
assert_gem "solid_queue"
648+
assert_gem "solid_cable"
648649

649650
assert_file "config/database.yml" do |content|
650651
assert_match(%r{cache:}, content)
651652
assert_match(%r{queue:}, content)
653+
assert_match(%r{cable:}, content)
652654
end
653655
end
654656

@@ -813,9 +815,10 @@ def test_skip_solid_option
813815
generator([destination_root], skip_solid: true)
814816
run_generator_instance
815817

816-
assert_not_includes @rails_commands, "solid_cache:install solid_queue:install", "`solid_cache:install solid_queue:install` expected to not be called."
818+
assert_not_includes @rails_commands, "solid_cache:install solid_queue:install solid_cable:install", "`solid_cache:install solid_queue:install solid_cable:install` expected to not be called."
817819
assert_no_gem "solid_cache"
818820
assert_no_gem "solid_queue"
821+
assert_no_gem "solid_cable"
819822
end
820823

821824
def test_skip_javascript_option
@@ -992,7 +995,7 @@ def test_default_generator_executes_all_rails_commands
992995
run_generator_instance
993996

994997
expected_commands = [
995-
"credentials:diff --enroll", "importmap:install", "turbo:install stimulus:install", "solid_cache:install solid_queue:install"
998+
"credentials:diff --enroll", "importmap:install", "turbo:install stimulus:install", "solid_cache:install solid_queue:install solid_cable:install"
996999
]
9971000
assert_equal expected_commands, @rails_commands
9981001
end

0 commit comments

Comments
 (0)