保证消息可靠性传输以及幂等性

时间:2019-12-20 12:36:07   收藏:0   阅读:144

消息如何保证可靠性传输

可能出现消息丢失的情况

一般通过生产端保证可靠性投递

解决方案

消息落库,对消息状态进行变更,对于高并发环境下数据库压力很大,因为需要写多次数据库

技术分享图片
整体流程:

消息的延迟投递,做二次确认,回调检查。适合高并发环境,减少写库的次数

技术分享图片
整体流程:

相比第一种方案,这里减少了一次message入库,confirm机制是消息可靠性投递的一个核心,在下篇文章会讲到

如何保证消息的幂等性

首先,无论是RabbitMQ、RocketMQ还是kafka,都有可能出现消息的重复发送,这个是MQ无法保障的,而幂等性是开发或者运维人员需要保证的
所谓消息的幂等性是指即使收到多次消息,也不会重复消费,这点很重要,例如用户付钱,点的太快了,付了多次,但是你也只能扣一次钱

RabbitMQ可能导致出现非幂等性的情况

kafka可能出现非幂等性的情况

技术分享图片

在Consumer端offset没有提交的时候,Consumer重启了,这时候就会出现重复消费的情况

解决方案

唯一ID+指纹码

整体实现相对简单,需要进行数据库写入,利用数据库主键去重,使用ID进行分库分表算法路由,从单库的幂等性到多库的幂等性

利用Redis的原子性实现

Redis的实现性能比较好,而且Redis一般使用集群,不用担心某台机器挂掉了,影响服务。
存在的问题:是否要进行数据落库,如果落库的话,怎么保证缓存和storage的一致性、事务,如果不落库,如何设置定时同步

原文:https://www.cnblogs.com/scholar-hwg/p/12071833.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!