使用XMPP实现实时通知

3
我希望我的app使用xmpp来包含两个功能。第一个是一对一聊天,这个功能已经基本完成(使用strophe)。第二个是实时通知,就像Facebook中的工作方式一样。我试图理解xmpp中的pubsub系统,但感觉它不适合这个特定的问题。如果我错了,请纠正我,可能是由于没有正确理解概念。我的需求是这样的——将有预定义的事件,任何用户都可以触发,当其中一个用户这样做时,在线的其他用户应该收到相同的通知。进一步地,我还想检查用户是否愿意在发送通知之前接收通知。我不明白的是,如果要使用pubsub,节点在哪里,如何适用。我能否创建只有一个节点,其他人都订阅它?在这种情况下,订阅者如何在不成为节点所有者的情况下将其事件发布到节点上?
另一种方法是逐个向所有用户的jid发送消息,使用标题类型或附加的有效负载来区分它与普通消息。考虑可扩展性,这种方法可行吗?
4个回答

1

PubSub可以工作,但是你所描述的更像是MUC(多用户聊天室)。

基本上,它会创建一个聊天室,您的访问者可以加入(也许不使用这个措辞),然后,当他们中的任何人向聊天室发送消息时,所有人都会收到。您肯定可以进行配置,只允许某些用户发布。

由于您已经在浏览器上运行了客户端,并且使用Strophe,所以应该相当容易。只需确保此MUC组件正在您的服务器上运行即可。


谢谢回复。我也尝试了使用strophe的MUC,它运行得非常好。但在这种情况下,我想要一个通知系统,例如假设有一个问答模块,我发布一个问题,如果用户1回答,则我会收到通知。然后如果用户B回答,我和用户A都会收到通知。最重要的是,如果我在线时有答案发布,我应该看到一个弹出窗口,而无需点击任何内容。那么,如何使用服务器端xmpp库(例如xmpphp)向所有jid发送标题消息,并使用strophe在客户端处理消息呢? - naiquevin
为了澄清我的上述问题 - 我尝试使用xmpphp向jid发送消息,并使用strophe客户端接收它,它可以正常工作。我不确定的是,如果要向多个人发送消息,这种方法是否会出现任何问题。 - naiquevin

1

你正在使用 xmpphp 库尝试进行的操作,即在需要时向多个 JID 发送消息,这正是 Pub-Sub 或 MUC 可以为您完成的操作。 :D 因此,根据您的应用程序类型,您需要选择一种并开始尝试使用 xmpp,随着您的进展,事情应该会变得清晰起来....


谢谢回复。问题是我需要处理不同类型的通知。在某些情况下,发布/订阅似乎是理想的解决方案,但并非所有情况都适用。这就是为什么我考虑手动发送通知消息作为所有问题的单一解决方案。 - naiquevin
我必须说,那不是首选方式,因为随着应用程序负载的增加,这种方法将无法扩展。最好让Jabber服务器代表您执行广播操作,您只需指示Jabber服务器何时/何地/向谁广播通知即可... - Abhinav Singh

1

关于实时通知的第二个问题,你需要使用PEP而不是pubsub。两者之间的主要区别是PEP只会发布给你花名册中的人,我想这正是你想要的。此外,我认为PEP比pubsub更广泛地得到支持,或者至少jabber.org支持它。唯一的问题是PEP需要实体能力支持。

我在这里写了一篇博客。示例是用Java编写的;希望你不反感它 ;-)


谢谢您的回复,我会查看PEP。 根据我的要求,通知需要发布给可能在我花名册中也可能不在我花名册中的任何人。假设我们考虑这个特定的线程,并且如果abhinav和chuk lee都在我的花名册中,但他们彼此之间不在对方的花名册中,则即使chuk lee回答,通知也应该发送给abhinav,因为他先回答了。此外,发送给abhinav和我(问题的作者)的文本应该是不同的。 - naiquevin
那么我建议您使用MUC方法,通过使用聊天室作为发布/订阅节点。但是,在<message>中将数据传递到单独的名称空间中。这样,您的数据将不会出现在聊天室中。就像我说的,我还没有找到支持发布/订阅的公共服务器。 - Chuk Lee
你所建议的是绕过MUC的方式,以便像使用pubsub一样使用它。既然可以直接使用pubsub,为什么还要费这个劲呢? - Robin

0

对于这种情况,Pubsub是一个合适的解决方案。从我所看到的来看,它可以处理您所有的要求。如果您希望用户针对每种消息类型进行不同的订阅(或者可以在单个节点上使用过滤器),则需要为每种事件类型设置一个节点,但我认为多个节点更容易操作。节点所有者可以允许任何人发布到节点,因此这不是问题。

PEP被提及,但如果您想向不在您的花名册中的用户发布,则不是正确的解决方案。

Pubsub还将允许您为消息定义任何内容类型,或者如果仅仅是消息传输的简单行为已经足够信息量的话,也可以不定义任何内容类型。


确实。Pubsub 是如此通用,以至于任何即使是稍微描述发布-订阅场景的东西都可以被视为 Pubsub 的可能用途。 - Tim
这根本不是解决方案。我们不在这里推销第三方商业服务。 - Shahid Karimi
你在抱怨哪些商业服务?Pubsub只是XMPP协议的一个扩展。我甚至没有提到任何可用的OSS或商业解决方案。 - Robin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接