采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
幂等和消息消费失败后重新回到队列,这两个目标是不是矛盾?因为消息重新回到队列再次被消费者消费时,消费者怎么知道这条消息是失败重试还是生产者因为网络抖动等问题重复发的消息?
不矛盾。消息的幂等性其实就是说同一消息,消费者消费了一次或消费多次,结果是一致的,不会因为消费次数的多少,而产生不同的结果。说白了就是,不管这个消息消费了多少次,所产生的结果就跟这个消息只被消费了1次所产生的结果相同。
我疑问的是这么一种情况: 消息消费失败重试回到队列,消费者再次拿到消息会误以为是重复消息,为了保证幂等性就直接ACK掉了。可是这条消息理应再次消费。
为什么会有"消费者再次拿到消息会误以为是重复消息"这种情况??消费消息的时候,一般都是用的手动ACK,也就是说成功消费了消息,才返回ack,如果消费失败,返回nack,此条消息返回到队列中进行有限次数重试。
因为幂等性是通过一个全局唯一ID来判断,收到消息时会先根据这个id查询数据库,查不到则代表不是重复消息,插入数据库;查到则代表有重复消息,直接ACK掉。消息消费失败重新入队列,这个id是不会变的,所以下一次消费者消费这条消息时,这个id已经存在数据库中,误以为是重复消息。
登录后可查看更多问答,登录/注册
消息驱动架构+订单状态机,二次开发,手写分布式事务框架。
1.0k 11
1.0k 8
900 7
3.4k 7
888 6