有个哥们去年参加阿里面试的时候,就被问到了幂等性的问题。

幂等性是分布式系统设计中的一个重要概念,是在做系统或者接口设计时要着重考虑的问题,尤其像支付宝、银行、互联网金融等涉及钱的系统,既要高效,数据也要准确,绝对不能出现多扣款,多打款等问题,幂等性的设计就显得更为重要了。

本文我们就先来解释一下什么是幂等性?然后再看一下在MQ中怎么保证幂等性?01PART什么是幂等?幂等性的实质是:对于一个资源,不管你请求一次还是请求多次,对该资源本身造成的影响应该是相同的,不能因为重复的请求而对该资源重复造成影响。注意关注的是请求操作对资源本身造成的影响,而不是请求资源返回的结果。

如select * from t_user where id>10这条语句,假如在一次查询后数据库进行了insert或update操作,那么第二次再查时返回的结果可能与第一次不同,但这个操作是幂等性的,因为我们说过关注的是对资源本身的影响,不是返回的结果,虽然两次查询的返回结果不同,但select不管执行多少次,对数据库中的数据资源本身都不会产生任何影响。

幂等性包括:① 一次或多次请求,对资源均不会造成影响,比如select操作;② 第一次请求对资源产生了影响,后面再发出多个相同的请求,与发出单个请求具有相同的效果,不会重复对资源产生影响。比如支付宝转账,手抖重复提交了2次,第一次扣款成功,余额减少100元,第二次就不能再重复扣款了。

③ 需要说明的是网络超时、服务宕机等问题,不是幂等的范围。

幂等性是系统服务对外的一种承诺。比如我写了一个接口,我承诺我的接口是符合幂等性的,就是说外部的多次调用对我系统造成的影响都是相同的,不会因为多次调用而对系统重复造成影响。声明为幂等的服务认为调用失败是常态,并且允许在调用失败后重试。

02PARTRabbitMQ的幂等性

那我们回到RabbitMQ中,RabbitMQ中的幂等性又是什么意思呢?我们先来看看在RabbitMQ中,哪些情况可能导致非幂等?

① consumer接收到消息处理完成后,在给Broker返回ack途中网络中断,Broker未收到确认信息,根据RabbitMQ的重试补偿机制,则会把这条消息再重发给其他的消费者或等网络重连后再发送给该消费者,造成了消息的重复消费。② 在开启生产者confirm模式下,生产者已经把消息发送到Broker,但在Broker回传ack确认时网络中断,生产者也会重新发送刚才的消息,造成Broker收到了重复的消息,最终将两条重复的消息发送到消费端,造成了消息的重复消费。通过以上两种场景我们看出,其实MQ的幂等性保障应该在消费端,要保证MQ的幂等性,就要保证消费者不会重复消费相同的消息。※ 如何避免消息的重复消费问题?全局唯一ID + Redis生产者在发送消息时,为每条消息设置一个全局唯一的messageId,消费者拿到消息后,使用setnx命令,将messageId作为key放到redis中:setnx(messageId,1),若返回1,说明之前没有消费过,正常消费;若返回0,说明这条消息之前已消费过,抛弃。

※ setnx命令的含义,若给定的key不存在,执行set操作,返回1,若给定的Key已存在,不做任何操作,返回0。

> 生产者代码

public void sendMessageIde() {    MessageProperties properties = new MessageProperties();    properties.setMessageId(UUID.randomUUID().toString());    Message message = new Message("Hello RabbitMQ".getBytes(), properties);    rabbitTemplate.convertAndSend("durable-exchange", "rabbit.long.yuan", message);}

> 消费者代码

