【消息未收到 ack 的情况】
-
发送一条消息后,将消息体存入到 redis 中,并将消息的【uniqueId 和 重发次数】放入 RabbitMQ 消息队列中。
-
延迟队列中的 【uniqueId 和 重发次数】在规定客户端ack时间内, 会被放入到死信队列,用于检查是否 收到ack消息。
-
死信队列收到 【uniqueId 和 重发次数】
-
- 到 redis 中检查这条消息体是否还存在,存在则说明还没有收到ack
- 再检查 重发次数,如果重发次数已达上限,报异常【重试发送多次消息失败】
- 如果还没到重发次数上限,就进入消息重发。
【消息收到 ack 后的处理】
(私信)
- 删除 redis 中的等待ack 的消息体,这样死信队列在检查的时候没有查到这条消息体,说明消息已经ack
- 修改消息状态 为【已送达】。
(群聊)
- 修改用户的 last_ack_id
- 删除消息体缓存