IM服务器的架构

一、 总的构架结构示意图:

如上图所示,目前系统总的分成六个模块,

分别为网络/协议解析模块,用户帐号管理模块,消息处理模块,动作处理模块,数据均衡处理模块,客户状态处理模块 。

正常流程应该这么实现,以一个或者几个线程运行网络/协议解析模块,然后他根据具体的包类型分发给具体的命令处理模块,每个具体的命令处理模块 至少应该分别运行于不同的线程。

从上面的结构图可以看出,其中客户状态模块和网络/协议解析模块都是公用模块,其他的模块几乎都依赖于这两个模块。目前因为很多功能不予以实现,例如不实现离线消息,所以只有用户帐号管理模块跟数据库相关。

二、 每个模块的具体功能描述 
1. 用户帐号管理模块: 
该模块管理基于用户帐号的所有操作:具体由如下:创建用户,删除用 户,修改用户资料,修改用户密码,得到用户个人信息,得到好友列表,登陆,登出,请求认证串,创建群组,加入群组,离开群组。

以上所有操作,除了创建用户不需要登陆外,其他的任何操作都必须是已经登陆的用户,所以必须先有登陆操作,才能进行下一步的操作,这条规则针对 所有的命令都是。

描述一下登陆过程: 
客户端发送命令请求得到认证串——〉网络/协议解析模块把客户端请求以及它的用户标志转发给用户帐号管理模块 ——〉用户帐号管理模块自动生成一个随机认证串,同时把该客户端的用户标志一起保存在列表中(在列表中该数据只能保存一分钟,超过则删除,因此客户端必须 在一分钟内利用此认证串登陆),同时把认证串由网络/协议解析模块发送给客户端——〉客户端把用户名和认证串、用户名、密码组成的新串的MD5一并发给服 务器请求登陆——〉网络/协议解析模块把客户端请求以及它的用户标志转发给用户帐号管理模块——〉用户帐号管理模块首先检查列表中是否有该用户标志的数 据,如果有则继续——〉从数据库中取出用户名和密码,然后从列表中取出认证串,生成MD5,看是否一致,如果一致,则表示登陆成功,服务器生成会话加密密 钥,以后的所有与服务器的会话信息都采用此密钥加密和解密——〉网络/协议解析模块把结果发送给客户端,如果成功——〉网络/协议解析模块把该用户的用户 标志和会话加密密钥保存在客户状态模块中。

2. 网络/协议解析模块: 
网络解析模块应该保存一个最近的登陆用户列表的缓存,该列表保存的信息应该有IP和端口,还有加密密钥, 最后一次访问的时间。在该列表的用户,如果超过一定时间(例如一分钟)没有访问,就要从该列表中删除。该列表的主要用途用于快速的查找登陆用户(这样频繁 访问服务器的用户登录检查就不需要丛客户状态模块中查询了,提高效率),如果在此列表中查找不到,则向客户状态模块查找,如果找到了,则把用户添加到此列 表中。如果找不到,则表示不在线。

任何时候收到用户的消息,则要更新登陆用户列表的缓存中的最后访问时间数据,如果该用户不在列表中,但是最后检查已经登陆,则要添加。还有心跳 命令不应该影响该列表的用户数据。但是心跳命令会影响客户状态列表。

网络解析模块应该保存一个用户标志映射列表(也可以直接组合他们的数据地址),把客户端的IP地址和端口映射到一个具体的唯一客户端标志值,然 后这个值以后作为这个客户端的标志,各个具体模块对客户端的任何操作都以这个标志为基础。

有四个功能 
第一,根据不同的类型把数据报解密后(如果需要解密)分发给各个具体的处理模块。在分发前,首先检查该用户是否登陆,如果 没有,则直接告诉客户端一个错误。对于新建用户,登陆命令,获取认证字符串的命令不需要检查是否已经登陆。 
第二,自己处理相关的消息,目前自己 处理的消息包括心跳消息和客户端请求建立直连的命令,还有任何数据包的格式不对或者版本不对的情况处理,则该模块自己就处理了。 
第三,把用户发 送消息时的状态提交给客户状态模块,其中包括用户唯一标志。如果用户在发送消息时,地址已经修改了,那么唯一标志必须保持不变,但是用户标志列表中的用户 地址数据必须跟着修改。 
第四,包各个模块发送给客户端的消息加密后(如果需要)处理发送给客户端。

