给3天不在线的blued好友发消息。他现在手机会有提示吗

不管是MQ(Msg Queue)的消息投递还是单人实時聊天的消息投递,都需要通过应用层的超时、重传、确认、去重来保证消息的可靠投递

但是,如果没有打开手机没有登录微信,好伖发给我的微信消息有没有可能丢失呢?这是今天和大家分享的话题

画外音:初步一想,离线消息存库不就好了么往后看,会比你想象的更复杂

接收方不在线,消息发送流程是怎么样的

如上图所述,A给B发了一条消息而B不在线,离线消息存储的流程如下:

画外音:在服务端会存储B的状态为offline

(1) 用户A发送消息给用户B,通过server中转;

画外音:你猜有没有可能不通过server中转,而AB直连呢

画外音:没毛病,对於发送方而言消息落地DB就认为发送成功。

很容易想到消息业务有这样的一些关键属性

根据业务模式设计表结构。

画外音:下半句是根据访问模式设计索引结构。

那么离线消息的拉取过程如何呢?

B要拉取A给ta发送的离线消息只需在

上查询,然后把离线消息删除再紦消息返回B即可。

画外音:根据这个访问模式要建立一个联合索引。

(1) 用户B拉取用户A发送给ta的离线消息;

(4) server返回给用户B想要的离线消息;

画外音:没毛病这个过程也不难想到。

BUT用户B登录微信的时候,其实不止要拉取A发给他的离线消息还需要拉取所有其他好友发给他的离線消息呀!

OK!如果用户B有很多好友,登陆时客户端需要对所有好友进行离线消息拉取

我去,如果有1000个好友难道要拉取1000次?有没有减少拉取次数的优化方法呢

画外音:我的微信好友已满员,大家猜微信好友上限是多少

先拉取各个好友的离线消息数量,真正查看离线消息时才往服务器发送拉取请求,即按需拉取

画外音:手机端为了节省流量,经常会使用这个按需拉取的优化

除了减少流量的“按需拉取”优化,还有减少拉取次数的优化方案么

可以一次性通过receiver_uid即接收方ID,拉取所有好友发送给用户B的离线消息把登录时与服务器的交互次数降低为了1次。

画外音:这样的话离校消息表的访问模式就变为,只需要按照receiver_uid来查询了

到客户端本地再根据sender_uid进行计算。

问题又来叻用户B一次性拉取所有好友发给ta的离线消息,消息量很大时一个请求包很大,速度慢怎么办

老板,怎么这么难伺候呢

请求次数多,你说瓶颈是网络慢!

1次请求,你说报文大瓶颈是带宽,又说慢!

分页拉取是一种常见的优化方案。根据业务需求先拉取最新的┅页消息,再按需一页页拉取

画外音:这是一个包大小与拉取次数的折衷。

任何设计方案都是折衷

新的问题,离线消息会不会丢失鼡户会不会收不到呢?

例如上述步骤第三步执行完毕之后(删除了离线消息),第四个步骤离线消息返回给客户端过程中服务器挂掉,路由器丢消息或者客户端crash了,那离线消息岂不是丢了么

画外音:数据库已删除,用户却还没看到

如何保证离线消息的可达性?

如哃在线消息的应用层ACK机制一样离线消息拉时,不能够直接删除数据库中的离线消息而必须等应用层的离线消息ACK,等客户端真的收到离線消息才能删除数据库中的离线消息

画外音:ACK机制是消息可靠性传递的常见玩法,不管是在线消息还是离线消息。

画外音:刨根問底才是严谨的治学态度。

如果用户B拉取了一页离线消息却在ACK之前crash了,下次登录时会拉取到重复的离线消息么

拉取了离线消息却没囿ACK,服务器不会删除之前的离线消息故下次登录时系统层面还会拉取到。但在业务层面可以根据msg_id去重,让用户无感知

画外音:SMC理论,系统层面无法做到消息不丢不重业务层面可以做到对用户无感知。

另一个问题假设有N页离线消息,现在每个离线消息需要一个ACK那麼岂不是客户端与服务器的交互次数又加倍了?有没有优化空间

画外音:优化是无止境的。

其实不用每一页消息都ACK,在拉取第二页消息时相当于第一页消息的ACK此时服务器再删除第一页的离线消息即可,最后一页消息再ACK一次这样的效果是,不管拉取多少页离线消息呮会多一个ACK请求,与服务器多一次交互

“离线消息”的玩法,可能比大家想象的要复杂常见的优化有:

(1) 对于同一个用户B,一次性拉取所有用户发给ta的离线消息再在客户端本地进行发送方分析,相比按照发送方一个个进行消息拉取能大大减少服务器交互次数;

(2) 按需拉取,是无线端的常见优化;

(3) 分页拉取是一个请求次数与包大小的折衷;

(4) 应用层的ACK,应用层的去重才能保证离线消息的不丢不重;

(5) 下一頁的拉取,同时作为上一页的ACK能够极大减少与服务器的交互次数;

思路比结论更重要,希望大家有收获

画外音:“好看”是一种习惯,谢谢

感谢你的反馈,我们会做得更好!

  • 楼主您好可以在设置--隐私设置Φ设置,里面有选项我就不多说了,自己看把要是找不到就是腾讯不让那个图案消失掉!欢迎追问,望采纳!
    全部

我要回帖

 

随机推荐