• 自动秒收录
  • 软件:1973
  • 资讯:57811|
  • 收录网站:279872|

IT精英团

高并发服务的几点优化经验

高并发服务的几点优化经验

浏览次数:
评论次数:
编辑: 乐咏
信息来源: ITPUB
更新日期: 2022-05-18 20:57:13
摘要

前言:如何优化高并发服务,这里指的是qps在20万以上的在线服务,注意不是离线服务,在线服务会存在哪些挑战呢?①无法做离线缓存,所有的数据都是实时读的②大量的请求会打到线上服务,对于服务的响应时间要

  • 正文开始
  • 相关阅读
  • 推荐作品

如何优化高并发服务?这里指的是qps在20万以上的线上服务。请注意,它不是离线服务。线上服务会有哪些挑战?离线缓存不可能,所有数据都是实时读取的;会有大量的请求发送给在线服务,对服务的响应时间要求很高。一般要求在300ms以内。如果超过这个时间,用户体验会急剧下降;数据量大。如果qps单次超过50W,单个1kb,50万就是5GB,一分钟就要30G,对底层数据存储和访问压力很大。这个怎么处理?

一:向关系型数据库sayno

真正大规模的面向互联网C端的服务,是不会直接把数据库作为自己的存储系统的。无论是使用底层的子数据库和子表,还是各种优秀的连接池,mysql/oracle面对大规模的在线服务都有着天然的劣势。再怎么优化,也难以抵挡qps超过50万流量的冲击。所以换个思路,我们必须使用类似nosql的缓存系统,比如redis/mermCache,作为自己的‘数据库’,而关系型数据库,比如mysql,只是一个异步编写数据查询的备份系统。

例如,在JD.COM双11主会场:一些商品被摆上货架。这些商品在场馆上架之初直接写入redis,上架之后再通过异步消息写入mysql。c端查询总是直接读取redis,而不是数据库,而B端查询可以去数据库。这部分流量不是很高,数据库肯定能承受。

二:多级缓存

大家都知道缓存是提高高并发性能的利器之一。但是,如何利用好缓存,然后利用多级缓存,是我们需要思考的问题。Redis是目前缓存的首选。单机可以达到6-8万qps。面对高并发,我们可以手动横向扩展容量,满足qps可能无线增长的场景。但是这种方式也有缺点,因为redis是单线程的,会有热点问题。虽然redis内部使用crc16算法哈希,但是同样的密钥还是会落在单独的机器上,增加机器的负载。redis典型的有两个问题:缓存击穿和缓存穿透,尤其是在秒杀场景下,如果想要解决热点问题,会变得更加困难。这时候就必须考虑多级缓存了。在典型的峰值场景中,单个sku商品的qps将在销售开始的那一刻急剧上升。而我们这个时候需要用memeryCache来封锁一楼。memeryCache是多线程的,并发性比redis好,自然能解决热点问题。有了memeryCache,我们还需要localCache,这是一种用内存换取速度的方式。本地缓存将访问用户的一级请求。如果它找不到,就去memeryCache,然后redis。这个过程可以阻止数百万个qp。

三:多线程

记得刚入行的时候,每次面试都被问到多线程的问题。那时候,我看起来很傻。多线程有这么强大吗?为什么要说多线程?为什么要用多线程?你为什么不用它?为了说明这个道理,我先举个例子。我曾经优化过一个界面,典型的场景。原来的办法是循环一个30-40万的单子。list执行的操作,list很简单,就是读取一次redis的数据需要3ms左右。这是一种同步方式。在预览环境下测试,直接超时30秒。后来的优化方法是把原来的同步调用改为线程池调用。线程池中的线程数量或阻塞队列的大小需要自行优化。最后,测量界面R。

t只需要3秒。足以见多线程的威力。在多核服务的今天,如果还不用多线程就是对服务器资源的一种浪费。这里需要说一句,使用多线层一定要做好监控,你需要随时知道线程的状态,如果线程数和queueSize设置的不恰当,将会严重影响业务~ 当然多线程也要分场景,如果为了多线程而多线程反而是一种浪费,因为多线程调度的时候会造成线程在内核态和用户态之间来回切换,如果使用不当反而会有反作用



