在Ruby on Rails中如何使用Action Cable搭配Redis发布订阅

星静酱_3859

星静酱_3859

2026-10-03

666人浏览

原创

action cable 默认用 redis 是因其 pub/sub 机制天然支持广播,避免多进程/服务器下连接状态不一致;生产环境必须显式配置 config.action_cable.adapter = :redis 并确保 redis url 正确,否则消息丢失。

在ruby on rails中如何使用action cable搭配redis发布订阅

为什么Action Cable默认要用Redis做后端

Action Cable 默认用 Redis 是因为它的 Pub/Sub 机制天然适合广播消息——每个频道(channel)就是一个逻辑通道,publish 发一次,所有 subscribe 到该频道的连接都能实时收到。Rails 不自己维护连接状态同步,而是把“谁在听哪个频道”这个事交给 Redis 去广播,避免了多进程/多服务器下内存不一致的问题。

如果你没配 Redis,Action Cable 在单进程开发模式下会用内存后端(adapter: :test 或 :inline),但一上生产、开多个 Puma worker,就会出现消息只发给部分用户的情况——这不是 bug,是设计使然。

如何配置Action Cable使用Redis

关键不是“能不能用”,而是“配错就收不到消息”。常见漏项有三处:

  • config/environments/production.rb 里必须显式设置 config.action_cable.adapter = :redis,不能只靠环境变量
  • REDIS_URL 环境变量要指向真实 Redis 实例(如 redis://localhost:6379/1),不能是 redis://127.0.0.1(某些 Docker 网络下解析失败)
  • 如果用了 Sentinel 或集群,得改用 redis:// + 密码 + db + 参数,例如:redis://:password@sentinel-host:26379/0?sentinels=192.168.1.10:26379,192.168.1.11:26379&role=master

验证是否生效:启动 Rails console,运行 ActionCable.server.pubsub.class,返回 ActiveSupport::Notifications::Instrumenter 就是错了;返回 Redis::PubSub 才对。

stream_from 的 channel 名怎么写才不会冲突

stream_from 后面的字符串就是 Redis 频道名,它直接拼进 PUBLISH 命令,所以必须满足两个条件:唯一性 + 可预测性。

典型错误写法:stream_from "notifications" —— 所有用户挤一个频道,互相收到别人的通知;stream_from "notifications_#{Time.now.to_i}" —— 每次订阅都换频道,broadcast 根本找不到人。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载

正确做法是绑定到业务实体上:

  • 用户私有频道:stream_from "notifications:#{current_user.id}"
  • 房间类频道:stream_from "chat_room:#{params[:room_id]}"
  • 带权限校验的频道:stream_from "project_updates:#{project.id}",然后在 subscribed 里加 return reject if !can?(:view, project)

注意:冒号 : 是惯用分隔符,不是语法要求;但别用空格、中文、斜杠,Redis 频道名只认 ASCII 字符。

ActionCable.server.broadcast 和 redis-cli publish 的关系

它们发的是同一个东西,只是入口不同:ActionCable.server.broadcast 是 Rails 封装后的接口,底层调的就是 redis.publish;而 redis-cli publish 是直连 Redis,绕过 Rails 认证和生命周期管理。

所以调试时可以这样交叉验证:

  • 在 Rails console 里执行 ActionCable.server.broadcast "chat_room:123", {msg: "hello"}
  • 同时在终端跑 redis-cli subscribe "chat_room:123",看是否收到
  • 反过来,用 redis-cli publish "chat_room:123" '{"msg":"from cli"}',看页面 WebSocket 是否触发 received 回调

容易忽略的一点:Rails broadcast 发送的是 JSON 字符串,但 redis-cli publish 发的是裸字符串——如果你发 hello(没引号),前端 JSON.parse 会报错;务必用单引号包住整个 JSON:redis-cli publish "chat_room:123" '{"msg":"ok"}'。

最常被跳过的环节是频道命名与 broadcast 调用之间的映射一致性——写代码时 copy-paste 频道名,一个地方少个冒号、多一个空格,消息就石沉大海。上线前用 redis-cli pubsub channels 看一眼当前活跃频道,比猜日志快得多。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis ruby on rails

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Linux安装Ruby语言详细教程
Linux安装Ruby语言详细教程

本专题整合了Linux安装配置Ruby相关教程,阅读专题下面的文章了解更多详细操作。

2026.04.02

112

9

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4269

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3755

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6772

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

736

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6342

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1140

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1016

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习