那是信使的脸书用户界面
如果您使用 phoenix (elixir framework) 来实现它
你会为一次聊天创建一个凤凰频道吗?
这意味着您的客户端(移动设备、Web 等)必须为其订阅的每个聊天打开一个频道
这意味着如果他订阅了 2000 个聊天,他将不得不打开 2000 个频道(客户端负载)。
你会为一个用户创建一个凤凰频道吗?
这意味着您的客户(移动设备、网络等)将只需要打开一个渠道并且
这意味着对于每条传入的消息,您都必须查询房间中的所有用户(服务器负载)。
那是信使的脸书用户界面
如果您使用 phoenix (elixir framework) 来实现它
你会为一次聊天创建一个凤凰频道吗?
这意味着您的客户端(移动设备、Web 等)必须为其订阅的每个聊天打开一个频道
这意味着如果他订阅了 2000 个聊天,他将不得不打开 2000 个频道(客户端负载)。
你会为一个用户创建一个凤凰频道吗?
这意味着您的客户(移动设备、网络等)将只需要打开一个渠道并且
这意味着对于每条传入的消息,您都必须查询房间中的所有用户(服务器负载)。
在消息传递应用程序中,有两个主要问题。管理用户订阅的资源(用户、房间等)列表。这通常在客户端中显示为列表。因此,您需要呈现该列表并更新诸如存在、新消息警报之类的想法,并可能显示用户是否有打开的聊天窗口。无论用户/房间是点对点还是多用户(房间),这部分的解决方案都是相似的。
第二个问题是在打开/可见的单个聊天窗口中显示消息。解决方案可能会有所不同,具体取决于它们是点对点还是多用户。但是,Facebook 确实支持多用户聊天,所以我将根据我在 Phoenix 构建 Slack 克隆的经验来回答这个问题。
我推荐两个频道,一个用于用户,一个用于打开的聊天窗口,我们称之为聊天。对于每个打开的聊天窗口,每个用户将拥有一个用户频道实例和一个聊天频道实例。user_id 可用于用户频道的主题,例如"user:" <> user.user_id
. 您可能会有每个聊天会话的模式(使用的是聊天会话的一部分)。因此,将该 id 用于聊天频道主题,例如"chat:" <> chat.id
.
然后,您可以在聊天频道中广播新的传入消息,它们将发送给该聊天会话中的每个人(打开聊天窗口的人)。这适用于点对点和多用户窗口。
您在问题中提供的示例显示了具有不同状态(文本颜色)的两种用途。一个显示未接来电,另一个我认为是未读消息。这种类型的状态通常是特定于用户的,因此您将使用使用通道放置push
此信息。
要跟踪用户列表上的指标,您可以从用户频道订阅聊天频道中的消息。然后,您将在用户频道中收到信息消息,并在需要时采取适当的措施。如果您订阅聊天加入消息,您可以构建这些列表并将其存储在您的socket.assigns
结构中。有关更多详细信息,请参阅Phoenix 通道 - 每个插槽多个通道。
我用于消息传递应用程序的另一个 API 是intercept
api。这允许您定义一个handle_out
为频道的特定广播事件调用的函数。它可用于过滤或操作在该频道上广播的传出消息