对号入座,快看看你的应用系统用了哪些高并发技术?

京东云开发者
• 阅读 49

一 系统简介

百舸流量运营平台承接着京东金融APP核心资源位和京东APP部分重要资源位,大促单接口QPS达到10w+,压测单接口到20w+,典型的c端读链路高并发场景。接下来,聊聊我们的系统都有哪些应对高并发的“武功秘籍”。



对号入座,快看看你的应用系统用了哪些高并发技术?



二 “武功秘籍”

1 缓存(redis缓存,本地缓存)

缓存是提高系统的并发和提升系统的性能利器。redis分布式缓存用来解决缓存容量和性能问题,本地缓存用来解决redis的热key问题和提升性能。

详情可以查看之前的文章《服务端应用多级缓存架构方案》

2 限流

限流是保护系统的一种策略,限流是控制接受请求的速率,通过压测提前预知系统可承载的并发量,是对系统资源的前置保护,保证系统容量范围内的请求能够正常返回,超过容量的请求丢弃。

可通过JSF配置限流或者sentinel实现限流。经典算法:令牌桶,漏桶,滑动时间窗口。

3 熔断降级

熔断也是保护系统的一种手段,分布式系统中系统之间通过微服务调用,偶尔会出现依赖的某个服务不可用或者耗时骤增,导致耗尽业务线程池,从而拖垮整个服务,可通过sentinel配置慢调用比例或者异常比例策略,达到熔断阈值后,接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功通过后,则结束熔断,否则继续熔断。 实际过程中,需要结合上下游链路,设置合理的超时时间以及兜底数据。

常见的降级类型有:日常降级;大促非核心接口降级;大促日志降级,只打印error级别日志。

4 异步(CompletableFuture,MQ)

系统解耦:完成一项业务指令通常需要多个微服务协作,核心业务完成后,可通过消息的方式进行异步解耦,让其他服务订阅消息,完成各自的业务逻辑,适用于无需用户等待感知的场景。

提升性能:在C端用户等待的感知的场景,需要多个微服务协作,如果串行RPC调用,耗时是每个服务耗时之和,可通过CompletableFuture实现RPC异步调用,当使用时汇总结果,提升系统的性能。

5 池化技术

池化技术思想: 池化思想的解决的核心思想是通过预先创建数据库连接或者线程放入池中,以便在需要时可以重复使用,减少创建和销毁的开销,提高系统的性能和并发。

数据库连接池:如果是部署多台机器,注意多台机器连接数是否超过数据库最大连接数,避免出现连接不上问题。

业务线程池:自定义线程池,根据业务采用合适的拒绝策略,注意线程隔离,避免某个接口异常拖垮整个应用。

6 代码优化

减少调用链路,优化代码逻辑执行顺序,将阻断校验流程前置,优化数据结构和算法,优化查询逻辑,减少IO次数等。

7 JVM调优

使用G1垃圾回收器,应用系统根据自己的业务情况配置JVM参数,常规4C8G通用配置可参考:

  -Xms4096m -Xmx4096m -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=80

核心参数:-Xms初始堆大小,-Xmx最大堆大小,MaxMetaspaceSize最大元空间大小,MetaspaceSize表示Metaspace首次使用不足时触发Full GC(全面垃圾回收)的阈值,垃圾回收机制使用G1回收器,MaxGCPauseMillis在jvm垃圾回收过程中允许停顿的最大毫秒时间。

8 分治思想,横向扩展,

应用服务应该设计为无状态的,可通过增加应用实例数量来应对突发流量,将流量分到每台机器上,同样可以将应用进行按照业务拆分,单独部署,提高系统并发。

合并批量请求,将多次调用改为一次批量调用,减少网络开销。

9 预热

通过定时任务或者初始化脚本提前将数据加载到内存,提高系统的性能,常见的有缓存数据预热,ES数据预热等。

针对应用升级或者重启抖动,可以通过JSF预热的方式,应用重启后,在预热时间内,流量逐渐增加的方式,减少抖动。

JSF预热可参考文章《后端服务之应用预热》

10 数据异构

业务数据通常存储在支持事务的关系型数据库中,当在面对复杂查询场景时捉襟见肘,可将数据通过binlog异构到ES中,ES支持复杂场景的查询并且有较高的性能,轻松突破数据库单表数据量大及多表关联查询瓶颈。

数据异构可参考文章《记一次生产慢sql索引优化及思考》 中的目录五:长期优化方案。

11 分库分表,数据库优化

分库和分表各抗什么?

分表:当一个表中的数据量过大时,会导致查询速度变慢、插入和更新操作效率下降等问题。通过分表,每个小表的数据量就相对较小,性能问题得以缓解。

分库:当一个数据库实例无法承受大量数据的存储和并发时,可通过分库来分散系统压力。

通常情况下,分库和分表是结合使用的。