3. 客户状态模块: 
该模块的功能如下: 
第一、 保存并操作所有当前在线的用户信息,包括用户的登陆时间,用户标志,用户状态(隐身等),用户帐号。提供给其他模块查询某个用户是否登陆。 
第 二、 处理获取在线好友的消息,如果收到此命令,则通过用户帐号管理模块查找该用的好友列表,同时查找当前的在线用户列表,然后就得到在线好友列表。 
第 三、 处理用户状态改变的命令,如果收到用户的状态改变消息(如登录、登出、隐身等),则查找该用户的在线好友列表,然后一一通知。 
第四、 如果长时间没有收到用户的消息,则认为该用户因为意外的原因而断线,则自动认为登出。客户端在没有任何消息需要发送时,会定时的向服务器发送心跳命令,告 诉服务器客户端在线,如果连续一段时间没有收到心跳信息,则认为用户已经断线。 
第五、 保存并操作在线群组信息。给其他模块提供获取特定群组或者场景中的用户列表功能。

4. 消息处理模块: 
处理所有的消息转发,包括群消息,好友消息。 
对于好友消息,该消息处理模块首先通过客户状态模块检查 好友是否在线,如果在线,则把好友消息发送过去,如果不在线,则不发送。 
对于群消息,如果是针对普通的群组消息,则通过客户状态模块得到该群组 的在线用户列表,然后给每个人发送该消息,除了自己。 
如果是场景中的公有消息,则先检查该用户所在场景的位置,然后计算出能够听到该用户的场景 中的其他用户的用户列表,然后给每个人发送消息。计算的算法参考每个场景用户的坐标,其中在特定场景中的用户不参与运算,除非在同一个的特定场景中的用户 才参与运算。 
注意:对于场景消息,如果客户端不是以场景方式登录的,那么就不能发送和接收场景消息。

除了以上的消息,还有广告消息,系统消息之外客户端可以接受外,陌生人不能互发消息,如果服务器接受到此列消息,必须忽略,不发送任何应答。

5. 动作处理模块: 
处理所有场景动作,该消息只有场景用户方式登录的才能发送和接收动作命令。服务器接收用户的动作命令,计算出用 户所在的场景中能够看到的人的列表,然后一一发送命令给该用户。计算的算法参考每个场景用户的坐标,其中在特定场景中的用户不参与运算,除非在同一个的特 定场景中的用户才参与运算。

该模块中保存有一个用户的位置和动作状态表(包括是否在某个特定的场景里面信息),保存场景用户的所在场景用户的坐标和最后一次的动作状态信 息。

场景用户登录后,位置每更新一次,都必须把该用户所在的场景位置坐标发送给服务器,对于心跳信息和动作信息不需要携带位置坐标数据。

6. 数据均衡处理模块: 
该模块主要为了分布式处理,服务器负载平衡而设计,主要发出网络服务器重定向的命令,对于这些命令,所有客 户端都必须处理,因为一旦服务器发出了这个命令后,就在此服务器不再保存该用户信息了。 
目前该模块不实现。

时间: 2024-10-10 07:50:51

IM服务器的架构的相关文章

linux下dhcp服务器的架构与实现

一.实验原理 在linux系统下架构DHCP服务器,为网络中的主机动态获取ip地址. 二.地址规划 192.168.2.0网络动态分配地址 地址池192.168.2.200 192.168.2.240 子网掩码 255.255.255.0 网关 192.168.2.254 DNS指向 202.102.224.68 202.102.227.68 三.实验步骤 ① 挂载光驱,安装dhcp server vim /etc/sysconfig/network-scripts/ifcfg-eth0 mou

手机服务器微架构设计和实现专题

9.29 开始动手看着慕课网的视频去学习手机服务器微架构实现,原因是: 现在自己想要认真地学习了解android的基本网络知识,以及其实践 一.知识准备 首先,我要了解tcp.udp和http的关系,了解自己需要在什么情况下选择哪个. 然后,就是我需要了解的是http的实现原理. 据说这个是我们面试时有可能需要考到的,其实,我需要的是弄清楚 request和accept需要做的是什么 最后,是关于http的解析过程. 二.写代码过程 接下来,就是跟着视频写代码 : 首先是设定accept soc

转:Socket服务器整体架构概述

Socket服务器主要用于提供高效.稳定的数据处理.消息转发等服务,它直接决定了前台应用程序的性能.我们先从整体上认识一下Socket服务器,Socket服务器从架构上一般分为:网络层.业务逻辑层.会话层.数据访问层,如图: (图1) (一) 网络层 网络层主要用于侦听socket连接.创建socket.接受消息.发送消息.关闭连接.作为socket通信服务器,网络层的性能相当重要,所以我们在设计网络层时,要着重在以下几方面获得突破:最大连接数.最大并发数.秒处理消息数.如何突破呢?下面我为大家

