使用 Rails 8 提供的默认实时更新组件 Solid Cable

2025-01-05 18:00

“Rails Cable “又称 “Action Cable”,是 Ruby on Rails 中的一个内置框架,允许开发人员使用 WebSockets 在网络应用程序中轻松实现实时功能,无需刷新页面即可在客户端和服务器之间进行实时更新和通信;从本质上讲,它提供了一种在 Rails 应用程序中创建即时聊天或即时通知等交互式功能的方法。

Rails Cable依赖于队列机制,特别是 “发布-订阅”(Pub/Sub)模式,它本质上就像一个消息队列,用于管理服务器与通过 WebSockets 连接的多个客户端之间的通信;也就是说,它依赖于队列来有效分发消息。

Action Cable 并不是一个直接的队列系统,他是实现Pub/Sub模式和Websocket的接口。它的大多数实现都利用了像 Redis 这样的独立数据存储来管理 Pub/Sub 通道和消息传递。

但是现在Rails 8摒弃了Redis,将SQL数据库作为存储和轮询数据库,默认使用Solid Cable实现Action Cable

1. 准备

首先创建一个项目,然后先搭建好Solid Queue

https://github.com/memorycancel/rails-solid/tree/solid-queue

以此为基础(因为Cable需要的Pub/Sub机制是依赖于Queue的),创建一个solid-cable分支:

https://github.com/memorycancel/rails-solid/tree/solid-cable

2. 安装

在执行rails new创建项目的时候已经默认安装过了。可以详细观察控制台的输出

export RAILS_ENV=production
bin/jobs start

3. 示例

添加官方rails start示例(blog),参考:

最关键的代码,修改View在页面添加turbo_stream_from标签:

<%= turbo_stream_from @post %>

修改model添加broadcasts_to:

class Comment < ApplicationRecord
  belongs_to :post
  broadcasts_to :post
end

每次广播(Pub)都会在任务队列(数据库)插入一条广播任务,当广播消息被消费后,该任务就完成了。

1

4. 代码

https://github.com/memorycancel/rails-solid/tree/solid-cable