数据的热点单点问题由于其独有的高访问特性,在性能上一直都一大难题,IT界的大牛们也一直在寻求一种更为优化的解决方案!其中也不乏很多优秀的解决方案,但随着业务的不断攀升和互联网的高速发展,也就显得捉襟见肘,可见对此探索的重要性!
最近项目中也遇到了此瓶颈,请容我将前因后果以及我自己设想的粗陋方案娓娓道来,欢迎大神们拍砖,在下感激不尽!
前段时间接了一个双11的活动,业务逻辑:用户购买某一类商品后,活动期间的4个整点在活动页点击按钮领取支付宝红包,每个时段奖品数量有限,先到先得。听着很简单,可是活动开始时,异常火热,流量超过了我们的预估,本来是分时段领取奖品,结果演变为了秒杀。
当时每个整点的QPS瞬间飙高,响应时间RT短时间内居高不下,但是整个Check下来应用全部机器的负载都非常正常,后来全面查找原因,才找到问题的根源,是由于每个时段更新数据库同一条奖品导致超时!
整点开抢后瞬时巨量的请求同时涌入,即使我们Apache端做过初步限流,应用也做了信号量的控制,而且加上分布式缓存的使用,减缓了相当大的压力,整个业务逻辑校验阶段运作良好,但是系统的瓶颈就转移到其他环节:减奖品库存!因为我们每个时段只有一个奖品A,每次减库存都是update奖品A中的奖品余额字段!大量符合发奖要求的用户请求瞬时涌入数据库去更新此条记录,update锁行,导致后面的请求全部排队等待,等前面一个update完成释放行锁后才能处理下一个请求,大量请求等待,占用了数据库的连接!一旦数据库同一时间片内的连接数被打满,就会导致这个时间片内其他后来的全部请求因拿不到连接而超时,导致访问此数据库的其他环节也出现问题!所以RT就会异常飙高!
根据木桶理论,我们后续肯定必须得优化这个最短板,将这个瓶颈解决!针对这样的情况,我们这边出了两套方案:1、强依赖分布式缓存达到减库存的目的;2、热点/单点数据拆分,弱依赖分布式缓存,采用分散热点的方式减库存.下面请允许我详细分解下这两套方案,也希望大家提各种建设性意见!
一、强依赖分布式缓存
应用中使用分布式缓存来存储当前时间段的奖品余额,有用户中奖则将此缓存中的余额减一,不需要查询和实时更新数据库,而是每隔自定义的一段时间将缓存中的余额异步更新至数据库中。
优点:这种方式完全依赖于缓存,读写速度快,不需要实时更新数据库,降低了数据库相当大的压力;
缺点:缓存不是100%稳定,很容易丢,即使采用持久化的缓存,在高并发下有时也会出问题;一旦丢失数据,这样就导致数据库记录的奖品余额比实际真实存在的奖品余额要多,这个时候读数据库,就会导致奖品多发,也就是所谓的超卖!
二、热点/单点数据拆分,弱依赖分布式缓存
某时段的一个奖品拆分为多条后,如何能保证先到先得的业务需求将奖品准确发完,这里就引入分布式缓存作为辅助,缓存不完全稳定没关系,只是借助其在多条奖品中进行准确分发,当数据库所有奖品都有余额的情况时,能减少查询操作!只有当某一条奖品余额为0时缓存中的数据才会失效,这时才需要查询一次数据库!
步骤:
1、 同个时段的奖品拆为多份(比如10份),加行号N区分(1~10),奖1~10的数值存入数组M中;
2、 根据行号1~10 ,查询分布式缓存中是否存在各行奖品对应的记录(缓存中存放没余额的奖品行);
是: 将存在的行号存入数组P;
否: 数组P值为NULL;
3、 数组M-数组P=数组R;
4、 判断数组R是否为空 ;
是: 没有奖品余额,返回未中奖!
否: 在数组R中随机一个行号L;
5、 更新数据库表,将L行奖品余额减一;
更新成功: 减奖品库存成功,直接返回发奖成功!
更新失败: 极大可能原因是由于没有奖品导致
5.1、 查询数据库中这10个奖品List(全量list);
5.2、 将List中没有奖品余额的行同步至对应的缓存(第2 步),并判断List中是否所有奖品行余额全为0;
是: 无奖品,返回未中奖;
否: List中选择一个有余额的奖品,最好是余额最多的,将行号存入L,执行第5 步;
流程图:
优点:此方案不会发生奖品多发的情况,将单行数据分拆为多行,分散了热点,同样可以减轻数据库更新时超负荷长链等待导致的连接被等待用户占用而后续请求超时,可以通过拆分为适量的行来解决单点热点数据带来的性能问题!
缺点:此方案需要做业务拆解,增加了业务的复杂性!奖品拆分为多条,数据量太大时,不是很便捷,可能会带来数据库性能问题,但这个可以通过分库分表,旧数据迁移备份的方式解决!在奖品快被抽完的那么几微秒的用户可能存在误杀!
这就是目前针对数据库的单点热点问题,我个人的一些见解,也只是初步构想,还没有进入完全的实践中,还希望各位大神多指点一二!
相关推荐
处理高并发问题,需要有成熟的解决方案来确保系统的稳定性和性能。本文将深入探讨如何设计和优化数据库以应对高并发环境。 首先,数据库的设计是解决高并发问题的关键。一种常见的方法是采用读写分离策略,即将读...
本资料包"3月20php+mysql高并发解决方案"提供了解决这类问题的策略和实践方法。 首先,我们要理解在PHP和MySQL环境中,高并发可能导致的问题,如数据库连接池过载、SQL查询效率低下、数据一致性问题等。以下是一些...
总结来说,Java并发编程与高并发解决方案涉及了众多复杂的概念和技术点。从CPU多级缓存、缓存一致性、Java内存模型,到具体的高并发系统设计策略,都是构建高性能、可伸缩应用的基石。掌握这些知识对于开发大型的、...
在企业环境中,面对高并发问题,一套成熟的解决方案是至关重要的。高并发场景通常出现在大型电商平台、社交网络、金融服务等业务中,这些系统需要处理大量同时请求,保证服务的稳定性和性能。本视频系列将深入探讨...
在IT行业中,高并发分布式解决方案是构建大规模、高性能系统的关键技术。随着互联网业务的飞速发展,处理亿级甚至更高流量的网站已经成为常态,而如何有效地应对这些流量,确保系统的稳定性和可扩展性,就成为了IT...
高并发网站解决方案的核心目标是保证系统稳定、响应快速、数据一致,同时要具备良好的可扩展性和容错性。本资料包“高并发网站解决方案.zip”可能包含了一系列的技术策略和实践方法,以下是对这些知识点的详细解释:...
### 高性能高并发服务器架构的关键知识点解析 #### 一、引言 在当前互联网快速发展背景下,越来越多的应用和服务面临着高并发、大流量的挑战。如何构建一个既能满足高并发需求又能保证高性能的服务器架构,成为了...
这种策略在异常情况下仍能保持一定的数据一致性,但高并发时仍可能出现问题。 **解决方案**: - **热点数据处理**:对热点数据进行预加载或设置较长的过期时间,减少对数据库的冲击。 - **使用分布式锁**:如Redis...
分布式缓存系统如Memcached和Redis也是高并发场景下的常见解决方案,它们能存储热点数据,减少对后端数据库的访问。同时,消息队列如RabbitMQ、Kafka可以解耦系统组件,保证数据的有序处理,避免数据丢失。 监控和...
- **负载均衡**: 将查询和写操作分散到不同的分片上,避免单点故障和性能瓶颈。 **3.4 组合分区** - **定义**: 结合水平分区和垂直分区,将表划分为多个小的、专门化的分区。 - **应用场景**: 适用于数据量大、...
在探讨《Java架构专题,高并发架构下性能提升千倍内幕揭秘》这一主题时,我们需要深入分析高并发场景下的Java架构优化策略和技术细节。虽然提供的部分内容似乎存在乱码问题,但我们可以根据标题、描述和标签来展开...
根据提供的文件信息,我们可以深入探讨有关“Java高性能高并发秒杀系统”的相关知识点。下面将详细介绍该主题涉及的核心概念、关键技术以及实现方案等。 ### 一、秒杀系统的概念与应用场景 #### 1.1 秒杀系统简介 ...
以上内容涵盖了Kafka、Redis和MySQL在处理高并发和高可用性时的关键知识点,包括它们的基本原理、操作方法、优化策略和常见问题的解决方案。学习和掌握这些知识点,有助于构建稳定、高效的数据处理系统。
总结来说,MySQL海量数据的存储和访问解决方案主要依赖于数据切分技术,通过Sharding策略将数据分布到多个数据库,以实现水平扩展,提升系统性能。这一过程涉及路由规则的设计、负载均衡策略的实施以及后期扩展性...
综上所述,"高并发WEB服务器卓有成效方案的研究与实践"涵盖了从基础架构设计到具体技术实施的多个层面,为应对高并发挑战提供了全面的解决方案。通过深入学习和实践这些知识,可以有效提升Web服务器的性能和可靠性,...
在本文中,我们将探讨硬件升级、部署策略、环境配置等方面来解决高并发和高负载的问题。 **硬件篇** 1. **处理能力提升**:增加服务器的CPU数量,选择多核、高频率、大缓存的处理器,可以显著提升Web请求处理效率...
大促持续大流量多种活动的混合场景单点故障风险同城、异地多活DDoS/CC攻击主机入侵欺诈行为泛滥边缘层动静分离全站加速刷新预热接入层T级流量防御防爬防刷防CC防欺诈行为网关层承接海量流量同城、异地容灾智能流量...
《高可用MySQL_构建健壮的数据中心_第2版》这本书深入探讨了如何在实际环境中构建和维护高可用性的MySQL数据库系统。MySQL是全球最受欢迎的开源关系型数据库管理系统之一,其高可用性对于企业的业务连续性和数据安全...