浅谈图片服务器的架构演进

浅谈图片服务器的架构演进 现在几乎任何一个网站.Web App以及移动APP等应用都需要有图片展示的功能,对于图片功能从下至上都是很重要的.必须要具有前瞻性的规划好图片服务器,图片的上传和下载速度至关重要,当然这并不是说一上来就搞很NB的架构,至少具备一定扩展性和稳定性.虽然各种架构设计都有,在这里我只是谈谈我的一些个人想法. 对于图片服务器来说IO无疑是消耗资源最为严重的,对于web应用来说需要将图片服务器做一定的分离,否则很可能因为图片服务器的IO负载导致应用 崩溃.因此尤其对于大型网站和应

[翻译]用 Puppet 搭建易管理的服务器基础架构(3)

我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第三部分. 本文由 伯乐在线 - Wing 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Manuel Kiessling.欢迎加入翻译组. <用 Puppet 搭建易管理的服务器基础架构(1)> <用 Puppet 搭建易管理的服务器基础架构(2)> 关于 在<用 Puppet 搭建易管理的服务器基础架构(2)>中,我们在 Puppet master上编写了第一个非常简单的清单,来对puppetcl

转:浅谈图片服务器的架构演进

现在几乎任何一个网站.Web App以及移动APP等应用都需要有图片展示的功能,对于图片功能从下至上都是很重要的.必须要具有前瞻性的规划好图片服务器,图片的上传和下载速度至关重要,当然这并不是说一上来就搞很NB的架构,至少具备一定扩展性和稳定性.虽然各种架构设计都有,在这里我只是谈谈我的一些个人想法. 对于图片服务器来说IO无疑是消耗资源最为严重的,对于web应用来说需要将图片服务器做一定的分离,否则很可能因为图片服务器的IO负载导致应用 崩溃.因此尤其对于大型网站和应用来说,非常有必要将图片服

阿里云服务器部署架构

最近要上马一个项目,客户要求全部部署到阿里云的服务器,做了一个阿里云的部署方案. 上图: 跟传统的部署相比,用云盾替代了传统的防火墙,负载均衡设备也不用自己买了,购买一个LBS负载均衡服务可以添加10个负载均衡实例,内网免费.因为项目的出口带宽可以统一,所以干脆使用负载均衡的流量费替代了带宽费用.(即在购买ECS的时候可以带宽可以为0或者1Mps,使用LBS负责输出流量. 有点麻烦的是,如果数据库使用的是oracle的话,好像RAC不好安装,因为没共享存储.(阿里也在推它自己的RDS关系型数据库

高性能缓存服务器Varnish架构配置

Varnish跟Squid都是一款内容加速缓存服务器,我们可以使用它们来对我们的网页内容进行缓存,以此来从某个方面提高用户体验度,提升网站整体的抗压能力. 目前自建的CDN中,有很多都是基于Squid.Varnish等相关缓存软件,经过内部的二次开发实现了更好的内容加速及管理. 那今天我们一起来学习一下Varnish简单的搭建及日常的维护,深入的东西后期分享,跟大家一起来交流.这里直接上Shell脚本自动初始化并安装: #!/bin/sh #auto install varnish #2014-

MySql服务器逻辑架构

一.MySql服务器逻辑架构图 每个虚线框都是一层: 第一层:最上层的服务器不是MySql所独有的,大多数基于网络的客户端/服务器工具或者服务都有类似的系统.比如链接处理,授权认证,安全等等. 第二层:大多数的MySql的核心服务功能都在这一层,包括查询解析.分析.优化.缓存以及所有的内置函数(例如:日期,时间,数学和加密函数等).所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图. 第三层:包含了存储引擎.存储引擎负责MySql中的数据存储和提取.服务器通过API和存储引擎进行通信,这

分析h5牛牛制作服务器的架构(总体设计篇)

h5牛牛制作服务器的架构交流论坛:aqiulian.com,更多服务器的架构咨询Q:212303635.首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构.网狐棋牌最令人印象深刻的是其稳定性和高网络负载.它的一份压力测试报告上指出:一台双核r的INTEL Xeon 2.8CPU加上2G内存和使用共享100M光纤的机子能够支持5000人同时在线游戏. 在研究其服务器框架后发现,它的网络部分确实是比较优化的.它主要采用了Windows提供的IO完成端口来实现其网络组件.本服务器虽然参考了