@RabbitListener(queues = "durable-queue")@RabbitHandlerpublic void processIde(Message message, Channel channel) throws IOException {    if (stringRedisTemplate.opsForValue().setIfAbsent(message.getMessageProperties().getMessageId(),"1")){        // 业务操作...        System.out.println("消费消息:"+ new String(message.getBody(), "UTF-8"));        // 手动确认        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);    }}

以上就是在RabbitMQ中保障幂等性的一个简单demo,幂等性在系统接口设计中尤为重要,尤其在金融、互联网系统,在做系统设计时需要着重考虑。

window.location.href如何多次请求_RabbitMQ如何保证幂等性?相关推荐

  1. window.location.href如何多次请求_何为幂等?如何设计?

    欢迎关注头条号:老顾聊技术 精品原创技术分享,知识的组装工 目录 前言 罪魁祸首 幂等性 幂等场景 token机制 token机制缺点 乐观锁机制 乐观锁机制缺点 唯一主键机制 去重表机制 总结 前言 ...

  2. window.location.href如何多次请求_测试同学必会系列之如何进行幂等性的测试

    很多同学都应该听过幂等这个概念,但如果在面试中真的被问起来什么是幂等,你有信心去解释清楚么? 首先看看幂等的定义. 一个HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服 ...

  3. window.location.href和window.location.replace

    说到这两个的使用区别,就得结合window.history.go(-1);wondow.history.back();这两个方法的机制了. 这两个方法是根据服务器记录的请求决定该跳到哪个页面. win ...

  4. window.open和window.location.href的几种用法

    windows.open("URL","窗口名称","窗口外观设定"); <A href="javascript:windo ...

  5. window.location.Reload()和window.location.href 区别

    首先介绍两个方法的语法: reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet])参数: bForceGet, 可选参数, 默认为 false ...

  6. 关于js中window.location.href、location.href 等如何跳转

    关于js中"window.location.href"."location.href"."parent.location.href".&qu ...

  7. js中window.location.href,location.href,parent.location.href,top.location.href的用法

    "window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...

  8. input onclick=window.location.href='https://www'不能跳转问题。

    使用input onclick属性跳转是遇到问题..不能跳转 上面的onclick里面应该怎么写?我试了几次都不行不知道是不是方法有问题 <input type="button&quo ...

  9. 用window.location.href实现刷新另个框架页面

    在写ASP.NET程序的时候,我们经常遇到跳转页面的问题,我们经常使用Response.Redirect ,如果客户要在跳转的时候使用提示,这个就不灵光了,如: Response.Write(&quo ...

最新文章

  1. 联邦学习fate笔记小结
  2. 软件测试培训分享:做软件测试需要掌握数据库的知识吗?
  3. 智源发布:2021 年十大人工智能技术趋势【附下载链接】
  4. 负载均衡设备选型计算参考
  5. 技术人员,你拿什么拯救你的生活----温水煮青蛙
  6. Java 8 Lambda 表达式解析
  7. linux mysql 知乎_在 Linux 上安装 MariaDB 或 MySQL | Linux 中国
  8. SQL Server 重置Identity标识列的值(INT爆了)
  9. 名不正则言不顺,言不顺则事不成
  10. 表格嵌套_HTML |2| 表格与列表
  11. WebConfig主要节点配置总结
  12. “属你最牛” | 树莓派百变打印机
  13. 小学计算机兴趣小组计划书,小学科技兴趣小组活动计划书
  14. 关关难过关关过——编译edm
  15. 【k8s】重启kubelet、查看所有服务
  16. 个人对价值观的认识与感受
  17. 资深EMC工程师总结:EMC整改流程及常见问题
  18. Vue style里面使用scoped属性并@import引入外部css, 作用域是全局的解决方案
  19. python随机生成小写字母表_用小写字母生成大随机字符串的最快方法
  20. 物联通信安全需求如何实现

热门文章

  1. 达梦数据库查看当前执行的查询并杀死session
  2. TTS语音播报程序部署与配置
  3. 达尔文流媒体服务器(Darwin Streaming Server)(DSS)并发性能测试报告
  4. Linux的目录结构与目录管理
  5. 力扣——所有可能的满二叉树
  6. JAVA高精度计算工具
  7. django 的form登录 注册
  8. SQL链表查询 数据库为空
  9. Mac下Android studio 之NDK配置教程(二)
  10. C++ 基本的输入输出