关于性能优化的一些实践

2

背景

在海量并发业务的场景下,比如电商抢购、微信红包这样的场景下,我们经常会遇到各种各样的性能问题,在应对这些问题的时候,应该有怎样的方法论去指导我们解决问题,基于这几年的开发经验,做一个简单的分享。性能优化包含两个方面的理解:

  • 业务层面的性能优化

  • 框架层面的性能优化

在比较大的互联网公司中,一般不会直接使用开源的框架做业务开发,这里就涉及到框架的性能问题,一般的框架都需要解决几个问题

  1. 锁的粒度,在高并发的请求处理中,都需要解决输入输出队列的锁的问题,这是一个演化的过程,从古老的文件锁,到现在的无锁循环队列,对框架的处理性能是有质的飞跃

  2. 调度的粒度,在TX,比较老的框架,其实一开始都是多进程的框架,后面才慢慢有了多线程,以及后面的微线程的框架,越来越小的调度代价,减少内核态和用户态的切换,能够有效的带来性能的收益。

  3. 拷贝的次数,一个请求,从请求进入之后,经历过几个流程的处理,经历了几次的内存拷贝,对整个框架的性能也有比较大的影响

技术手段

不过,本文不讨论框架层面的性能优化,更多的是介绍业务层面的相关技术手段

  • 前端保护后端

  • 业务流程解耦(异步化)

  • 数据库分库分表

  • 柔性可用,可降级

  • Set化部署

以上技术手段在MY微信红包中的具体实现

1.前端保护后端

在高并发的场景中,瞬间的并发量是非常大的,因此请求应该呈现一个漏斗型往下递减

所以,我们在前端CGI层利用缓存(如redis、memcache等)做了一些优化,比如在抢红包的场景中,用redis存储红包剩下的个数,每个人是否抢过这个红包这些标识, 尽量只让真正可以抢红包的请求通过CGI层落入逻辑层,快速的过滤掉不合理的请求。

在前端,我们一般用CDN(或者类似的数据靠近服务)做前端页面的加速;

接入层作为后端的第一个模块,接收最多的请求,一般的优化方式有合并请求,数据预加载等,在云监控的场景中,前端接入层需要接收大量的数据点,需要屏蔽无效的数据点,这里就会有数据预加载的请求,将接入的信息(变更频率很低)预加载到内存中,请求进来之后根据内存中的预存储数据做数据的过滤。

2.业务流程解耦

在业务开发过程中,我们经常会遇到耗时的场景,比如在抢红包入账的场景中,入账的操作是一个事务,耗时比较长,放在核心流程中,会影响整体的吞吐量,或者是在监控数据上报的场景中,后续的数据梳理和告警判断都是很重的业务逻辑,这就需要我们去解耦这个流程,利用消息队列对这个入账的流程或者其他的处理流程进行解耦,保证并发量 ,如下图,是笔者最近开发的事件中心架构,就用到CKafka做业务的解耦

事件中心架构

3. 数据库分库分表

分库分表作为一个比较老的手段,依然是很有效的增加并发能力的方法(因为我们很多不经意的查询或者更新都会导致锁表)。例如在红包的根据红包ID,将红包落入不同的表中,这样在抢红包的场景中,DB的锁的压力就分散到各个表中,这里如何做分表是调优的关键,核心思想就是均匀的分配数据。

本身如何均匀的做数据分配也是一个比较难的问题,我们在监控数据的存储中,也会遇到这样的问题,监控的数据一般会用KV存储,基于LSM的HBASE和在这个基础上做了优化opentsdb是比较主流的选择,opentsdb不仅针对时序数据的特点做了优化,同时,针对rowKey的生成方式也做了比较多的改进,避免数据分布不均导致数据热点的产生,这里不展开讨论。

4. 柔性可用,过载保护可降级

在数据层发生灾难、系统负载高的情况下,保证业务的最核心流程可用,牺牲一些用户体验来达到系统的稳定。例如对抢红包的返回结果进行降级,不返回红包列表等,只让用户看到自己抢的红包的结果。

基于业务优先级的过载保护

5. Set化部署

以最近参与的云监控项目为例,腾讯云现在的地域非常广,最新的地域现在在俄罗斯(欢迎试用),海外地域到国内的数据延迟一般在300ms以上,这就要求我们在所有地域都有Set去做就近接入,减少因为网络延迟带来的影响,云监控现在在每个地域都是单独部署,只有告警发送模块等少量服务是集中部署的

set化部署

结论

工作接近五年,前面的三年多的时间一直从事的是2C产品的开发,经历过苦哈哈的计算内存空间的时候,因为2C的数据体量远比2B的产品要大,TX以前的A/B/C的服务器性能也一般(从现在看来),在这种场景下成长起来的程序员都会比较抠门,更多的去想如何节省机器,当然现在我觉得也是有一定参考价值的,希望对你有用

