Presence处理是IM Server的核心,也是一个IM Server最复杂的部分。一个用户的状态发生变化,需要通过服务器自动投递给他所有在线的好友,因此Presence模块实际上等同一个消息处理服务器,可参看以前消息服务器相关文章ActiveMQ性能研究及与memcacheq比较。
Presence的复杂性体现在:
1. 由于每个用户都有1到多个好友,服务器的处理量被放大。
2. 分布式处理的复杂度,你的好友可能同时分布在n个服务器上,而且同时上线的好友没有规律。
3. 请求量不均衡,可能瞬时非常大。比如你服务器刚重启所有的客户几乎同时自动重连过来。比如Twitter宕机都是在一些热点事件时,大家活跃度突然同时增大。所以系统必须按峰值的处理量设计。
4. 缓存cache设计困难。每个用户的在线好友都不同,而且随时在变。
5. 隐身同黑名单的业务逻辑很难高效处理。
Openfire Server处理presence的流程如下,以3.6.0为准。
1. ConnectionHandler.messageReceived();
mina 层面处理。
2. StanzaHander.process() => processPresence
xmpp 层面。处理所有xmpp包的方法,实际上只有login相关包在这里处理。其他类型的包交由相关逻辑类来处理。 由于是个presence包,交由下面presence逻辑处理模块进行。(also add from to packet)
3. PacketRouteImpl.route() // route presence
4. PresenceRoute.route() => handle() // route presence
由于presence是一个需要路由的包,路由主要区分目标是本机还是远程,是component/server还是普通用户。
5. PresenceUpdateHandler.process() => broadcastUpdate
// process() update db and update cache,
calls PresenceManager.userAvaliable(); session.setPresence()...
6. Roster.broadcastPresence();
检查privacy list(隐身及黑名单用户)然后路由给所有在线好友。
7. RoutingTable.routePacket, routeTable.getRoutes()
真正的工作在这里,较慢。
8. session.process(), session.deliver
已经分发到相关用户了,调用该用户的session投递给此用户
9. nioconnection().deliver, deliver to the end users
再回到MINA
因此Presence投递工作的核心是在6~7,不过其他的步骤也有不少细节的处理。Openfire中6~7的实现比较精简和优雅,但如果想作为一个大型的高效消息投递系统还是有改进的空间
分享到:
相关推荐
### Openfire消息处理流程与详细信息解析 #### XMPP协议概览 XMPP,全称Extensible Messaging and Presence Protocol,是一种基于XML的即时通讯协议。它不仅用于消息发送与接收,还支持状态更新和在线状态通知,即...
在Openfire中,消息、监听和启动流程是其核心功能,理解这些流程对于管理和维护Openfire服务器至关重要。 **Openfire消息流程**: Openfire的消息传递主要通过XML stanza(元素)进行,包括IQ、MESSAGE和PRESENCE三...
这里是个人绘制出的openfire流程图的初稿,里面包括:message、presence、iq节的接收类与相应的处理方法...到最后的处理过程。图的缩略图见:http://blog.csdn.net/love254443233/article/details/7891236。 该图仅...
标题中的“用flash+xiff+openfire 实现网页端接收推送消息”指的是一种技术...总之,这个技术组合实现了基于Flash的网页端即时消息推送,通过XIFF库实现与Openfire服务器的XMPP通信,为用户提供实时的在线聊天体验。
Openfire支持XmppPush,可以将服务器端的新消息推送到客户端,即使应用在后台或者设备熄屏状态下也能接收到通知。这通常涉及到Android的GCM(Google Cloud Messaging,已被FCM替换)或Firebase Cloud Messaging服务...
它不仅用于即时通讯(IM),还可以处理在线状态(presence)和其他实时通信需求。由于XML的可扩展性,XMPP能够支持各种自定义功能和应用集成,例如在企业环境中提高生产效率或在游戏中实现沟通与协作。 在开源社区...
Openfire即时消息传输平台是一款基于Java技术的开源通信系统,它允许用户通过XMPP(Extensible Messaging and Presence Protocol)协议进行实时的、双向的通信。Openfire v4.8.0是该平台的一个版本,提供了丰富的...
【基于openfire的web在线聊天源码】是一个实现网页端即时通讯系统的开源项目,它利用了Openfire服务器作为后台支持,提供了丰富的功能,包括联系人分组、群聊、在线状态修改、群成员邀请、设置群管理员以及踢人等,...
资料中涵盖了Openfire的内部工作原理、消息处理流程、以及如何通过插件扩展其功能。 标签中的“openfire xmpp 消息机制 客户端”说明了该资料主要围绕Openfire服务器、XMPP协议、消息机制和客户端交互等方面展开。 ...
首先,Openfire服务器控制台中的管理消息模块是用于向在线用户发送通知的,它可以看作是一种推送方式。该模块实现的功能和broadcast(广播)插件类似,都允许服务器向所有或特定用户发送消息。Broadcast插件实际上是...
- Openfire是基于XMPP协议的,XMPP是一种基于XML的开放标准,用于即时消息和在线状态服务。它的设计目标是提供一种灵活且可扩展的框架,使得开发者能够轻松构建分布式、安全的即时通讯应用。 2. **Android客户端...
ASMACK使得Android开发者可以方便地集成XMPP功能,如发送和接收消息、处理在线状态等。`Smack帮助文档中文版.rar`包含的文档将帮助开发者理解如何在Android应用中使用ASMACK,避免因兼容性问题而带来的困扰。 **...
5. **处理在线状态**:`Presence`类用来表示用户的状态,如在线、离线、忙碌等。可以使用`sendPresence()`发送状态更新,`presenceSubscriptionRequired()`来处理订阅请求。 6. **多用户聊天**:Openfire支持多用户...
总结,agsxmpp与Openfire的通讯涉及XMPP协议、网络安全、认证流程、消息格式等多个方面。在遇到登录或发送消息的问题时,应从网络、认证、权限和服务器配置等多个角度排查和解决。而SCADAInfoSys文件可能提供了SCADA...
Openfire作为XMPP服务器,负责处理客户端的连接、认证、会话管理和消息路由。 1. **安装与配置Openfire**: - 下载并安装Openfire服务器:访问官方网站下载最新版本的Openfire,按照提示进行安装。 - 配置服务器...
Openfire是一款开源的即时通讯服务器,它基于XMPP(Extensible Messaging and Presence Protocol)协议,为企业和组织提供了安全、可扩展的实时通信平台。这款聊天系统支持多种客户端,包括网页、桌面应用以及移动...
Openfire是一款开源的企业级即时通讯服务器,它基于XMPP(Extensible Messaging and Presence Protocol)协议,提供稳定且可扩展的实时通信服务。在Openfire中,实现用户接收消息的计数功能是提升通信效率和监控系统...
4. **消息处理**:在服务器端,插件接收到HTTP请求后,解析参数,然后使用Openfire的内部API或SMACK库(一个XMPP客户端库)模拟XMPP消息发送流程。 5. **错误处理**:返回适当的HTTP状态码和响应内容,以便客户端...
Openfire不仅遵循基本的XMPP协议(RFC3920),更进一步实现了XMPP-IM(RFC3921)协议,这使得它能够处理更加复杂的实时通信场景,如用户状态切换、消息订阅与通知等,为用户提供了一个全面的实时通信解决方案。...