Presence处理是IM Server的核心,也是一个IM Server最复杂的部分。一个用户的状态发生变化,需要通过服务器自动投递给他所有在线的好友,因此Presence模块实际上等同一个消息处理服务器,可参看以前消息服务器相关文章ActiveMQ性能研究及与memcacheq比较。Presence的复杂性体现在:1. 由于每个用户都有1到多个好友,服务器的处理量被放大。2. 分布式处理的复杂度,你的好友可能同时分布在n个服务器上,而且同时上线的好友没有规律。3. 请求量不均衡,可能瞬时非常大。比如你服务器刚重启所有的客户几乎同时自动重连过来。比如Twitter宕机都是在一些热点事件时,大家活跃度突然同时增大。所以系统必须按峰值的处理量设计。4. 缓存cache设计困难。每个用户的在线好友都不同,而且随时在变。5. 隐身同黑名单的业务逻辑很难高效处理。Openfire Server处理presence的流程如下:1. ConnectionHandler.messageReceived();mina 层面处理。
2. StanzaHander.process() => processPresencexmpp 层面。处理所有xmpp包的方法,实际上只有login相关包在这里处理。其他类型的包交由相关逻辑类来处理。 由于是个presence包,交由下面presence逻辑处理模块进行。(also add from to packet)
3. PacketRouteImpl.route() // route presence4. 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处理消息流程及openfire详细信息
openfire消息接收、处理流程图.JPG
这里是个人绘制出的openfire流程图的初稿,里面包括:message、presence、iq节的接收类与相应的处理方法...到最后的处理过程。图的缩略图见:http://blog.csdn.net/love254443233/article/details/7891236。 该图仅...
自己写的获取所有在线用户的openfire插件,直接上传到openfire服务器即可使用,访问路径为host:port/plugins/onlines/listall
openfire消息、监听、启动流程分析 openfire消息、监听、启动流程分析 openfire消息、监听、启动流程分析
目前研究插件的还比较少,简单做一下学习总结。详细介绍请看我的blog:http://hi.baidu.com/jyleon/blog/item/5a6627dd7fc4dbd18d1029bf.html
代码很简单,可以用,修改一下配置文件就行了
Openfire下实现WebServer的demo
openfire插件,本插件直接在openfire里安装即可,集成消息在线和离线的存储、查询接口,图片、表情、语音文件的上传和下载对外接口,因此,不需要修改openfire源码即可满足聊天的实用功能,对外提供3个接口,一消息...
安装openfire的详细过程,手把手的教你,
针对现有消息推送技术应用于无线网络信号不稳定的环境中容易导致消息丢失这一问题,以电力生产领域的移动应用为例,提出基于Openfire推送服务的消息防丢失机制,即在现有的消息推送架构中增加消息管理服务器并设计...
联系人分组,群聊,修改在线状态,邀请群人员,设置群管理员,踢人。。类似QQ的功能。 页面中以script的形势引入miq.jsp稍作修改配置成自己的openfire服务器即可用
Openfire最主要的功能是实现XMPP服务器,Openfire的核心功能可以概括为:连接管理、消息解析、消息路由、消息发送.
openfire记录在线统计人数插件
openfire防止消息丢失插件,防止丢包插件
Extensible Messaging and Presence Protocol,简单的来讲,它就是一个发送接收处理消息的协议,但是这个协议发送的消息,既不是二进制的东东也不是字符串,而是XML。
openfire下,android实现消息推送的小demo
openfire的用户接收消息计数器,应用很方便,通过填写openfire的用户user_no号与密码,还有服务器的ip地址,点击登录就可以等待消息的接收,并且统计接收消息的数量.
openfire服务器在进行消息转发时,如果接收者网络断开,服务器检测不到接收者已下线,转发后消息会丢失,为解决消息丢失,有四种解决方案: 1.发送之前“发送心跳” 2.发送之前“发自定义结构” 3.客服端收到消息...
代码里做了逻辑处理,会随机只返回3个,改下就可以了 访问路径 127.0.0.1:8080/plugins/onlineuser/getallusers