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

京东云开发者
• 阅读 291

一 系统简介

百舸流量运营平台承接着京东金融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优化,是否命中索引,提高服务器硬件配置。

三 总结

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

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Redis 缓存性能实践及总结
一、前言在互联网应用中,缓存成为高并发架构的关键组件。这篇博客主要介绍缓存使用的典型场景、实操案例分析、Redis使用规范及常规Redis监控。二、常见缓存对比常见的缓存方案,有本地缓存,包括HashMap/ConcurrentHashMap、Ehcache、Memcache、GuavaCache等,缓存中间件包
Stella981 Stella981
3年前
300 分钟撸一个基于 Redis 亿级用户高并发系统
对于618、双十一、春运抢票这种高并发、大流量的场景一般都会用到缓存抗住大并发,市面上缓存框架用的最多的无疑就是Redis了,Redis作为稳居世界排名第一的KV内存数据库,同时也是最受欢迎的分布式缓存中间件,是应对高并发,大流量,低延迟业务场景的不二选择。面试必问!下面这十几道题都是关于Redis大厂面试被问到的,基本都跟Redis架构设计与底层原
Wesley13 Wesley13
3年前
Java架构师,大数据架构师,高并发设计模式,机器学习课程大全百度云分享
以下所有课程现在只需100元,需要的联系Q(2929608935)第一章:java精品课程目录大全1、亿级流量电商详情页系统的大型高并发与高可用缓存架构实战       1课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西?32分钟      2基于大型电商网站中的商品详情页系统
Wesley13 Wesley13
3年前
MySQL应对高并发之Redis缓存
高并发高并发(HighConcurrency)是指系统运行过程中的一种“短时间内遇到大量操作请求”的情况,主要发生在web系统集中大量访问收到大量请求,例如淘宝双十一、京东618类的活动。该情况的发生会导致系统在这段时间内执行大量操作(对资源的请求、数据库的操作等)。高并发相关常用的一些指标有:响应时间、吞吐量、每秒查询率QPS、并发用户数
京东云开发者 京东云开发者
4个月前
万字长文浅谈系统稳定性建设
1.背景京东的期中考试:618即将到来,各个团队都在进行期中考试前的模拟考试:军演压测,故障演练,系统的梳理以检测系统的稳定性以应对高可用,高性能,高并发。我们知道系统的稳定性建设是贯穿整个研发流程:需求阶段,研发阶段,测试阶段,上线阶段,运维阶段;整个流
京东云开发者 京东云开发者
3个月前
高并发系统的艺术:如何在流量洪峰中游刃有余
前言我们常说的三高,高并发、高可用、高性能,这些技术是构建现代互联网应用程序所必需的。对于京东618备战来说,所有的中台系统服务,无疑都是围绕着三高来展开的。而对于京东庞大的客户群体,高并发的要求尤为重要。用户对在线服务的需求和期望不断提高,系统的并发处理
京东云开发者 京东云开发者
2个月前
买药秒送 JADE动态线程池实践及原理浅析
一、背景及JADE介绍买药秒送是健康即时零售业务新的核心流量场域,面对京东首页高流量曝光,我们对频道页整个技术架构方案进行升级,保障接口高性能、系统高可用。动态线程池是买药频道应用的技术之一,我们通过3轮高保真压测最终初步确定了线程池的核心参数。但我们仍面
限速神器RateLimiter源码解析 | 京东云技术团队
作者:京东科技李玉亮目录指引限流场景软件系统中一般有两种场景会用到限流:•场景一、高并发的用户端场景。尤其是C端系统,经常面对海量用户请求,如不做限流,遇到瞬间高并发的场景,则可能压垮系统。•场景二、内部交易处理场景。如某类交易任务处理时有速率要求,再如上
一次网络请求中的流量分发过程 | 京东云技术团队
现代的企业级或互联网系统往往需要进行流量规划,达成透明多级分流。流量从客户端发出到服务端处理这个过程里,流经的与功能无关的技术部件有(达成“透明分流”这个目标所采用的工具与手段):客户端缓存、域名服务器、传输链路、内容分发网络、负载均衡器、服务端缓存。透明分流带来的价值:高可用架构、高并发。
服务端应用多级缓存架构方案 | 京东云技术团队
20w的QPS的场景下,服务端架构应如何设计?常规解决方案可使用分布式缓存来抗,比如redis集群,6主6从,主提供读写,从作为备,不提供读写服务。1台平均抗3w并发,还可以抗住,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能力。同时,缓存数据对于应用来讲都是共享的,主从架构,实现高可用。