关键词:
事故
前些天上线的扫码送会员活动。
场景:用户登录账号之后,扫二维码,送七天黄金会员,限制每个帐号只能领取一个
有恶意用户刷接口,在高并发下越过限制。
原因
领取会员流程: 1.后端先生成卡卷,将卡号放到消息队列中 2.用户扫码请求领取会员接口 2-1).先检查用户是否已经领取过该活动会员 2-2).领取过return “该帐号已领取”的标示 2-3).没领取从消息队列中拿取一张卡号 2-4).激活卡 2-5).更新用户本次活动为已经激活
这个流程在一般环境下是没有问题的,在高并发下就不行了。
2-1) 2-2) 2-3) 2-4) 2-5)
线程a -->
线程b -->
线程c -->
高并发下模拟几个线程同时请求
现在的rpc服务,除去极其敏感性数据的操作,其它数据的接口基本都没有做数据一致性控制。
其实做了控制也不能解决这个问题。再来说这个问题,高并发下因为线程a已经执行完激活卡的操作,用户的会员已经建立权益。但这时候线程a还没有执行到2-5,还没更新用户的领取卡卷的状态,这时候,又有一个这个用户的领取卡卷请求过来。2-1的check 操作并不能阻止这个请求,同样的再次领取卡卷并且激活,导致线程a在的执行在2-1到2-5之间都会有其它的线程越过检查。
解决
解决这种并发问题无非是两种,悲观锁和乐观锁。
悲观锁阻塞,乐观锁快速响应失败。
优点 缺点
悲观锁 可以响应重复请求,幂等 高并发下请求堆积
乐观锁 高并发下没有大量线程阻塞 不可重复响应,不幂等
考虑并发量比较大,采用的乐观锁实现。对流程进行加锁。
2种实现方式:redis和MySQL,考虑下在不修改原表的情况下,使用redis的SETNX的api
实现:
2-0).活动-帐号形成key,SETNX(key)成功返回1,失败返回0
只有返回1,才能进行后续流程,将并发控制交给redis,redis是线程模型没有并发问题
2-1).先检查用户是否已经领取过该活动会员
2-2).领取过return “该帐号已领取”的标示
2-3).没领取从消息队列中拿取一张卡号
2-4).激活卡
2-5).更新用户本次活动为已经激活
2-6).将删除活动-帐号形成的key
2-0) 2-1) 2-2) 2-3) 2-4) 2-5) 2-6)
线程a ->1
线程b ->0
<-
线程c ->0
<-
只有线程a已经执行过2-6,才能线程b进入流程,但是这时候用户已经为领取过卡卷状态
线程a ->
线程b ->1 用户卡卷已经更新过
线程c ->0
高并发下springcloud hystrix的严重问题?
】高并发下springcloudhystrix的严重问题?【英文标题】:seriousissueofspringcloudhystrixunderhighconcurrency?【发布时间】:2018-04-0523:55:24【问题描述】:第1部分我使用HystrixCommand进行服务,并使用jmeter进行高并发测试。测试结果太差了,看... 查看详情
高并发下的系统设计(偏数据库设计)
高并发完毕数据库设计是要结合不同的应用场景的,本文主要涉及到一下问题:1、对数据库表的字段訪问比較均衡,业务导向明显(网上商城,多条业务线);2、对数据库表的字段訪问比較均衡,业务导向不明显(对单一应用... 查看详情
redis实现高并发下的抢购秒杀功能
...很常见的一个应用场景,主要需要解决的问题有两个:1高并发对数据库产生的压力2竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis。... 查看详情
高并发下如何保证接口的幂等性?
前言接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。不知道你有没有遇到过... 查看详情
高并发下如何保证接口的幂等性?
前言接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。不知道你有没有遇到过... 查看详情
高并发下保证接口的幂等性的几种方式(代码片段)
高并发下保证接口的幂等性的几种方式--洱涷Zz场景不知道你有没有遇到过这些场景:有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。我们在项目... 查看详情
高并发下保证接口的幂等性的几种方式(代码片段)
高并发下保证接口的幂等性的几种方式--洱涷Zz场景不知道你有没有遇到过这些场景:有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。我们在项目... 查看详情
1.网站高并发下的测试指标及优化泛谈
网站高并发下的测试指标:1.并发量:可以承接多少次请求。2.服务器负载:服务器的cpu/内存消耗。3.平均响应时间:处理一次请求花费的时间。测试高并发时,一般的测试标准是在服务器负载为70%的时候可以处理多少次请求还... 查看详情
漫画:高并发下的hashmap(代码片段)
这一期我们来讲解高并发环境下,HashMap可能出现的致命问题。 HashMap的容量是有限的。当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突... 查看详情
高并发下的java数据结构(list,set,map,queue)
由于并行程序与串行程序的不同特点,适用于串行程序的一些数据结构可能无法直接在并发环境下正常工作,这是因为这些数据结构不是线程安全的。本节将着重介绍一些可以用于多线程环境的数据结构,如并发List、并发Set、... 查看详情
分布式高并发下actor模型(代码片段)
写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争。处理各种锁的问题是让人十分头... 查看详情
高并发下接口幂等性解决方案
一、幂等性概念在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不... 查看详情
使用google的guova开发高并发下的接口限流
使用google的guova开发高并发下的接口限流使用google的guova进行限流1、guova的限流方式,在定时产生定量的令牌,令牌的数量限制了流量2、增加一个订单接口限流类OrderRateFilter,继承ZuulFilter,并重载方法;filterType、filterOrder、shouldFi... 查看详情
httpclient高并发下性能优化-http连接池(代码片段)
首先,明确三点:1.http连接池不是万能的,过多的长连接会占用服务器资源,导致其他服务受阻2.http连接池只适用于请求是经常访问同一主机(或同一个接口)的情况下3.并发数不高的情况下资源利用率低下那么,当你的业务符合上面3点,... 查看详情
redis实现高并发下的抢购/秒杀功能
...lhttps://www.cnblogs.com/TankXiao/p/4045439.html之前写过一篇文章,高并发的解决思路(点此进入查看),今天再次抽空整理下实际场景中的具体代码逻辑实现吧:抢购/秒杀 查看详情
关于高并发下kafkaproducersend异步发送耗时问题的分析(代码片段)
最近开发网关服务的过程当中,需要用到kafka转发消息与保存日志,在进行压测的过程中由于是多线程并发操作kafkaproducer进行异步send,发现send耗时有时会达到几十毫秒的阻塞,很大程度上上影响了并发的性能,而在后续的测试... 查看详情
【golang】高并发下tcp常见问题解决方案
...户端,即connectionresetbypeer。在linux平台上,客户端在进行高并发TCP连接处理时,最高并发数量都要受系统对用户单一进程同时打开文件数量的限制(这是因为系统每个TCP都是SOCKET句柄,每个soker句柄都是一个文件),当打开连接... 查看详情
高并发下秒杀商品,你必须知道的9个细节(代码片段)
前言高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中,指定了一定数量... 查看详情