Openfire Server presence(在线状态)消息处理流程

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的实现比较精简和优雅,但如果想作为一个大型的高效消息投递系统还是有改进的空间。

Openfire Server presence(在线状态)消息处理流程相关推荐

  1. 通过smack client + openfire server 实现 peer to peer communication

    [0]README 1)本文旨在 给出源代码 实现 smack client + openfire server 实现 peer to peer communication 2)当然,代码中用到的 u ...

  2. 在SQL Server引用dll的流程

    原文:在SQL Server引用dll的流程 在SQL Server中引用dll分为两个步骤 1.创建一个dll文件 2.把dll文件放进SQL Server的程序集中.然后定义一个Function, ...

  3. spark+smack+openfire实现请求响应简单流程

    当时我想知道的问题很简单 就是服务端如何返回给客户端一个字符串或者数字或者布尔值 客户端如何接收 现在分享出来给和我一样的初学者 泪奔中 简单的查询好友测试,客户端成功发送请求,服务端接收并返回响应结 ...

  4. [BizTalk] 短消息处理流程

    2005年完成的项目 基本实现了消息处理的流程,流程比较简单. 子流程 转载于:https://www.cnblogs.com/xuzhong/archive/2006/04/29/387994.ht ...

  5. Spring Authorization Server入门 (三) 集成流程说明、细节补充和各种方式获取token测试

    1. Spring boot 与Spring authorization Server集成流程说明 1. 创建项目 2. 添加依赖 3. 初始化数据库(用户授权确认表.用户认证信息表和客户端信息表) ...

  6. redis server服务端启动流程分析(一)

    1.server.c main()服务启动的入口 下面是redis启动的入口程序server.c,简单列了主程序中比较关键的一些点. ## server.c int main(int argc, ch ...

  7. Microsoft Dynamics CRM server 2013   一般销售流程之 订单 简单介绍

    菜单----销售---- 订单 进入主页面,可以新建,删除,运行报表,其它分配功能. 默认订单 新建一个订单 如果订单完成了,可以把订单的状态改成完成,转财务流程,完成收款. 也可以点 取消订单,删除 ...

  8. Ubuntu Server安全Webserver搭建流程

    之前整过CentOS.整了Ubuntu才发现,Ubuntu简单多了--不知道性能相比又怎样. 以Ubtuntu 14.04为例.记录一下搭建流程. 一.SSHserver 第一件事当然是ssh,默认安 ...

  9. Windows Server 2008 安装详细流程 解说

    文\T.c.Vista 图片\转自 winsupersite.com 序...................... 终于等到了微软发布了Windows Server 2008(原代码名称" ...

最新文章

  1. Linux 下使用命令行查看 內核版本 | 系統版本 | cpu 位數 | 內存使用
  2. 学python需要多久-刚开始学习 Python 到可以写出一个爬虫大约需要多长时间
  3. 2021-03-07 Nussbaum函数
  4. Python3--自动化办公
  5. 可怕的乖孩子_小说《可怕的乖孩子》讲了一个什么故事?
  6. jenkins自动化打包部署,jenkins执行sh脚本不退出问题
  7. SDWebImage 4 0 迁移指南
  8. Linux探秘之用户态与内核态
  9. 数据库的增删改查和使用流程
  10. win7桌面便签。自带的
  11. 不被大神Hinton认同,否定现有同行成果,谷歌这篇烧脑研究最终拿下ICML2019最佳论文...
  12. Eclipse| Eclipse安装中文版本教程
  13. WinDirStat 电脑C盘分析神器
  14. 人力资源管理专业知识与实务(初级)【12】
  15. android实战:密码箱一
  16. 十九. 用户注册 --- 短信验证码实现 2021-04-16
  17. 递归算法删除某一链表指定节点为什么不会发生断链?(解析原因)
  18. 视频直播技术之iOS端推流 1
  19. oracle11g静默安装
  20. 个人电脑厂商艰难涉水家庭娱乐市场

热门文章

  1. 大专学java还是python_零基础应该选择学习 java、php、前端 还是 python?
  2. java程序试岗内容_java程序员修炼之路基础篇四:继承
  3. linux还原备份的内核镜像,使用Mondo制作Linux镜像(ISO)、还原系统图文详解
  4. java中是什么意思_java中是什么意思?
  5. java 签名 apk mac_java 方法签名
  6. if语句的一种使用失误
  7. pcie 设备号多少位_怎么读取PCIe设备的VPD信息?
  8. 使用Intellij IEDA创建hibernate
  9. Struts2_day04--课程介绍_Struts2拦截器概述底层原理_重要的概念
  10. Copy 与MutableCopy的区别