如何打造安全可靠安全的即时通讯讯服务

IM消息送达保证机制实现(二):保证离线消息的可靠投递
本文的上篇《》中,我们讨论了在线实时消息的投递可以通过应用层的确认、发送方的超时重传、接收方的去重等手段来保证业务层面消息的不丢不重。
但实时在线投递针对的是消息收发双方都在线的情况(如当发送方用户A发送消息给接收方用户B时,用户B是在线的),那如果消息的接收方用户B不在线,系统是如何保证消息的可达性的呢?这就是本文要讨论的问题。(本文同步发布于:)
2、学习交流&
- 即时通讯开发交流群:&&[推荐]
- 移动端IM开发入门文章:《》
3、IM消息送达保证系列文章
本文是讨论IM消息送达保证系列文章中的第2篇,总目录如下:
《》(本文)
另外,如果您正在查阅移动端IM开发资料,推荐阅读《》。
4、消息接收方不在线时的典型消息发送流程
如上图所述,通常此类情况下消息的发送流程如下:
Step 1:用户A发送一条消息给用户B;
Step 2:服务器查看用户B的状态,发现B的状态为“offline”(即B当前不在线);
Step 3:服务器将此条消息以离线消息的形式持久化存储到DB中(当然,具体的持久化方案可由您IM的具体技术实现为准);
Step 4:服务器返回用户A“发送成功”ACK确认包(注:对于消息发送方而言,消息一旦落地存储至DB就认为是发送成功了)。
关于 “Step 4” 的补充说明:
请一定要理解“Step 4”,因为现在无论是传统的PC端IM(类似QQ这样的——可以在UI上看到好友的在线、离线状态)还是目前主流的移动端IM(强调的是用户全时在线——即你看不到好友到底在线还是离线,反正给你的假像就是这个好友“应该”是在线的),消息发送出去后,无论是对方实时在线收到还是对方不在线而被服务端离线存储了,对于发送方而言只要消息没有因为网络等原因莫名消失,就应该认为是“被收到了”。
从技术的角度讲,消息接收方收到的消息应答ACK包的真正发起者,实际上有两种可能性:一种是由接收方发出、而另一种是由服务端代为发送(这在里被称作“伪应答”)。
5、典型离线消息表的设计以及拉取离线消息的过程
① 存储离线消看书的表主要字段大致如下:
-- 消息接收者ID receiver_uid varchar(50), -- 消息的唯一指纹码(即消息ID),用于去重等场景,单机情况下此id可能是个自增值、分布式场景下可能是类似于UUID这样的东西 msg_id varchar(70), -- 消息发出时的时间戳(如果是个跨国IM,则此时间戳可能是GMT-0标准时间)&&&&&& send_time time, -- 消息发送者ID sender_uid varchar(50), -- 消息类型(标识此条消息是:文本、图片还是语音留言等) msg_type int, -- 消息内容(如果是图片或语音留言等类型,由此字段存放的可能是对应文件的存储地址或CDN的访问URL) msg_content varchar(1024),
② 离线消息拉取模式: 接收方B要拉取发送方A给ta发送的离线消息,只需在receiver_uid(即接收方B的用户ID), sender_uid(即发送方A的用户ID)上查询,然后把离线消息删除,再把消息返回B即可。
③ 离线消息的拉取,如果用SQL语句来描述的话,它可以是:
SELECT&msg_id, send_time, msg_type, msg_content FROM&offline_msgs WHERE&receiver_uid = ? and&sender_uid = ?
④ 离线拉取的整体流程如下图所示:
Stelp 1:用户B开始拉取用户A发送给ta的离线消息;
Stelp 2:服务器从DB(或对应的持久化容器)中拉取离线消息;
Stelp 3:服务器从DB(或对应的持久化容器)中把离线消息删除;
Stelp 4:服务器返回给用户B想要的离线消息。
6、上述流程存在的问题以及优化方案
如果用户B有很多好友,登陆时客户端需要对所有好友进行离线消息拉取,客户端与服务器交互次数就会比较多。
① 拉取好友离线消息的客户端伪代码:
// 登陆时所有好友都要拉取 for(all uid in B’s friend-list){
&&&&&// 与服务器交互 &&&&&get_offline_msg(B,uid);&&
② 优化方案1: 先拉取各个好友的离线消息数量,真正用户B进去看离线消息时,才往服务器发送拉取请求(手机端为了节省流量,经常会使用这个按需拉取的优化)。
③ 优化方案2: 如下图所示,一次性拉取所有好友发送给用户B的离线消息,到客户端本地再根据sender_uid进行计算,这样的话,离校消息表的访问模式就变为-&只需要按照receiver_uid来查询了。登录时与服务器的交互次数降低为了1次。
④ 方案小结: 通常情况下,主流的的移动端IM(比如微信、手Q等)通常都是以“优化方案2”为主,因为移动网络的不可靠性加上电量、流量等资源的昂贵性,能尽量一次性干完的事,就尽可能一次搞定,从而提供整个APP的用户体验(对于移动端应用而言,省电、省流量同样是用户体验的一部分)。这方面的文章,可以进一步参阅《》、《》、《》。
7、消息接收方一次拉取大量离线消息导致速度慢、卡顿的解决方法
用户B一次性拉取所有好友发给ta的离线消息,消息量很大时,一个请求包很大、速度慢,容易卡顿怎么办?
正如上图所示,我们可以分页拉取:根据业务需求,先拉取最新(或者最旧)的一页消息,再按需一页页拉取,这样便能很好地解决用户体验问题。
8、优化离线消息的拉取过程,保证离线消息不会丢失
如何保证可达性,上述步骤第三步执行完毕之后,第四个步骤离线消息返回给客户端过程中,服务器挂点,路由器丢消息,或者客户端crash了,那离线消息岂不是丢了么(数据库已删除,用户还没收到)?
确实,如果按照上述的1、2、3、4步流程,的确是的,那如何保证离线消息的绝对可靠性、可达性?
如同在线消息的应用层ACK机制一样,离线消息拉时,不能够直接删除数据库中的离线消息,而必须等应用层的离线消息ACK(说明用户B真的收到离线消息了),才能删除数据库中的离线消息。这个应用层的ACK可以通过实时消息通道告之服务端,也可以通过服务端提供的REST接口,以更通用、简单的方式通知服务端。
9、进一步优化,解决重复拉取离线消息的问题
如果用户B拉取了一页离线消息,却在ACK之前crash了,下次登录时会拉取到重复的离线消息么?
确实,拉取了离线消息却没有ACK,服务器不会删除之前的离线消息,故下次登录时系统层面还会拉取到。但在业务层面,可以根据msg_id去重。SMC理论:系统层面无法做到消息不丢不重,业务层面可以做到,对用户无感知。
优化后的拉取过程,如下图所示: &
10、进一步优化,降低离线拉取ACK带来的额外与服务器的交互次数
假设有N页离线消息,现在每个离线消息需要一个ACK,那么岂不是客户端与服务器的交互次数又加倍了?有没有优化空间?
如上图所示,不用每一页消息都ACK,在拉取第二页消息时相当于第一页消息的ACK,此时服务器再删除第一页的离线消息即可,最后一页消息再ACK一次(实际上:最后一页拉取的肯定是空返回,这样可以极大地简化这个分页过程,否则客户端得知道当前离线消息的总页数,而由于消息读取延迟的存在,这个总页数理论上并非绝对不变,从而加大了数据读取不一致的可能性)。这样的效果是,不管拉取多少页离线消息,只会多一个ACK请求,与服务器多一次交互。
11、本文小结
正如本文中所列举的问题所描述的那样,保证“离线消息”的可达性比大家想象的要复杂一些,常见优化总结如下:
1)对于同一个用户B,一次性拉取所有用户发给ta的离线消息,再在客户端本地进行发送方分析,相比按照发送方一个个进行消息拉取,能大大减少服务器交互次数;
2)分页拉取,先拉取计数再按需拉取,是无线端的常见优化;
3)应用层的ACK,应用层的去重,才能保证离线消息的不丢不重;
4)下一页的拉取,同时作为上一页的ACK,能够极大减少与服务器的交互次数。
(本文同步发布于:,本文内容参考了:)
12、IM技术资料分类
[1] 网络编程基础资料: 《&-&》 《&-&》 《&-&》 《&-&》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 &&&
[2] 有关IM/推送的通信格式、协议的选择: 《》 《》 《》 《》 《》 《》 《》 《》 &&&
[3] 有关IM/推送的心跳保活处理: 《》 《》 《》 《》 《》 《》 《》 &&&
[4] 有关WEB端即时通讯开发: 《》 《》 《》 《》 《》 《》 &&&
[5] 有关IM架构设计: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 &&&
[6] 有关IM安全的文章: 《》 《》 《》 《》 《》 《》 《》 《》 &&&
[7] 有关实时音视频开发: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 &&&
[8] IM开发综合文章: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 &&&&
[9] 开源移动端IM技术框架资料: 《》 《》 《》 &&&
[10] 有关推送技术的文章: 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 《》 &&&
[11] 更多即时通讯技术好文分类:
作者:&(点击作者姓名进入Github)& 出处:& 交流:欢迎加入即时通讯开发交流群&& 讨论:& Jack Jiang同时是和的作者,可前往下载交流。im - 文章 - SegmentFault社会化媒体
了解更多>>
桂ICP备 号
桂公网安备 36号
阅读下一篇
Hi,在你登录以后,就可以永久免费的收藏任何您感兴趣的内容,关注感兴趣的作者!
请输入正确的邮箱
已有帐号请点击
帐号创建成功!
我们刚刚给你发送了一封验证邮件
请在48小时内查收邮件,并按照提示验证邮箱
感谢你对微口网的信任与支持
如果你没有收到邮件,请留意垃圾箱 或 重新发送
你输入的邮箱还未注册
还没有帐号请点击
你输入的邮箱还未注册
又想起来了?
邮件发送成功!
我们刚刚给你发送了一封邮件
请在5分钟内查收邮件,并按照提示重置密码
感谢你对微口网的信任与支持
如果你没有收到邮件,请留意垃圾箱 或 重新发送
对不起,你的帐号尚未验证
如果你没有收到邮件,请留意垃圾箱 或
意见与建议
请留下您的联系方式
* 留下您正确的联系方式,以便工作人员尽快与你取得联系用过此服务?体验如何呢?给个点评吧~
对程序运行影响小
安全性一般
对程序运行影响大
发送私信成功
满足所有需求,助您轻松工作
关注(0) 已关注
野狗怎么样呢?
暂时没有综合点评哦~&
所属公司:
如何收费:按需收费
支持平台:Android、iOS、Web
集成难度:暂无
安全性:暂无
集成时间:暂无
野狗是安全可靠的实时通信云。野狗为企业和开发者提供了可编程的实时数据、语音、视频通信能力,以及身份认证服务,可以安全地构建丰富场景化的实时通信业务。
暂时没有关于该工具|服务的任何下载,上传相关资源可获活力值奖励~&
野狗服务在DevStore的数据统计
相关市场数据统计
大家都在问
暂时没有此工具|服务的相关问答&
竞品推荐 (相关工具|服务)
暂时没有此工具|服务的相关资讯&
开发者交流群:
DevStore技术交流群2:
运营交流群:
产品交流群:
深圳尺子科技有限公司
深圳市南山区蛇口网谷万海大厦C栋504
Copyright (C) 2015 DevStore. All Rights Reserved
申请为官方人员
DevStore用户登录
还没有DevStore帐号?
快捷登录:私有服务器 打造企业IM平台安全锁_凤凰资讯
私有服务器 打造企业IM平台安全锁
用微信扫描二维码分享至好友和朋友圈
IM全称Instant Messaging,是一种可以让使用者在网络上建立某种私人聊天室的即时通讯服务。目前公众在日常生活中所使用的即时通讯软件有QQ、微信、阿里旺旺、YY等数十种,它们的存在满足了人们在日常的生产生活过程中对通讯的需求。纵观IM软件近30年的发展历史,从熟人交际到陌生人的沟通,在可预见的将来,IM软件将延续着私密沟通和安全社交边际的轨迹不断发展。
原标题:私有服务器 打造企业IM平台安全锁IM全称Instant Messaging,是一种可以让使用者在网络上建立某种私人聊天室的即时通讯服务。目前公众在日常生活中所使用的即时通讯软件有、微信、阿里旺旺、YY等数十种,它们的存在满足了人们在日常的生产生活过程中对通讯的需求。纵观IM软件近30年的发展历史,从熟人交际到陌生人的沟通,在可预见的将来,IM软件将延续着私密沟通和安全社交边际的轨迹不断发展。随着互联网的飞速发展,网络安全问题日益凸显, 2016年初,上市公司深圳能源因高管的IM软件被盗,致使财务人员误将3505万元现金汇入不法分子的银行户头,幸亏报警及时,经过警方的努力犯罪嫌疑人已被抓获,为广大股东挽回了损失。诸如此类的报道不胜枚举,而来自企业内部的威胁更让人感到恐慌。古语有云“日防夜防,家贼难防”,据调查显示,随着信息技术的发展,企业的各种生产经营资料和数据90%以上都是通过IM软件的形式进行传输,来自艾瑞咨询的数据显示,企业85%的数据资料安全威胁来自于企业内部,企业员工有意或无意泄密、离职雇员盗取有价值的信息及第三方合作人员进行数据窃取等活动,更让企业的通讯数据安全雪上加霜。从企业的角度来看,采用IM软件有利于提高企业的运转效率,但通过个人IM软件在进行企业内部机密信息交流的时候,通讯的安全性是无法保证的。从另一个层面来看,随着企业的的信息化程度不断提高,各类信息平台(如财务系统,人事系统)将会逐渐丰富起来,由此导致使用者和管理者需要记忆不同的地址和帐号,从而致使了工作效率的下降。如今,在大数据和云端数据发展的今天,将企业IM软件架设在私有服务器之上,已是越来越多大企业的明智之选。一台高性能稳定的私有服务器会给企业内部管理带来很多便利,网络上80%的数据信息都经过服务器存储、处理,因此服务器也被称为网络的灵魂。对于企业来说,私有服务器能够保证企业内部信息管理的安全性以及其他个性化需求。目前世界先进的服务商均已涉足企业IM软件的业务,中国终端安全管理市场领导者北信源公司开发的信源豆豆凭借三端加密、四维防护的安全措施,实现了从服务器、通讯链路至客户端的全程加密,让通讯数据安全做到“零”风险。随着互联网技术不断更新发展,通讯信息安全越来越受到企业和个人的重视,相信越来越多的企业会将自己的通讯系统架设在企业的私有服务器上,以保障企业的通讯数据安全。
用微信扫描二维码分享至好友和朋友圈
凤凰资讯官方微信
播放数:1482
播放数:6850
播放数:7065
播放数:5808920
48小时点击排行

我要回帖

更多关于 安全的即时通讯软件 的文章

 

随机推荐