2017-04-14 51 views
0

enter image description here如何保持订阅每个用户聊天它是继

那使者的Facebook UI

如果您正在执行与凤凰(酏剂框架)

你创造一个凤凰频道一个聊天?

哪样意味着你的客户端(手机,网络等)将不得不打开一个通道,每聊它在

哪样意味着被suscribed,如果有2000名的聊天记录,他在suscribed ,他将不得不打开2000个频道(客户端负载)。

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

哪样意味着你的客户端(手机,网络等)将不得不打开只有一个通道和

哪样意味着,对于每一个进来的消息,你必须查询人的用户在一个房间(服务器负载)。

回答

1

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

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

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

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

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

要跟踪用户列表中的指示符,您可以从用户频道订阅聊天频道中的消息。然后,您将在用户频道中收到信息消息,并根据需要采取适当的措施。如果您订阅了聊天加入消息,则可以建立这些消息的列表并将其存储在您的socket.assigns结构中。有关更多详细信息,请参见Phoenix Channels - Multiple channels per socket

我用于通讯应用的另一个API是intercept api。这允许您定义一个handle_out函数,该函数被调用以用于频道的特定广播事件。它可用于过滤或操纵在该频道上广播的传出消息