四: 降级和熔断


降级和熔断是一种自我保护措施,这和电路上的熔断器的基本原理是一样的,防止电流过大引起火灾等,面对不可控的巨大流量请求很有可能会击垮服务器的数据库或者redis,使服务器宕机或者瘫痪造成不可挽回的损失。因为我们服务的本身需要有防御机制,以抵挡外部服务对于自身的侵入导致服务受损引起连带反应。降级和熔断有所不同,两者的区别在于降级是将一些线上主链路的功能关闭,不影响到主链路.熔断的话,是指A请求B,B检测到服务流量多大启动了熔断,那么请求会直接进入熔断池,直接返回失败。如何抉择使用哪一个需要在实际中结合业务场景来考虑.



五: 优化IO


很多人都会忽视IO这个问题,频繁的建联和断联都是对系统的重负。在并发请求中,如果存在单个请求的放大效那么将会使io呈指数倍增加。举个例子,比如主会场的商品信息,如果需要商品的某个具体的详情,而这个详情需要调用下游来单个获取.随着主会场商品的热卖,商品越来越多,一次就要经过商品数X下游请求的数量,在海量的qps请求下,IO数被占据,大量的请求被阻塞,接口的响应速度就会呈指数级下降。所以需要批量的请求接口,所有的优化为一次IO



六: 慎用重试


重试作为对临时异常的一种处理的常见手法,常见应对的方式是请求某个服务失败或者写数据库了重新再试,使用重试一定要注意以下几点①控制好重试次数②重试的间隔时间得衡量好③是否重试要做到配置化。之前我们线上出了一个bug,kafka消费出现了严重的lag,单词消耗时间是10几秒,看代码之后发现是重试的次数过多导致的,并且次数还不支持配置化修改,所以当时的做法只能是临时改代码后上线.重试作为一种业务的二次尝试,极大提升了程序的请求success,但是也要注意以上几点。



七:边界case的判断和兜底


作为互联网老手,很多人写出的代码都不错,但是在经历过几轮的故障review之后发现很多酿成重大事故的代码背后都是缺少对一些边界问题的处理,所犯的错误非常简单,但是往往就是这些小问题就能酿成大事故.曾经review过一次重大的事故,后来发现最终的原因居然是没有对空数组进行判空,导致传入下游的rpc是空的,下游直接返回全量的业务数据,影响数百万用户。这个代码改动起来很简单,但是是令人需要反省的,小小的不足酿成了大祸



八:学会优雅的打印日志


日志作为追溯线上问题的最佳利器,可谓保留bug现场的唯一来源。虽然有arthas这样的利器方便我们排查问题,但是对于一些比较复杂的场景,还是需要日志来记录程序的数据.但是在高流量的场景中,如果全量打印日志对于线上来说就是一种灾难,有以下缺点①严重占用磁盘,估算以下,如果接口的qps在20万左右,日志一秒就几千兆,一天下来就是上千GB ②大量的日志需要输出,占用了程序IO,增加了接口的RT(响应时间) 如果需要解决这个问题,①我们可以利用限流组件来实现一个基于限流的日志组件,令牌桶算法可以限制打印日志的流量,比如一秒只允许打印一条日志 ②基于白名单的日志打印,线上配置了白名单用户才可以打印出来,节省了大量了无效日志输出

   总结: 本篇博客讨论了高并发服务在面对大流量时的一些基本注意事项和应对的点,当然实际线上的比目前的更复杂,这里只是给出几条建议,希望我们在高并发的路上保持敬畏,继续探索.更好的深耕c端服务,做更好的互联网应用,加油

  


