高并发
在当今互联网时代,无论是电商平台的促销活动,还是社交媒体的热点事件,都可能瞬间涌入大量的用户请求。
图片
高并发带来的挑战是巨大的:服务器资源紧张、响应速度变慢、甚至系统崩溃。
TPS突破5万对于许多大规模在线业务而言,是一个关键的技术目标。
TPS(Transactions Per Second):是衡量系统每秒处理事务数量的标准指标。
图片
TPS反映了系统的吞吐能力,它直接关系到系统的性能、响应时间和用户体验。
具体来说,5万TPS代表着系统每秒可以处理50,000个事务,这对于大多数电商平台、金融交易系统、社交应用等场景来说是一个巨大的挑战。
突破这一目标意味着架构能够处理更加复杂的业务请求,同时也能够应对突发的流量高峰。
我们需要深入分析,究竟是什么样的架构,才能够支撑如此高的并发。
如何支撑高并发?
当TPS达到5万时,系统将面临诸多挑战。
首先,数据库的访问成为瓶颈。
因为在高并发的情况下,大量的数据库查询、和写入操作可能导致数据库的负载过高,响应时间延迟。
这个时候,可以考虑“分库分表”,将数据分散存储,避免单一数据库的压力过大。
图片
通过分库分表,可以将不同的数据存储到不同的数据库中,使得不同数据表的读写操作能够并行执行,提高并发性能。
阿里巴巴的电商平台,例如淘宝、天猫,面对的是海量用户、商品和订单,单一数据库显然无法支撑。
因此,分库拆分是其架构设计的必然选择。
业务领域划分
将核心业务领域独立拆分,形成独立的数据库,实现业务隔离和数据解耦。
确保每个数据库承担明确的业务职责。
常见的分库包括:
图片
用户库:存储用户信息、账户信息...等。
商品库:存储商品信息、库存信息...等。
订单库:存储订单信息、支付信息...等。
交易库:存储交易信息,支付信息...等。
店铺库:存储店铺信息...等。
还可以,按用户ID范围、或哈希取模,进一步拆分成多个表。
比如user_table_01、user_table_02....,分散压力。
读写分离
通过主从数据库复制,读操作由从数据库处理,写操作由主数据库处理,减轻主数据库的负担。
读写分离的核心是主从复制,主数据库(主库)负责处理所有的写操作(INSERT、UPDATE、DELETE),而从数据库(从库)则复制主库的数据,并处理读操作(SELECT)。
主库将写操作的日志(例如,MySQL的binlog)同步到从库,从库通过执行这些日志来保持与主库数据的一致性。
高性能缓存
分布式缓存系统是高并发架构中的关键组成部分,通过使用如Redis、Memcached...等,缓存系统。
缓存系统通常用于存储:热点数据、查询结果等高频访问的数据,可以大大减少数据库的访问频率,提升响应速度。
但也需要考虑,在高并发流量的情况下,穿透、雪崩...等等场景。
图片
缓存穿透
缓存穿透是指查询一个不存在的数据,缓存和数据库中都没有这条数据,导致每次请求都会直接访问数据库。
如果大量请求查询不存在的数据,数据库会承受巨大的压力,甚至崩溃。
解决方案
使用布隆过滤器来判断请求的数据是否存在。
布隆过滤器是一种高效的数据结构,可以快速判断一个元素是否存在于集合中。
如果布隆过滤器判断数据不存在,则直接返回,避免访问缓存和数据库。
缓存雪崩
缓存雪崩是指大量缓存数据在同一时间失效,导致大量请求直接访问数据库,造成数据库压力过大,甚至崩溃。
解决方案:
设置随机过期时间,来解决。
为缓存数据设置随机的过期时间,避免大量缓存数据同时失效。
缓存预热
在系统启动时,提前加载热点数据到缓存中,避免大量请求直接访问数据库。
使用多级缓存,例如,本地缓存和分布式缓存结合使用。
构建高可用缓存集群
对于redis等缓存服务,做集群,或者使用哨兵模式,避免单点故障,提高可用性。
流量削峰
通过消息队列(如Kafka、RocketMQ...等),可以将高峰流量中的请求异步地推送到队列中,消费者按照设定的速率从队列中取出消息进行处理。
这样,系统可以在流量较低时处理请求,避免了系统因瞬时高并发而崩溃。
例如,在电商平台中,用户下单后,可以将支付请求通过消息队列推送到处理队列,由后台异步处理支付请求,避免高并发时同步处理的压力。
以及,在秒杀活动中,用户的请求量可能会激增,消息队列可以帮助将大量请求排入队列中,逐步处理,以避免系统崩溃。