功能复杂且包含及时通讯功能的app后台系统架构

前言:

1.及时通讯开源协议:xmpp

2.较好的开源协议的实现:tigase、openfire

3.鉴于openfire有成套的后台程序以及客户端程序,部署简单且快速,推荐即时通讯服务端开发的新人优先采用openfire进行二次开发

 

项目说明:项目为一款职业社交app,客户端功能模块有焦点新闻(首页),群组(可以在没有成为群好友的情况下浏览群消息并评论收藏群消息),会议(可以在没有成为会议参与用户的情况下浏览会议消息并评论收藏会议消息),个人中心(关注,粉丝,私信,收藏,动态);

 

项目分析:项目并非单纯的聊天工具,可以对聊天信息进行评论、收藏、可以从收藏的信息中跳转到具体的群组(或会议)的具体信息位置、服务端要记录聊天信息内容;客户端用户不关注其他用户是否在线;所以聊天属性其实仅有群组(会议)中及时接收到消息这一个属性;而且openfire系统复杂、表数量众多;顾不适宜全部开发openfire插件的形式实现功能,而是提供一个业务服务器和一个openfire服务器来共同担任后台服务器更为合适;openfire仅负责维护客户端socket链接的session以及发送消息给客户端;其他客户端的所有交互操作由业务服务器提供。

 

具体的架构细则如下:

系统架构:
1.openfire只是利用他的链接管理功能以及消息路由发送功能;

2.所有业务逻辑都在业务服务器中自行开发实现(包括聊天室创建、用户管理、客户端聊天信息接受)

3.所有的消息发送、评论发送等都发送到业务服务器;业务服务器处理后再转发到openfire服务器,openfire负责将消息路由至对应的客户端

4.of服务器的作用:接受客户端登陆以记录客户端的socket session、定时发送ping包给客户端以确保客户端仍然在线、接收业务服务器传递过来的消息并路由给对应的客户端(在线则直接发送,不在线则通过推送消息发送),发送消息给客户端并记录客户端的应答(发送完则状态为未接受并置入缓存;接收到回执则状态为已接收从缓存中消息、如果超过1分钟仍然未接收到回执则视用户已经离线关闭用户session并将消息存储到离线表并推送给用户)

5.客户端需要存储信息记录,客户端信息记录的前后查询优先从本地获取,本地无记录则从业务服务器上下拉至本地

6.业务服务器用户信息有id、uuid(第三方平台的id)、source(第三方平台)、devicetype、key(供openfire当做密码使用);openfire用户信息有id(用户名)、key(密码)

7.用户发送到群组的消息再业务服务器接收到后保存再业务服务器数据库中,业务服务器发送消息给of服务器,of服务器将消息分发给已经加入群组的用户;未加入群组的用户围观消息时在消息界面定时从业务服务器拉取服务器最新消息

8.群聊流程:客户端用户a发送群消息》业务服务器接收群消息并给客户端回执(入库),转发群消息》openfire接收业务服务器的群消息(查找群用户并给每个用户发起一个路由信息)》客户端用户b接收到群消息并给openfire服务器回执;
8.1客户端发送消息时如果没有收到回执则标记信息状态为发送失败,用户点击后可以重发;
8.2openfire发送消息给客户端时记录到消息缓存中,如果超过1分钟仍然没有接收到消息回执,则将消息记录到离线信息表;
8.3客户端每次链接openfire成功后先获取离线消息并保存到本地数据库
8.4客户端接收到的openfire消息需要对比下消息id,如果消息id重复则不入库(避免openfire服务器没有接收到消息回执导致重新发送消息的情况)
8.5业务服务器接收到的客户端消息需要对比下消息id,如果消息id重复则不入库并且不转发给openfire服务器(避免客户端没有接收到消息回执导致重新发送消息的情况)





 

 部署环境:

centos 6;mysql 5;redis 缓存;memcache二级缓存;openfire消息服务器;tomcat服务器;nginx前端代理

 

 

你可能感兴趣的:(openfire,XMPP,即时通讯,tigase)