Java处理异常的9个最佳实践 你做得对吗?
« 上一篇 2022-05-18
谈如何设计未来的仓库建筑
下一篇 » 2022-05-18
  • 如何在Ubuntu中保留文件系统并备份当前开发板镜像
    0阅读 0条评论 个赞
    在Ubuntu保留文件系统或者说备份当前开发板镜像的需求在不断增加。比如Ubuntu文件系统需要安装库文件的话直接使用apt-get工具就可以下载,但由于需要下载的核心板较多,比较费时间,这时需要将安……
  • 国产核心板全志T507助力消防系统升级
    0阅读 0条评论 个赞
    9月16日下午,位于湖南长沙市区内的中国电信大楼发生火灾,建筑高度218米,现场浓烟滚滚,数十层楼体燃烧剧烈。消防救援人员赶到现场后很快将火势控制住,目前大楼火势已被扑灭,所幸未发现人员伤亡。湖南电信……
  • 教大家如何处理Spring Boot易流中的用户和群体!
    0阅读 0条评论 个赞
    1.准备工作2.用户操作2.1添加用户2.2修改用户2.3删除用户2.4查询用户3.组操作3.1添加组3.2修改组3.3删除组3.4查询组4.查看表详情虽然说我们在实际开发中,……
  • 从PG15开始WAL压缩优化
    0阅读 0条评论 个赞
    PG15传闻中的超级令人激动的功能大多数跳票了,年初我也写过一个关于PG15新功能跳票的文章。PG15BETA已经发出几个月了,似乎PG15里令人激动人心的功能不多,不过从长长的新功能列表里,……
  • 深入了解美团叶子发射器开源方案
    0阅读 0条评论 个赞
    大家好,我是树哥。之前我们有聊过「如何设计一个分布式ID发号器」,其中有讲过4种解决方案,分别是:UUID类雪花算法数据库自增主键Redis原子自增美团以第2、3种解决方案为基础,开发出……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • SQL Server联接方式
    0阅读 0条评论 个赞
    0.参考文献MicrosoftSQLServer企业级平台管理实践看懂SqlServer查询计划1.测试数据准备参考:SqlServer中的表访问方式TableScan,IndexScan……
  • 2022数字技能职业教育生态研讨会
    9阅读 0条评论 个赞
    职业教育是国民教育体系和人力资源开发的重要组成部分。发展职业教育,已经成为世界各国应对经济、社会、人口、环境、就业等方面挑战,实现可持续发展的重要战略选择。中国职业教育源远流长,师徒制教学有着悠久的……
  • 自动化测试选择Python还是Java?
    0阅读 0条评论 个赞
    你好,我是测试蔡坨坨。今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言。前言自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发展的趋势。……
  • 谈谈我是如何学习SQL Server的
    0阅读 0条评论 个赞
    谈谈我是如何学习SQLServer的相信很多人都想做大牛,但是你们知道这些大牛是怎样炼成的吗?我的一个同事做了差不多10年的.NET开发,算得上是大牛了吧?如果他遇到他熟悉的项目很快就能手到拿来,立……
  • SQL SERVER存储过程学习笔记
    6阅读 0条评论 个赞
    将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。存储过程的优点1.存储……
  • 金牛座入门 MVC微服务框架开发教程:项目部署:4 微服务应用发布到Docker进行部署
    0阅读 0条评论 个赞
    前言:本篇教程,演示ASP.NETCore微服务应用程序,如何最简方式发布到Docker中部署,并运行起来。新手两个简易概念:1、映像:可以理解为Class,用于定义;2、容器:可以理解为Clas……
  • Python自学教程7:字典类型有什么用
    0阅读 0条评论 个赞
    字典是Python中的一个重要操作,如果字典玩得顺,很多其他的数据类型就可以一通百通。Python字典的定义字典使用一对大括号进行定义,键值对之间使用逗号隔开,键和值使用冒号分隔。键必须是不可变类型,……
  • 内存泄漏——原因、避免和位置
    0阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • 新一代网络请求库:python-httpx库
    0阅读 0条评论 个赞
    目录httpx库一、概述1、简介2、命令行模式3、快速开始3.1get请求3.2post请求3.2.1表单3.2.2文件3.2.3JSON3.2.4二进制3.3响应处理3.4流……
  • ASP.NET核心6框架揭示示例演示[34]:缓存整个响应内容
    0阅读 0条评论 个赞
    我们利用ASP.NET开发的大部分API都是为了对外提供资源,对于不易变化的资源内容,针对某个维度对其实施缓存可以很好地提供应用的性能。《内存缓存与分布式缓存的使用》介绍的两种缓存框架(本地内存缓存和……
  • python的环境,你再也不用愁康达
    1阅读 0条评论 个赞
    CondaGuideConda简介conda是一个包,依赖和环境管理工具,适用于多种语言,如:Python,R,Scala,Java,Javascript,C/C++,FORTRAN……
  • 全志A40i核心板全国产化 照亮动力设备国产化之路
    1阅读 0条评论 个赞
    国产化三个字近几年来在电力行业内很火,新的设备、新的项目都开始有国产化的趋势,要求自主可控,然而很多人只是泛泛地去看待“国产化”这三个字而没有去深究它的重要性。自主可控有多重要?今天,我们就来认真地聊……
  • 【高并发】从源码角度深入分析线程池如何优雅退出
    0阅读 0条评论 个赞
    大家好,我是冰河~~在【高并发专题】中,我们从源码角度深度分析了线程池中那些重要的接口和抽象类、深度解析了线程池是如何创建的,ThreadPoolExecutor类有哪些属性和内部类,以及它们对线程池……
  • 基于iframe的微前端框架——青田
    33阅读 0条评论 个赞
    vivo互联网前端团队-JiangZuohan一、背景VAPD是一款专为团队协作办公场景设计的项目管理工具,实践敏捷开发与持续交付,以「项目」为核心,融合需求、任务、缺陷等应用,使用敏捷迭代、小……
  • SQL Server 2005分区模板和实例
    0阅读 0条评论 个赞
    一、场景这一段时间使用SQLServer2005对几个系统进行表分区,这几个系统都有一些特点,比如数据库某张表持续增长,给数据库带来了很大的压力。现在假如提供一台新的服务器,那么我们应该如何规划……
  • 数字人技术在直播场景中的应用
    0阅读 0条评论 个赞
    作者|薄志浩导读introduction本文介绍了在数字人AI技术发展迅猛,整体AI数字人市场呈现高速增长的趋势下,与强调高实时性互动的直播业务场景的结合与应用,通过数字人渲染技术、强大的AI全栈能……
  • 适时变革 共创未来| 2022数字技能职业教育生态研讨会圆满落幕
    0阅读 0条评论 个赞
    2022年8月25日,由恒利联创主办的“适时而变,联创未来”2022数字技能职业教育生态研讨会在线上举行。本届大会围绕“数字技能职业教育和数字化人才培养”的话题,邀请了Oracle技术人才发展部总经理……
  • 《2022 分布式数据库发展趋势研究报告》的解释
    9阅读 0条评论 个赞
    分布式数据库近年来广受关注,目前,对分布式数据库的讨论,已经从什么是分布式数据库,为什么要用分布式数据库,转变为怎样规划应用分布式数据库。但分布式数据库有3条不同的技术路线,这无疑增加了选型难度,到底……
  • 数据仓库及其维度(层次)建模(ODS DWD DWS DWT ADS)
    0阅读 0条评论 个赞
    一.数仓及其维度1.什么是数仓?数据仓库,简称数仓,(DataWarehouse)。从逻辑上理解,数据库和数仓没有区别,都是通过数据库软件实现存放数据的地方,只不过从数据量来……
  • 面试官:为什么系统不推荐双写?
    0阅读 0条评论 个赞
    某日,阿雄跑去面试!于是有如下情形面试官:"阿雄是吧,做做自我介绍!"阿雄:"我叫阿雄,来自某a国际电商公司!"面试官:"我看你项目里用了elasticsearch,你是怎么同步数据的呢?"阿……
最近发布资讯
更多