关于性能优化的一些实践相关推荐

  1. Flutter Web 在《一起漫部》的性能优化探索与实践

    一起漫部 是基于区块链技术创造的新型数字生活. 目录 前言 开发环境 渲染模式 首屏白屏 优化方案 启屏页优化 包体积优化 去除无用的icon 裁剪字体文件 deferred延迟加载 启用gzip压缩 ...

  2. 让数据中台飞起来—— Quick BI性能优化解决方案及实践

    Quick BI"数据门户"在企业数据中台建设中的重要性 企业在数据中台初步建设完成以后,怎样让客户直观感受到数据中台的价值?企业决策者.各部门管理人员.业务运营人员如何通过统一的 ...

  3. FlutterWeb性能优化探索与实践

    点击"开发者技术前线",选择"星标" 让一部分开发者看到未来 来自:美团技术团队 美团外卖商家端基于 FlutterWeb 的技术探索已久,目前在多个业务中落地 ...

  4. 让数据中台“飞“起来— Quick BI性能优化解决方案及实践

    1 引言 Quick BI"数据门户"在企业数据中台建设中的重要性 企业在数据中台初步建设完成以后,怎样让客户直观感受到数据中台的价值?企业决策者.各部门管理人员.业务运营人员如何 ...

  5. Java 性能优化实战工具实践:如何获取代码性能数据?

    首先解答一下上一课时的问题.磁盘的速度这么慢,为什么 Kafka 操作磁盘,吞吐量还能那么高? 这是因为,磁盘之所以慢,主要就是慢在寻道的操作上面.Kafka 官方测试表明,这个寻道时间长达 10ms ...

  6. 京东微信购物性能优化,最佳实践总结!

    京东微信购物首页(以下简称微信首页)曾经作为微信购物一级入口(目前替换为京喜小程序)一直对性能有着极高的要求,本文将介绍微信首页的一些优化经验. 一般来说产品是按以下方式进行迭代的,我认为循环的起点应 ...

  7. 一文了解 NextJS 并对性能优化做出最佳实践

    点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流群 引言- 从本文中,我将从是什么,为什么,怎么做来为大家阐述 NextJS 以及如何优化 NextJS 应用体验. 一.NextJS是什么- ...

  8. 谷歌浏览器LightHouse性能优化分析神器实践运用

    1 基本操作介绍 1.1 入口 打开最新版本Google Chrome,F12一下弹出开发者页面,在顶部的导航栏选项选择Lighthouse选项(旧版本的浏览器是需要从应用商店下载Lighthouse ...

  9. 读jquery 权威指南[7]-性能优化与最佳实践

    一.优化选择器执行速度 1. 优先使用ID选择器和标记选择器 使用选择器时应该首选ID选择器($("#id")),其次是标记选择器($("div")),最后再选 ...

最新文章

  1. 2020自然指数重磅发布:中科院第一,中国科大、北大跻身前十
  2. C语言十进制转换成二进制源码
  3. CVE-2019-14287(sudo提权)
  4. 2021“MINIEYE杯”中国大学生算法设计超级联赛(5)Random Walk 2(推式子+矩阵逆+矩阵乘)
  5. 英特尔cpu发布时间表_英特尔10nm芯片开始大规模出货,先进制程时间表浮出水面...
  6. 计算机主机声音怎么办,电脑主机声音大怎么解决 电脑主机嗡嗡响是怎么回事...
  7. 我的世界SkyPixel像素天空HTML官网源码
  8. community 计算模块度_燃气模块炉使用信息采集表
  9. 软件评测-信息安全-应用安全-资源控制-用户登录限制(上)
  10. System.IO.Directory.Delete 方法的使用
  11. 安装IIS服务 找不到staxmem.dll文件的解决方法
  12. python程序实例 100-python办公实例100例
  13. SQL读取系统时间的语法(转)
  14. 杂项7 - Kali的截图键PrtSc
  15. 阿里云acp考试简介,以及考试准备与攻略
  16. CSV格式文件向安卓小米手机中导入通讯录
  17. php ecb加密,PHP使用TripleDes,PKCS7和ECB加密/解密
  18. spring容器的懒加载lazy-init设置
  19. 初学者-CSS思维导图(下)
  20. Vue中使用dayjs

热门文章

  1. c++ 项不会计算为接受 0 个参数的函数_OFFSET函数从入门到进阶之进阶操作篇(与MATCH组合)...
  2. 物联网-移柯L206模块TCP开发(基于STM32+AT命令)
  3. 初始化跟路由相关的定时器
  4. libevent源码深度剖析六
  5. 魅蓝2 刷 android,魅蓝2全系列-解锁BootLoader完整版+刷入第三方recovery+刷入第三方ROM教程...
  6. 【LeetCode】【HOT】297. 二叉树的序列化与反序列化(BFS)
  7. 合并有序数组java
  8. deepin Linux vscode 配置C++环境
  9. 在eclipse上搭建springBoot
  10. 二叉树 | 根据前序、后序生成中序