我已经通过了pubnub频道组设计模式,http://scalabl3.github.io/pubnub-design-patterns/2015/08/11/Advanced-Channel-Groups-Friend-Lists-Status-Feed-And-Presence.html
但仍然存在一些对实施群聊的疑虑
考虑我有GP1,GP2组
GP1 - A,B,C(成员) GP2 - A,D,E(成员)
由于
答案 0 :(得分:9)
您所指的帖子主要是关于创建浅层朋友图和状态Feed的模式,但您可以很容易地将其用于聊天。
对于聊天,您可以在此处学习模式:validate
如果小组聊天小组,则入站模式运行良好,我说小组聊天中的人数少于5-7人。对于较大的群组,它不运作良好,例如。 50个人,因为你发布给每个用户'您发送的每条聊天消息的入站频道。对于较大的群组,群聊本身应该拥有自己的频道。你是对的,如果你参加了大量的群聊,你将不得不在每个聊天中检索历史,每一个都是一个API调用。如果聊天更多是1-1或小组,则入站模式可以更简单地获取历史记录。
合并这两种模式意味着你将使用cg-user- [uid] -status-feed(也可能想要称之为不同的东西,命名约定当然可以是你自己的,也许是cg-user- [uid] -chats),但是放入入站频道+任何更大的群组聊天频道。
历史记录仍然基于每个频道,因此您将获得Inbound的历史记录,该记录将用于任何1-1或小组聊天,然后在任何用于较大群组聊天的频道上获取历史记录。
更具体地说,你的问题:
GP1和GP2都是小组,因此通过入站通道向每个用户发送任何聊天消息比较简单,在每个组中,在JSON有效负载中,您还将包含以下元数据:
Message to GP1 from User A
{
group_chat: "GP1",
from: "A",
to: "A,B,C",
timestamp: 1443112089,
message: "hey guys, good morning"
}
Message to GP2 from User E
{
group_chat: "GP2",
from: "E",
to: "A,D,E",
timestamp: 1443112192,
message: "I'm going afk for a bit, time for the gym"
}
此消息将发布3次,每个用户的入站通道一次[GP1:A,B,C,GP2:A,D,E]。使用该元数据,您可以获得所需的信息,以便在UI中确保将收到的消息放入正确的UI容器中,即GP1和GP2的群聊。
如果您有更多问题,请与我们联系......
答案 1 :(得分:3)
我认为您可能在您提供的链接上误解了设计模式的意图。因此,我将解释如何使用PubNub Channel Groups在非常高的层次上实现群聊,而不是尝试解决该特定的设计模式,也许该链接的详细设计模式可能会变得更加明显。
每个最终用户都有自己的频道组:
最终用户的频道组将包含他们当前正在参与(或至少被动收听)的每个聊天室频道。因此,cg_user123
可能包含频道sports_talk
,money_talk
和pubnub_is_awesome_talk。 cg_user456
可能包含money_talk
和your_momma_jokes
。因此,每个用户的频道组可以维护对该最终用户唯一的不同频道列表。
您还可以考虑Facebook或Twitter设计模式(朋友和粉丝)。每个最终用户都将拥有一个独特的频道组,其中包含所有朋友或他们关注的人的所有频道。当其中一个朋友在他们的私人频道上发布消息(不要与他们的私人频道组混淆)时,所有该发布者的朋友都将收到该消息,因为该频道在他们的每个朋友中。独特的渠道小组。如果我想取消联系或取消关注某人,我只需从我的频道组中删除该私人频道。
您还可以将频道组视为主题或感兴趣的主题(频道)。也许你决定你的应用程序允许你的最终用户订阅体育,金融,技术和政治。您可以为每个频道组创建一个频道组,并添加与这些频道组主题/主题相关的频道。因此,technology
频道组将包含pubnub_is_awesome
,ruby_fanboys
和long_live_cobol
频道(以及更多频道),其他频道组将包含适合这些主题的频道。然后,您的最终用户将选择接收来自这些高级主题的消息,您的应用会根据他们的主题兴趣将他们订阅到相应的频道组。您的服务器端代码可以在创建新频道时动态地向这些频道添加新频道,并删除不再使用的频道,并且您的客户端代码不需要执行任何其他工作。
我知道这可能不会直接回答您的问题,但我相信它可以更好地理解频道组的一些常用用例。