消息传递过程中,如果传递失败,发送会进行重试,重试可能产生重复消息信息。对于系统来说,如果不对重复消费进行处理,就会出现系统数据错误。例如,在一个订单系统中,订单创建成功后,将数据写入统计数据库。如果出现重复统计,数据库数据就会出错。解决消息的重复消费,其实就是为了保证消息消费的幂等性。幂等性的定义:多次执行与一次执行的影响相同。所以需要从业务逻辑上去设计,把消费的业务逻辑设计成幂等的。使用数据库的唯一约束消费消息时,需要取一个唯一标识,比如id作为唯一约束字段,先添加数据。如果添加失败,后面会提示错误信息,或者不进行后续操作。Redis设置了一个全局唯一的id。生产者每次发送消息前,设置一个全局唯一的id放在消息权重中存入redis。先在consumer接口上的redis中查看是否有globalid。如果存在则调用消费者接口并删除全局id,如果不存在则不进行后续操作。多版本(乐观锁)机制为业务数据添加版本号。每次更新数据前,比如当前版本与消息中的版本是否一致,一致则更新数据,版本号+1。如果不一致,则不会更新。这有点类似于乐观锁机制。综上所述,幂等性的设计需要根据具体的业务场景。如果是并发量比较大的系统,数据库一般无法支持这么大的并发量,需要使用Redis缓存处理。对于并发度低的系统,可以选择数据库。如果您觉得文章对您有帮助,请点个赞吧!
