使用 xmpp 的实时通知

Posted

技术标签:

【中文标题】使用 xmpp 的实时通知【英文标题】:real time notifications using xmpp 【发布时间】:2010-09-07 07:08:57 【问题描述】:

我希望使用 xmpp 在我的应用程序中包含两个功能。第一个是几乎完成的一对一聊天(使用 strophe),第二个是实时通知,就像它在 facebook 中的工作方式一样。我试图了解 xmpp 中的 pubsub 系统,但觉得它不适合这个特定问题。如有错误请指正,可能是由于没有正确理解概念。 我的要求是这样的—— 将有任何用户可以触发的预定义事件,当一个用户触发时,其他在线的人应该收到相同的通知。此外,我还想检查用户是否喜欢在发送通知之前接收通知。我在这里没有得到的是如果要使用 pubsub,节点在哪里以及如何适合。我可以只创建一个其他人都订阅的节点吗?在这种情况下,订阅者如何在不成为节点所有者的情况下在其上发布他们的事件?

我正在考虑的另一种方法是使用标题类型或附加有效负载(例如<notif/>)将消息逐个发送给所有用户的jid,以将其与普通消息区分开来。这种方法是否可以考虑可扩展性?

【问题讨论】:

【参考方案1】:

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

基本上,它创建了一个您的访问者可以加入的聊天室(可能不使用这种措辞),然后,当他们中的任何一个人感应到聊天室的消息时,所有他们明白了。您当然可以进行配置,只允许某些用户发布。

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

【讨论】:

感谢您的回复。我还用 strophe 尝试了 MUC,它工作得很好。但是在这种情况下,我想要的是一个通知系统,例如假设有一个问答模块并且我发布了一个问题,如果 user1 回答了这个问题,那么我会收到一个通知。然后,如果 userB 回答,我和 userA 都会收到通知。最重要的是,如果我在发布答案时在线,我应该会看到一个弹出窗口,而无需单击任何内容。如何使用服务器端 xmpp 库(如 xmpphp)向所有 jid 发送标题消息并使用 strophe 在客户端处理消息? 为了澄清我的上述问题——我尝试使用 xmpphp 向 jid 发送消息并使用 strophe 客户端接收它,它可以工作。我不确定如果要向很多人发送消息,这种方法是否会出现问题。【参考方案2】:

您尝试使用 xmpphp 库执行的操作,即在需要时向多个 jid 发送消息,是 pub-sub 或 MUC 可以为您执行的操作。 :D 因此,根据您的应用程序类型,您需要选择一个并继续使用 xmpp 进行试验,随着您的继续,事情应该会变得清晰......

【讨论】:

感谢您的回复..问题是我必须处理不同类型的通知。在某些情况下,pubsub 似乎是理想的解决方案,但并非适用于所有人。这就是为什么我考虑手动发送通知消息作为所有人的单一解决方案。 这不是我必须说的首选方式,因为随着您的应用程序负载开始增加,这种方法将无法扩展。最好让 jabber 服务器自行完成广播,您只需指示 jabber 服务器应该广播什么/何时/谁通知......【参考方案3】:

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

我已经在博客上写了 here。示例在 Java 中;希望你不会反对它;-)

【讨论】:

感谢您的回复,将检查 PEP。根据我的要求,需要将通知发布给可能在我的名册中或不在我名册中的任何人。假设我们考虑这个特定的线程,并且如果 abhinav 和 chuk lee 都在我的名单中,但他们不在彼此的名单中,尽管当 chuk lee 回答时,通知应该发送给 abhinav,因为他之前已经回答过。发给 abhinav 和我(问题作者)的文本也应该不同。 那么我建议您使用 MUC 方法,将聊天室用作 pubsub 节点。但是在 的单独命名空间中携带数据。这样,您的数据将不会出现在聊天室中。正如我所说,我还没有找到支持 pubsub 的公共服务器。 您的建议是有效地破解 MUC,以便您可以像 pubsub 一样使用它。当您可以使用 pubsub 时,为什么还要麻烦?【参考方案4】:

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

提到了 PEP,但如果您想向不在您名册中的用户发布信息,这不是正确的解决方案。

Pubsub 还允许您为消息定义任何您想要的内容类型,或者如果消息传输的简单行为足以提供足够的信息,则根本不定义。

【讨论】:

确实如此。 Pubsub 是如此通用,以至于任何远程描述发布-订阅方案的内容都将其视为 Pubsub 的可能用途。 这 100% 根本不是解决方案。我们不是来推销第 3 方商业服务的。 你在抱怨什么商业服务? Pubsub 只是 XMPP 协议的扩展。我什至没有提到许多可用的 OSS 或商业解决方案中的任何一个。

以上是关于使用 xmpp 的实时通知的主要内容,如果未能解决你的问题,请参考以下文章

Web 应用程序最有效的通知系统

node.js, XMPP Strophe.js

XMPP 上的群聊推送通知

XMPP 聊天和通知一起?

使用 HTTP 和 XMPP 协议的 GCM/FCM 推送通知

有人使用 XMPP 在 iOS 上实现推送通知吗?