消息不丢失
可靠的消息队列:选用具备持久化机制的消息队列,如RabbitMQ、Kafka等。它们可将消息持久化到磁盘,即使服务器重启或崩溃,消息也不会丢失。
确认机制:生产者发送消息后,需等待消息队列的确认回执,以确保消息已被成功接收。消费者处理完消息后,也应向消息队列发送确认信息,表明消息已被正确处理,否则消息队列会认为消息处理失败并重新投递。
事务机制:在消息生产和消费过程中,使用事务来保证操作的原子性。例如在将消息写入数据库和发送消息到队列这两个操作中,可将它们放在一个事务中,确保要么都成功,要么都失败。
消息不重复消费
幂等性设计:使消费端的业务逻辑具备幂等性,即多次执行相同操作的结果与执行一次相同。如数据库插入操作,可通过唯一索引防止重复插入;更新操作可根据版本号等进行判断,避免多次更新导致数据错误。
消息去重:在消费端对消息进行去重处理。可利用缓存(如Redis)记录已消费的消息ID,当新消息到来时,先检查缓存中是否已存在该消息ID,若存在则丢弃,以避免重复消费。
分布式锁:在分布式环境下,可使用分布式锁来确保同一时刻只有一个消费者处理特定消息。如使用Redis的分布式锁,在消费消息前获取锁,处理完后释放锁,其他消费者在锁被占用时无法处理该消息,从而避免重复消费。