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