关于性能优化的一些实践

背景

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

  • 业务层面的性能优化
  • 框架层面的性能优化

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

  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的服务器性能也一般(从现在看来),在这种场景下成长起来的程序员都会比较抠门,更多的去想如何节省机器,当然现在我觉得也是有一定参考价值的,希望对你有用

原文发布于微信公众号 - IT技术精选文摘(ITHK01)

原文发表时间:2018-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

微软拥抱Linux,为时已晚?

今日,微软发布了一系列有关Linux的功能。首先,SQL Server支持Linux了,一周之后,微软宣布“原生的Linux二进制文件可以运行在Windows1...

25080
来自专栏微服务

电商前端交易型系统设计原则

个人认为设计系统要因场景因时间而异,一个系统不是一下子就设计的非常完美,在有限的资源情况下一定是先解决当下最核心的问题,并预测/发现未来可能出现的问题,一步步解...

10810
来自专栏腾讯云数据库(TencentDB)

腾讯自研新一代企业级云数据库CynosDB,打破安迪-比尔定律,释放硬件红利!

CynosDB是腾讯云自研的新一代高性能高可用的企业级分布式云数据库。融合了传统数据库、云计算与新硬件的优势,100%兼容开源数据库,百万级QPS的高吞吐,不限...

2.7K70
来自专栏云计算D1net

云存储比你的电脑或外部驱动器更好?

什么是云存储? 云存储,就是可以向你的数据存储在远端的服务器上。 这意味着你可以通过远程存储如文档,照片,音乐和视频等数据,而不必占用物理空间或家里和公司的计算...

29650
来自专栏开发者

关于性能优化的一些实践

在海量并发业务的场景下,比如电商抢购、微信红包这样的场景下,我们经常会遇到各种各样的性能问题,在应对这些问题的时候,应该有怎样的方法论去指导我们解...

28540
来自专栏织云平台团队的专栏

8分钟丨教你玩转 API

28720
来自专栏IT大咖说

XpmJS —— 小程序后端开发思考和实践

摘要 Linux容器技术很早就有,LXC的容器方案也早2008年就已面世;但直到 2013年 Docker 推出,才让容器技术红遍全球。Docker 没有高深底...

45160
来自专栏企鹅号快讯

分布式架构的套路No.74

今天小蕉跟大伙一起聊聊分布式系统的架构的套路。在开始说套路之前,大家先思考一个问题,为什么要进行分布式架构? 大多数的开发者大多数的系统可能从来没接触过分布式系...

39190
来自专栏NetCore

对于大数据大流量情况下微软架构的水平扩展的遐想(瞎想)

最近回顾SAAS的书籍,书中的扩展架构都有点让我痴迷,但书中介绍的都是以Java,Apache,JBoss,Hadloop等技术实现负载均衡,大数据处理,对于微...

23280
来自专栏Java后端技术栈

漫谈分布式架构的几种套路

今天小蕉跟大伙一起聊聊分布式系统的架构的套路。在开始说套路之前,大家先思考一个问题,为什么要进行分布式架构?

11310

扫码关注云+社区

领取腾讯云代金券