You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Action Cable中所有在线Pub/Sub及特定频道的在线消费者?

嘿,我来帮你梳理下Action Cable里怎么获取这些在线实例和消费者~

如何获取Action Cable中的所有在线发布/订阅(Pub/Sub)实例?

Action Cable本身没有直接暴露全局的Pub/Sub实例列表API,但我们可以通过它内部维护的连接和订阅集合来追踪。每个活跃的客户端连接都会关联若干个订阅实例,你可以通过以下方式遍历获取:

# 获取所有在线的订阅(Pub/Sub)实例
all_active_subscriptions = ActionCable.server.connections.flat_map do |connection|
  # 每个连接的subscriptions是一个哈希,values就是该连接下的所有订阅对象
  connection.subscriptions.values
end

每个订阅实例里包含identifier(频道的标识字符串)、channel(对应的频道类实例)等属性,你可以用这些信息区分不同的Pub/Sub实例。

如何获取指定频道上的所有在线消费者?

针对特定频道,我们可以筛选出关联该频道的连接(即消费者),具体分两种场景:

1. 单服务器实例场景

如果你的应用是单服务器部署,可以直接遍历所有连接,筛选出订阅了目标频道的连接:

# 定义方法:获取指定频道的所有在线消费者连接
def get_online_consumers(channel_class)
  ActionCable.server.connections.select do |connection|
    # 检查该连接下是否有目标频道的订阅
    connection.subscriptions.values.any? do |subscription|
      subscription.channel == channel_class
    end
  end
end

# 使用示例:获取ChatChannel的在线消费者连接
chat_channel_consumers = get_online_consumers(ChatChannel)

如果需要获取消费者的具体信息(比如用户ID),假设你的连接类里实现了current_user方法,可以进一步处理:

# 提取ChatChannel在线用户的ID列表
chat_online_user_ids = chat_channel_consumers.map do |conn|
  conn.current_user&.id
end.compact

2. 分布式多服务器场景

如果你的应用部署了多台Action Cable服务器,单服务器的内存状态无法共享,这时候需要借助Redis(Action Cable默认的适配器)来追踪订阅状态:

Action Cable会在Redis中存储频道订阅的相关键,格式类似action_cable:subscriptions:channel:<频道标识>,你可以通过Redis命令获取该频道的订阅UUID列表:

# 连接Redis(使用你应用的Redis配置)
redis_client = Redis.new(host: "your_redis_host", port: 6379)

# 构建目标频道的Redis键(比如ChatChannel的标识是"ChatChannel")
channel_key = "action_cable:subscriptions:channel:ChatChannel"

# 获取该频道的所有订阅UUID
subscription_uids = redis_client.smembers(channel_key)

如果你的应用在连接建立时,把连接UUID和用户ID的映射存储到了Redis(比如action_cable:connection:<uuid>:user_id),就可以通过这些UUID找到对应的在线用户:

# 提取在线用户ID列表
online_user_ids = subscription_uids.map do |uuid|
  redis_client.get("action_cable:connection:#{uuid}:user_id")
end.compact

内容的提问来源于stack exchange,提问作者Rana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:28:42