Ruby on rails Rails应用程序和通道最佳实践?
我目前正在使用Rails为响应和响应本机应用程序做准备。令牌用于身份验证 我的应用程序中有两个需要WebSocket的功能: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
- 聊天系统(一次打开一个聊天室)
- 通知系统
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