架构师面试(十一):消息收发
问题
IM 是互联网中非常典型的独立的系统,麻雀虽小但五脏俱全,非常值得深入研究和探讨,继上次IM相关题目之后,我们继续讨论IM相关话题。 关于IM系统【消息收发模型】的相关描述,下面说法错误的有哪几项?
A. 通常可以将消息收发流程划分为三个阶段:生产消息阶段、推送消息阶段、消息确认阶段;
B. 消息发送方发送消息到服务端后,服务端必须先回复然后再落库,以保证消息生产的及时性和可靠性;
C. 在服务端推送消息阶段,服务端首先需要通过路由数据确认消息接收方的在线状态和连接地址,然后再推送消息;
D. 消息确认阶段,即服务端等待确认消息是否被客户端接收;若服务端等待超时,需要主动回调客户端接口完成确认,类似于 RocketMQ 的事务消息处理模型。
解析
A 选项:客户端X发消息给客户端Y,通常会经过三个阶段:生产消息阶段(客户端X发送消息到服务端,服务端经过一系列逻辑处理后发送回复包到客户端X),推送消息阶段(服务端经过一系列逻辑处理后推送消息到客户端Y),消息确认阶段(服务端等待客户端Y发送ACK数据包并进行逻辑处理)。
B 选项:消息发送方发送消息到服务端后,服务端正确的处理方式是 先落库再回复,保证消息的可靠性;否则容易出现消息没来得及落库导致消息丢失的问题。
C 选项:在服务端推送消息阶段,服务端首先需要访问中央存储(缓存)判断消息接收方是否在线,如果在线则获取其连接的fd,然后基于fd推送消息。
D选项:在线消息确认阶段,如果服务端等待客户端发送 ack 包超时时,直接重新推送消息 或 按离线处理即可,回调客户端接口流程繁琐且工作量很大,实不必要。
正确答案
BD