0

在此处输入图像描述

那是信使的脸书用户界面

如果您使用 phoenix (elixir framework) 来实现它

你会为一次聊天创建一个凤凰频道吗?

这意味着您的客户端(移动设备、Web 等)必须为其订阅的每个聊天打开一个频道

这意味着如果他订阅了 2000 个聊天,他将不得不打开 2000 个频道(客户端负载)。

你会为一个用户创建一个凤凰频道吗?

这意味着您的客户(移动设备、网络等)将只需要打开一个渠道并且

这意味着对于每条传入的消息,您都必须查询房间中的所有用户(服务器负载)。

4

1 回答 1

1

在消息传递应用程序中,有两个主要问题。管理用户订阅的资源(用户、房间等)列表。这通常在客户端中显示为列表。因此,您需要呈现该列表并更新诸如存在、新消息警报之类的想法,并可能显示用户是否有打开的聊天窗口。无论用户/房间是点对点还是多用户(房间),这部分的解决方案都是相似的。

第二个问题是在打开/可见的单个聊天窗口中显示消息。解决方案可能会有所不同,具体取决于它们是点对点还是多用户。但是,Facebook 确实支持多用户聊天,所以我将根据我在 Phoenix 构建 Slack 克隆的经验来回答这个问题。

我推荐两个频道,一个用于用户,一个用于打开的聊天窗口,我们称之为聊天。对于每个打开的聊天窗口,每个用户将拥有一个用户频道实例和一个聊天频道实例。user_id 可用于用户频道的主题,例如"user:" <> user.user_id. 您可能会有每个聊天会话的模式(使用的是聊天会话的一部分)。因此,将该 id 用于聊天频道主题,例如"chat:" <> chat.id.

然后,您可以在聊天频道中广播新的传入消息,它们将发送给该​​聊天会话中的每个人(打开聊天窗口的人)。这适用于点对点和多用户窗口。

您在问题中提供的示例显示了具有不同状态(文本颜色)的两种用途。一个显示未接来电,另一个我认为是未读消息。这种类型的状态通常是特定于用户的,因此您将使用使用通道放置push此信息。

要跟踪用户列表上的指标,您可以从用户频道订阅聊天频道中的消息。然后,您将在用户频道中收到信息消息,并在需要时采取适当的措施。如果您订阅聊天加入消息,您可以构建这些列表并将其存储在您的socket.assigns结构中。有关更多详细信息,请参阅Phoenix 通道 - 每个插槽多个通道

我用于消息传递应用程序的另一个 API 是interceptapi。这允许您定义一个handle_out为频道的特定广播事件调用的函数。它可用于过滤或操作在该频道上广播的传出消息

于 2017-04-14T19:45:19.847 回答