数据库优化中常见的是sql优化,是否命中索引,提高服务器硬件配置。

三 总结

以上为百舸系统处理高并发问题的一些策略,高并发架构是演进而来,避免过度设计,没有一个技术能解决所有的问题,抓住关键矛盾,使用前一定要做好调研和评估,还有哪些?欢迎补充。

点赞
收藏
评论区
推荐文章
交易系统之数据库弱依赖解决方案
随着互联网的普及,大流量高并发的场景越来越多,数据库成为整个系统最终重要服务,不能出一点问题,尤其核心P0系统哪怕瞬间的DB操作异常可能造成大量异常交易,可能产生致命的问题,所以核心系统弱依赖数据库都是必须考虑的。本期介绍下实践过的三种解决方案:DB灾备机制方案、DB高并发替换方案、财富系统弱依赖DB方案。
Stella981 Stella981
2年前
Redis 缓存性能实践及总结
一、前言在互联网应用中,缓存成为高并发架构的关键组件。这篇博客主要介绍缓存使用的典型场景、实操案例分析、Redis使用规范及常规Redis监控。二、常见缓存对比常见的缓存方案,有本地缓存,包括HashMap/ConcurrentHashMap、Ehcache、Memcache、GuavaCache等,缓存中间件包
Stella981 Stella981
2年前
300 分钟撸一个基于 Redis 亿级用户高并发系统
对于618、双十一、春运抢票这种高并发、大流量的场景一般都会用到缓存抗住大并发,市面上缓存框架用的最多的无疑就是Redis了,Redis作为稳居世界排名第一的KV内存数据库,同时也是最受欢迎的分布式缓存中间件,是应对高并发,大流量,低延迟业务场景的不二选择。面试必问!下面这十几道题都是关于Redis大厂面试被问到的,基本都跟Redis架构设计与底层原
Wesley13 Wesley13
2年前
Java架构师,大数据架构师,高并发设计模式,机器学习课程大全百度云分享
以下所有课程现在只需100元,需要的联系Q(2929608935)第一章:java精品课程目录大全1、亿级流量电商详情页系统的大型高并发与高可用缓存架构实战       1课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西?32分钟      2基于大型电商网站中的商品详情页系统
Wesley13 Wesley13
2年前
MySQL应对高并发之Redis缓存
高并发高并发(HighConcurrency)是指系统运行过程中的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问收到大量请求,例如淘宝双十一、京东618类的活动。该情况的发生会导致系统在这段时间内执行大量操作(对资源的请求、数据库的操作等)。高并发相关常用的一些指标有:响应时间、吞吐量、每秒查询率QPS、并发用户数
京东云开发者 京东云开发者
2星期前
基于Redis实现基本抢红包算法
简介:抢红包是我们生活常用的社交功能,这个功能最主要的特点就是用户的并发请求高,在系统设计上,可以使用非常多的办法来扛住用户的高并发请求,在本文中简要介绍使用Redis缓存中间件来实现抢红包算法,Redis是一个在内存中基于用户首先输入红包金额和红包个数,
京东云开发者 京东云开发者
11个月前
限速神器RateLimiter源码解析 | 京东云技术团队
作者:京东科技李玉亮目录指引限流场景软件系统中一般有两种场景会用到限流:•场景一、高并发的用户端场景。尤其是C端系统,经常面对海量用户请求,如不做限流,遇到瞬间高并发的场景,则可能压垮系统。•场景二、内部交易处理场景。如某类交易任务处理时有速率要求,再如上
京东云开发者 京东云开发者
11个月前
一次网络请求中的流量分发过程 | 京东云技术团队
现代的企业级或互联网系统往往需要进行流量规划,达成透明多级分流。流量从客户端发出到服务端处理这个过程里,流经的与功能无关的技术部件有(达成“透明分流”这个目标所采用的工具与手段):客户端缓存、域名服务器、传输链路、内容分发网络、负载均衡器、服务端缓存。透明分流带来的价值:高可用架构、高并发。
京东云开发者 京东云开发者
9个月前
服务端应用多级缓存架构方案 | 京东云技术团队
20w的QPS的场景下,服务端架构应如何设计?常规解决方案可使用分布式缓存来抗,比如redis集群,6主6从,主提供读写,从作为备,不提供读写服务。1台平均抗3w并发,还可以抗住,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能力。同时,缓存数据对于应用来讲都是共享的,主从架构,实现高可用。
京东云开发者 京东云开发者
9个月前
CGLIB动态代理对象GC问题排查 | 京东云技术团队
一、问题是怎么发现的最近有个新系统开发完成后要上线,由于系统调用量很大,所以先对核心接口进行了一次压力测试,由于核心接口中基本上只有纯内存运算,所以预估核心接口的压测QPS能够达到上千。压测容器配置:4C8G先从10个并发开始进行发压,结果cpu一下就飙升