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.boradcastPresence();
检查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的实现比较精简和优雅,但如果想作为一个大型的高效消息投递系统还是有改进的空间。
http://hi.baidu.com/jabber/blog/item/4df7e15027171e591038c2d7.html/cmtid/a6637bf0c6cb6ca0a50f522c
分享到:
相关推荐
在Openfire中,消息、监听和启动流程是其核心功能,理解这些流程对于管理和维护Openfire服务器至关重要。 **Openfire消息流程**: Openfire的消息传递主要通过XML stanza(元素)进行,包括IQ、MESSAGE和PRESENCE三...
### Openfire消息处理流程与详细信息解析 #### XMPP协议概览 XMPP,全称Extensible Messaging and Presence Protocol,是一种基于XML的即时通讯协议。它不仅用于消息发送与接收,还支持状态更新和在线状态通知,即...
openfire消息接收、处理流程图.JPG
这里是个人绘制出的openfire流程图的初稿,里面包括:message、presence、iq节的接收类与相应的处理方法...到最后的处理过程。图的缩略图见:http://blog.csdn.net/love254443233/article/details/7891236。 该图仅...
Openfire支持XmppPush,可以将服务器端的新消息推送到客户端,即使应用在后台或者设备熄屏状态下也能接收到通知。这通常涉及到Android的GCM(Google Cloud Messaging,已被FCM替换)或Firebase Cloud Messaging服务...
【基于openfire的web在线聊天源码】是一个实现网页端即时通讯系统的开源项目,它利用了Openfire服务器作为后台支持,提供了丰富的功能,包括联系人分组、群聊、在线状态修改、群成员邀请、设置群管理员以及踢人等,...
它不仅用于即时通讯(IM),还可以处理在线状态(presence)和其他实时通信需求。由于XML的可扩展性,XMPP能够支持各种自定义功能和应用集成,例如在企业环境中提高生产效率或在游戏中实现沟通与协作。 在开源社区...
总之,实现在Openfire下运行WebServer涉及多个步骤和技术,包括选择合适的WebServer、集成Openfire的插件系统、设计Web应用的架构以及处理安全性问题。通过以上介绍,你应该对这个过程有了一个全面的了解。
自己写的获取所有在线用户的openfire插件,直接上传到openfire服务器即可使用,访问路径为host:port/plugins/onlines/listall
【Openfire 消息处理流程详解】 Openfire 是一款基于 XMPP 协议的即时通讯服务器,它与其他的客户端(如 Spark)以及传输协议实现(如 Smack)一起,构成了一个完整的 XMPP IM 解决方案。XMPP,即可扩展消息和存在...
目前研究插件的还比较少,简单做一下学习总结。详细介绍请看我的blog:http://hi.baidu.com/jyleon/blog/item/5a6627dd7fc4dbd18d1029bf.html
这里的"127.0.0.1"是本地主机地址,"8080"是OpenFire服务器运行的端口,"/plugins"表示服务器提供的插件服务,"onlineuser"可能是处理在线用户查询的特定插件名,而"getallusers"则可能是该插件提供的一个API端点,...
Openfire是一款开源的即时通讯服务器,它基于XMPP(可扩展消息处理现场协议)标准,提供强大的实时通信功能。在Openfire的生态系统中,开发插件是增强其功能的有效方式。本文将深入探讨“Openfire消息回执插件”,并...
Openfire即时消息传输平台是一款基于Java技术的开源通信系统,它允许用户通过XMPP(Extensible Messaging and Presence Protocol)协议进行实时的、双向的通信。Openfire v4.8.0是该平台的一个版本,提供了丰富的...
Openfire作为XMPP服务器,负责处理客户端的连接、认证、会话管理和消息路由。 1. **安装与配置Openfire**: - 下载并安装Openfire服务器:访问官方网站下载最新版本的Openfire,按照提示进行安装。 - 配置服务器...
资料中涵盖了Openfire的内部工作原理、消息处理流程、以及如何通过插件扩展其功能。 标签中的“openfire xmpp 消息机制 客户端”说明了该资料主要围绕Openfire服务器、XMPP协议、消息机制和客户端交互等方面展开。 ...
标题中的“用flash+xiff+openfire 实现网页端接收推送消息”指的是一种技术...总之,这个技术组合实现了基于Flash的网页端即时消息推送,通过XIFF库实现与Openfire服务器的XMPP通信,为用户提供实时的在线聊天体验。
Openfire是一款开源的企业级即时通讯服务器,它基于XMPP(Extensible Messaging and Presence Protocol)协议,提供稳定且可扩展的实时通信服务。在Openfire中,实现用户接收消息的计数功能是提升通信效率和监控系统...
首先,Openfire服务器控制台中的管理消息模块是用于向在线用户发送通知的,它可以看作是一种推送方式。该模块实现的功能和broadcast(广播)插件类似,都允许服务器向所有或特定用户发送消息。Broadcast插件实际上是...
总结,agsxmpp与Openfire的通讯涉及XMPP协议、网络安全、认证流程、消息格式等多个方面。在遇到登录或发送消息的问题时,应从网络、认证、权限和服务器配置等多个角度排查和解决。而SCADAInfoSys文件可能提供了SCADA...