使用ActionCable在房间中仅向一个Web插座广播



我正在使用ActionClable来提供易于实现的浏览器通知。当用户打开浏览器中的多个选项卡时,我需要将数据发送到一个选项卡时,即仅在用户室中的一个Websocket中,我需要将数据发送到一个问题。如何完成?

在酒吧/sub方法中隔离单个酒吧/sub客户端,因为整个想法是出版商不了解订户。

但是,有两种常见方法可以解决此问题:

  1. 每个连接使用不同的命名通道,将命名通道保存在数据库中,然后将所有消息转发到该特定命名的通道(即保存在数据库中的通道user-ID-TIMESTAMP并将其用作目标连接)。<<<<<<<<<<<<<<

  2. 另一种更可靠的方法(尽管更复杂)是将消息发送给所有客户端,但创建了一个竞赛条件,该条件只允许一个客户接收实际的消息。看起来像这样:

    • 服务器向所有客户端发送"您有消息"。
    • 客户端民意调查服务器中的"未交付"消息。
    • 服务器锁定消息池或使用数据库事务以检索未播放的消息并将消息标记为已交付的消息。服务器将未传递的消息发送到客户端(可选设置ACK超时)。
    • 单个客户端连接接收到未传递的消息,其余的消息将收到一个空数数字(因为它们都已交付给另一个客户端)或接收"已交付"标志,因此数据已更新,但没有提出通知。
    • (可选)客户发送和ack。
    • (可选)服务器将消息传递标记为完成。如果在"超时"之前未收到ACK,则服务器未获得交付并重新发送"您有消息"消息。

祝你好运!

每次建立新连接时,我们都会创建一个新房间。因此,例如,当用户建立新连接时,我们可以将房间名称作为用户提供:user_id:some_unique_random_string,可能等于用户:user_id:123J123B1H2B1J23BH12B3,当同一用户通过另一个选项卡进行另一个连接时,我们还会执行另一个连接相同并创建一个单独的房间。现在,该动作提供的一件事是,我们可以找到所有的房间名称,然后再以任何前缀。

让用户建立了三个连接,他们的房间是用户:128:123N1JH123KO9876,用户:128:ASDAS23412CS1234,用户:128:ASNI9202H5I3JENS,我们也可以使用ActionCable获得这些房间名称。

user_id = 128
pubsub = ActionCable.server.pubsub
channel_with_prefix = pubsub.send(:channel_with_prefix, RoomChannel.channel_name)
channels = pubsub.send(:redis_connection).pubsub('channels', "#{channel_with_prefix}:users:#{user_id}:*")

现在,频道是一个由房间名称组成的数组。

所以puts channels

["chatapp_production:users:128:123n1jh123ko9876", "chatapp_production:users:128:asdas23412cs1234", "users:128:asni9202h5i3jens"]

这就是我们可以在不使用任何外部数据库和API调用的情况下找到与单个用户相关的所有房间的方式。

相关内容

最新更新