专栏首页凯哥JavaRabbitMQ消息中间件技术精讲10 高级篇三 幂等性保障不重复消费
原创

RabbitMQ消息中间件技术精讲10 高级篇三 幂等性保障不重复消费

利用幂等性保障消息不被重复消费

本文主要内容:

一:幂等性概念

什么是幂等性?

在网络超时等问题除外下,要求一次或多次请求同一个资源,对资源本身产生的影响和第一次执行的影响相同。

关于幂等性更详细的介绍,可以参见《拓展知识一:幂等性》这篇文章。

幂等性我们可以借鉴数据库的乐观锁机制来理解:

比如,我们执行一条更新库存的sql语句:

update table set count = count -1 where id = 1

流程说明:

    在高并发的情况下,比如秒杀系统,现在商品就剩下一个了。如果我们执行:update table set count = count -1 where id = 1这个sql语句的时候,高并发情况会导致库存成为负数,这种操作是有问题的。所以我们可以就是用乐观锁:

添加版本字段,通过版本号字段来处理。

在查询的时候,假设查询的版本号是1,在更新的时候拿着版本号作为更新条件即where version=1来更新。高并发时候,第一个执行完成后,version+1了。当第二条更新时候,发现已经不是1了就更新不了。关于mysql数据库乐观锁和悲观锁的详细介绍,可以参见《拓展知识二:mysql数据库中乐观锁和悲观锁》

二:消费端如何保障幂等性消费

问题:

    在海量订单产生的业务高峰期,如何避免消息被重复的消费呢?

答案:在消费端实现幂等性即可。

消息端实现幂等性,就意味着,我们的消息永远不会消费多次,即使我们发送多条一样的消息

三:业界主流的幂等性操作

唯一ID+指纹码机制

名称解释:

唯一ID:如数据库的主键id

指纹码:业务规则标识唯一的。如时间戳+银行返回的唯一码。需要注意的是,这个指纹码不一定就是我们系统生产的,可能是我们自己业务规则或者是外部返回的一些规则经过拼接后的东西。其目的:就是为了保障此次操作达到绝对唯一的。

唯一ID+指纹码机制,利用数据库主键去重。如:

    Select count(id) from table where id = 唯一ID+指纹码

好处:实现简单

坏处:高并发下有数据库希尔的性能瓶颈

解决方案:对唯一ID进行分库分表进行算法路由

利用redis原子特性实现

使用redis进行幂等需要考虑的问题

第一:我们是否需要进行数据入?如果需要入库的话,关键解决的问题是数据库和缓存如何做到原子性?

第二:如果步进行入库?那么都存储在缓存中,如何设置定时同步的策略?

这两个问题欢迎大家发表自己的见解。

在下节中,我们将学习Confirm消息确认机制。

本文来源:http://kaigejava.com/article/detail/514

凯哥个人博客:www.kaigejava.com

凯哥公众号:凯哥Java(kaigejava)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • rabbitMQ高级整合应用第三篇 SimpleMessageListenerContainer

    ​rabbitMQ精讲系列第二十一篇 高级整合应用第三篇 SimpleMessageListenerContainer

    凯哥Java
  • 安装vsftp服务器的时候遇到的问题

    在centos7中安装VSFTP的时候,使用命令行,ftp 然后输入用户名和密码,登陆之后,put文件就可以上次到ftp上面。如下图:

    凯哥Java
  • 使用mysql触发器新增或修改一个表后,触发到另一个表

    在工作中,有时候,我们需要备份一个表。或者是在向一张表中添加一条数据后,另一张同结构的表也要添加用于备份。如下:

    凯哥Java
  • MySQL 自增ID的几个小问题

    例如当前表中有ID为1,2,3三条记录,把3删除,重启MySQL,新插入记录的ID从哪儿开始?

    dys
  • 分表与分库使用场景以及设计方式

    场景:对于大型的互联网应用来说,数据库单表的记录行数可能达到千万级甚至是亿级,并且数据库面临着极高的并发访问。采用Master-Slave复制模式的...

    三哥
  • 「脑图」各种设备的ID体系架构

    很多的数据业务都需要一个稳定的ID作为设备唯一的标识符,如广告追踪、归因、用户画像、数据统计等。随着对用户隐私的越来越关注,有些ID被放弃,有些新的ID取而代之...

    GA小站
  • Python解决大规模二进制数据错位问题描述解决方法实验代码最终代码

    问题描述 有一些二进制数据,每八位按顺序存为一个十进制数保存成CSV文件,每行为一个二进数数据,每个单元格均为一个十进制数。若数据为0000 0001 1000...

    月见樽
  • 分表与分库使用场景以及设计方式

    场景:对于大型的互联网应用来说,数据库单表的记录行数可能达到千万级甚至是亿级,并且数据库面临着极高的并发访问。采用Master-Slave复制模式的...

    三哥
  • ID生成策略——SnowFlake

    某个项目采用了数据库(MySQL)自增ID作为主要业务数据的主键。数据库自增ID使用简单,自动编号,速度快,而且是增量增长,按顺序存放,对于检索非常有利。

    普通程序员
  • 三分钟学习分布式ID方案

    在分布式系统中,当数据库数据量达到一定量级的时候,需要进行数据拆分、分库分表操作,传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求,它只能保...

    JavaQ

扫码关注云+社区

领取腾讯云代金券