Ruby on rails Rails应用程序和通道最佳实践?

Ruby on rails Rails应用程序和通道最佳实践?,ruby-on-rails,react-native,websocket,actioncable,Ruby On Rails,React Native,Websocket,Actioncable,我目前正在使用Rails为响应和响应本机应用程序做准备。令牌用于身份验证 我的应用程序中有两个需要WebSocket的功能: 聊天系统(一次打开一个聊天室) 通知系统 我看到了两种实现WebSocket的方法: 两个独立的频道 第一个频道:NotificationChannel,当客户端打开应用程序时,我订阅该频道,如果需要,我会广播某个频道 第二个频道:chatconnel当我打开聊天室时,我订阅了该频道,代码如下所示: class ChatChannel < Application

我目前正在使用Rails为响应和响应本机应用程序做准备。令牌用于身份验证

我的应用程序中有两个需要WebSocket的功能:

  • 聊天系统(一次打开一个聊天室)
  • 通知系统
我看到了两种实现WebSocket的方法:

两个独立的频道

第一个频道:
NotificationChannel
,当客户端打开应用程序时,我订阅该频道,如果需要,我会广播某个频道

第二个频道:
chatconnel
当我打开聊天室时,我订阅了该频道,代码如下所示:

class ChatChannel < ApplicationCable::Channel
  def subscribed
    authorize_chat_room_id(params[:chat_room_id]) #
    stream_from "chat_channel_#{params[:chat_room_id]}"
  end

  # here methods for receiving data from client
  # maybe some other methods for tracking if sb is typing and so on
  # private authorize_chat_room_id method
end
当我进行广播时,我会发送有效负载,例如type(例如“MESSAGE_send”),基于此,如果聊天室打开,react客户端将打印消息

这种方法的优点是,当发送消息时,我只能向一个用户广播,而不会从频道中收到消息。但在这种情况下,我必须授权每次执行一个操作


我的问题是,在性能和一般接受的方法中,哪种解决方案会更好?(使信道非常通用,或者使每个通道负责单个任务)?

在此问题上,我建议您优先考虑代码维护关注性能。

频道的概念
允许我们将出版商与消费者分离。这简化了许多代码并有助于分离关注点

例如,在聊天室中发布的用户不需要知道(或管理)有多少人订阅了该聊天室,也不需要知道他们可能是谁。这些问题现在由发布/订阅系统而不是用户来处理

这种关注点的分离使得添加或删除聊天成员变得更加容易(您不需要更新每个用户,只需要更新发布/订阅系统)

这种分离还防止存储数据的多个副本(发布/订阅系统保存唯一有效的副本)

从长远来看,通过将所有数据整合到单个
PersonalChannel
,您将重新引入发布者和消费者之间的耦合-这将增加复杂性,并随着时间的推移使维护模式变得困难

在聊天室示例中,每个用户都需要获取聊天室所有成员的副本,并将每条消息发送给所有用户。这会增加(成员列表)的副本数,并引入同步问题

这种方法的优点是,当发送消息时,我只能向一个用户广播,而不会从频道中收到消息。但在这种情况下,我必须授权每次执行一个操作

这一优势实际上是使用第一种方法可以轻松实现的,即向每个用户订阅一个个人频道以及其他频道,订阅三个频道而不是两个频道

  def subscribed
    stream_from "personal_channel_#{current_user.id}"
  end

  def send_message(data)
    if authorize_chat_room_id(data['chat_room_id'])
      #create message
    end
  end

  def start_typing(data)
    if authorize_chat_room_id(data['chat_room_id'])
      # some broadcast
    end
  end