【自问自答】IM 消息失败重试应该怎么实现?

在实现 web im 消息功能中,如果消息发送失败,当重发的时候会不会出现接收方多次收到消息?

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。


回答:

这里可以增加一个 clientSendMsgId 字段,由发送方生成,服务端校验,30分钟内只重复一次的 uuid

带入真实场景

  1. 失败重发场景

    1. 用户发送消息 clientSendMsgId: 1,设置为 pending 状态
    2. 当有结果时变为 resolved 或者 rejected。
    3. 如果是失败,点击重发,继续发送 clientSendMsgId: 1
    4. 服务端每次收到消息都判断 clientSendMsgId 是否重复
  2. 客户端超时,服务端多收场景

    1. 用户发送消息 clientSendMsgId: 1,设置为 pending 状态
    2. 当结果是 rejected (timeout),用户多次重试
    3. 服务端多次收到 clientSendMsgId: 1。只有首次有效,后面的被遗弃。

通过一个发送方的校验去重字段即可实现唯一消息的功能。

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

以上是 【自问自答】IM 消息失败重试应该怎么实现? 的全部内容, 来源链接: utcz.com/p/933851.html

回到顶部