发送失败,到客户端的ack丢失,如何做到不重复?

消息去重:

在消息发送端和消息接收端都维护一个消息ID的记录,每条消息都附带一个全局唯一的消息ID。当消息发送端收到消息确认时,将对应的消息ID标记为已确认。在消息接收端,收到消息后首先检查该消息ID是否已经处理过,如果已经处理过则丢弃,避免重复处理。

幂等性设计:

在消息接收端的业务逻辑中,设计幂等性操作,即多次执行相同操作产生的结果与执行一次相同操作的结果相同。这样,即使同一条消息被重复消费,也不会对系统状态造成影响。例如,在数据库操作中使用唯一键或乐观锁来确保同一数据只会被处理一次。

消息超时机制:

在发送端设置一个合理的消息超时时间。如果发送端在一定时间内没有收到消息确认,可以将消息重新发送。在接收端,对于重复消息的处理可以通过消息ID进行判断,如果接收到的消息ID已经处理过,则忽略该消息。

消息状态管理:

在消息发送端和接收端都维护一个消息状态的记录,例如使用数据库或缓存存储消息的状态。当消息发送失败,可以将消息状态标记为待发送,等待重试。当消息接收端收到重复消息时,可以通过消息状态进行判断,避免重复处理。