阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

完美日记的微服务实践和优化思路

  • 2019-12-18
  • 本文字数:3055 字

    阅读完需:约 10 分钟

完美日记的微服务实践和优化思路

如果你是一位程序媛,你一定知道完美日记。


如果你是一位程序员,你的那个她一定知道完美日记。


今年双 11,完美日记仅用 28 分钟就超过了 2018 年双 11 全天的销售额,成为第一个登上天猫双 11 彩妆榜首的国货品牌。在这个遍地都是漂亮小姐姐、号称男人(特指程序员)天堂的公司里,拥有着一支什么样的基础架构技术团队,他们是如何在 4 个月内筹建、上线电商平台的呢?本文将为您分享他们在实践微服务过程遇到的难点和优化思路。


完美日记基础架构技术团队欢迎您的加入,移步文末,了解详情。

起步

自建商城在设计之初,业务部门就提出了两个要求:不崩 & 快速上线


在立项之后,团队还没有完全配备好,一边从其他团队里调取人手,一边大力招聘,与此同时,我们的架构师也在搭建一套分布式商城开发框架,编写 Demo,让新加入的同学能快速上手。

暴露问题

问题一:分布式事务


为什么会使用分布式事务?


这个暂且可以归因于快速上线,因为生成订单会调用到商品服务扣减库存,使用了分布式事务解决了因为跨服务调用引起库存超卖的问题,带来的问题就是性能上的消耗。


问题二:数据库压力


在大促活动期间,有个实时统计是直接从业务库上直接查询统计的,运营部门的小姐姐在不断地刷新,导致该接口上的压力山大,而且没有使用缓存,连 SQL 查询条件的时间都是动态的,导致 DB 层的缓存也使用不上,每次请求都打到 DB 上。


开发和测试环境是使用自建的 MySQL,生产环境使用的是 PolarDB,从阿里云官网上看到:


  • 集群架构,计算与存储分离

  • 读写分离


我们主观地认为,只要我们使用了集群连接地址就会自动进行读写分离,但是实际上并没有,后来发现在方法上显式的指定只读事务就有请求走到只读节点上了。@Transactional(readOnly = true)


优化思路


1)从 SQL 洞察和慢 SQL 里找调用响应时间最长和频度最高的 SQL;


2)结合代码,能用缓存代替的直接处理掉,不用能缓存的优化查询,结合阿里云提供的优化分析工具,调整索引;


3)活动高峰时段,禁止分析统计类的查询执行,临时改代码已经来不及了,幸亏 AHAS(阿里云的一款限流降级产品) 的接口限流和 SQL 限流功能;


4)TP 和 AP 分离,避免分析类直接查询到业务库(这是一个比较漫长的过程)。


问题三:缓存压力


除了前面所提到的分布式事务之后,发现还有同事写了使用 Keys 模糊查询 Redis,直接导致 Redis 的 CPU 飙升严重,通过阿里云提供的 Redis 管理工具可以很方便地查看到有哪些慢查询。


另外一个低级错误,我们相信应该不是第一个,也不会是最后一个,本来要设置一个 Key 的过期时间,结果少写了个 Unit 参数,第三个就变更偏移量了。


redisTemplate.opsForValue().set(key, value, offset)
复制代码


为什么我们花了 10 分钟左右才解决?


1)惯性思维,review 代码没发现出来;


2)在错误日志里发现 Redisson 锁失败时,怀疑是 Redis 写满了;


3)使用阿里云的工具去查大 Key 时发现了 Key 很大,但是直接在网页查看值的时候只看到保存了一个字符,问题就出在这里,因为 RDS 管控台里获取到的值看起来是正确的,大概又过了 2 分钟左右,我觉得不太对劲,然后登录上去用 redis-cli 查看,傻眼了,里面塞满了 0x00。



问题四


商城上线当月有一个促销活动,因为瞬间进来的流量过大,小程序前端埋点事件上报的接口连接数爆了,商城实时数据统计调用了流量统计服务的接口,然而服务调用超时时间设置的是 60s,导致过多请求积压,CPU 突然飙升得很厉害。


优化思路


1)充分利用 Nginx 的并发处理能力,Lua 脚本提供了强大的处理能力,将 Java 处理请求改为使用 OpenResty 接收;


2)接收到请求之后做好基本的校验之后,使用 lua-resty-kafka 模块异步发送到 Kafka;


3)Kafka 落盘到 HDFS 后,由 Spark 离线计算日志数据;


4)后端接口独立部署,实时数据统计调用接口设置更短的超时时间;


经过以上改造之后,前端日志上报服务单机处理能力由原来的 1K 提升 40K,那种如丝般顺滑的体验实在是太好了。

迭代

从当时的情形来看,针对双 11 的活动做大动作调整代码优化基本上是来不及了,离活动还有不到两个星期的时间,即便改了,风险也很高。


1、压测


作为一个新上线的项目,数据量还比较小,使用云服务来搭建一套 1 比 1 的压测环境还是比较容易的,在这个时间节点上,我们需要模拟真实的场景摸清楚目前的系统能承受多大的压力,需要多少机器。


阿里云上有个 PTS 的压测工具,可以直接导入 Jmeter 脚本,使用起来很方便,接下来说说我们的使用步骤:


1)先是按过往一个月的用户行为日志里,找出用户的路径和每个行为的思考时间,做了一个大概的模型;


2)按照双十一活动的运营节奏,定义了两到三个场景;


3)使用 ECS 搭建 Jmeter 集群,内网对接口进行施压,目的是减少网络开销,让请求都能打到后端服务器上;


4)观察服务器的压力,调节应用内存分配,再通过 PolarDB 性能分析,找出有性能瓶颈的 SQL 尽可能地优化掉;


5)将 Jmeter 脚本导入到 PTS,关联上数据库和 ECS 机器的云监控,设置好思考时间等相关的参数后施压,可以动态秒级调整压力,生成的压测报告就是我们想要的结果,需要拿这个结果来进行下一步的限流控制。


2、限流


1)在接入 AHAS 过程中,由于微商城项目当前版本接入的是 spring-cloud-alibaba-dependencies-0.9.0.RELEASE 版本来使用阿里云的 OSS 与 SMS,在接入 AHAS 后,需要对依赖 Alibaba 版本的升级,涉及包括 Nacos 配置中心与服务发现的升级和包路径的命名变更修改;


2)在接入 AHAS 的 gateway 网关路由限流,采用的是 SDK 接入方式,AHAS 采用了符合 springboot-starter 特性的 SDK 开发,这样在我们微商城接入 gateway 时只需要在项目 POM 中加入 spring-cloud-gateway-starter-ahas-sentinel,在接入 gateway 的时候发现,网关路由限流采集上传的 API 出现了没有兼容 Restfull 风格 API 的问题,导致 URL 上出现参数时多个 url 没有合并一起的情况,阿里云 AHAS 支持团队立即发布 Fix 版本,提供新的 SentinelWebInterceptor 拦截器进行清洗 Restful 风格 API 处理;


3)在接入 AHAS 的应用模块限流,采用的也是 SDK 接入方式,在按官网文档进行接入的时候,发现我们微商城采用的是最新版本的 Mybatis Plus 版本,在接入 SQL 限流分析功能时发现出现 ahas 报错,在将此反馈到 ahas 钉钉团队支援群后,当时已经差不多凌晨一点了,ahas 团队的及时响应以及第二天早上就发布了兼容 Mybatis Plus 版本的 SQL 限流分析版本给到我们微商城,在我们接入新版本后,SQL 分析和限流功能也能正常使用了;


4)在使用 AHAS 接入的时候,发现 AHAS 除了接口的 API 限流功能外,还提供了 CPU/Load 的限流,对服务器性能情况的监控和保护做了很好的护航,在微商城服务器压力过高时能够很好的保护服务器不被高并发压垮,保证了服务的高可用,同时在服务器压力大的时候,做到了实时 QPS 日志上传的隔离,避免上传抢占服务器资源,保证了服务器在接入 AHAS 后也能保持良好的性能。

未来

未来计划要做的事情


1)按服务拆分 Redis;


2)数据库读写分离、分库分表、TP/AP 分离;


3)业务中台化:建立业务中台,打通商品中心、库存中心、用户中心和交易中心;


作者介绍


庄工:逸仙电商架构师 &技术委员会负责人,负责完美日记商城基础架构和微服务体系建设。


关工:逸仙电商后端技术专家,现主要参与微商城后端框架集成方案、以及性能调优和微商城技术规范管理。


唐工:逸仙电商技术经理,曾先后就职于中国航信和唯品会,现主要负责前后端技术统筹等打杂工作。


本文转载自公众号阿里巴巴中间件(ID:Aliware_2018)。


原文链接


https://mp.weixin.qq.com/s/UjeAfZVz0l_-qyjyVYkB7A


2019-12-18 09:303095

评论

发布
暂无评论
发现更多内容

灵活预算,畅享高性能!月付香港主机助你建设理想网站!

一只扑棱蛾子

香港主机

数智底座成竞争焦点,用友能否再创辉煌?

用友BIP

数智底座

探索学习Hypermesh的有效方法

智造软件

CAE CAE软件 Hypermesh 结构分析软件 学习教程

Debian11系统编译安装Nginx教程。

百度搜索:蓝易云

nginx 云计算 Linux 运维 Debian

微信朋友圈广告代理 朋友圈广告 信息流广告加盟

吴老师讲业

信息流 微信朋友圈广告代理

Perforce Helix Core新版本推出资源压力感知功能,提升服务器可用性,助力大规模开发

龙智—DevSecOps解决方案

版本控制 版本控制系统

什么是DevOps监控以及如何在组织中实施?

互联网工科生

DevOps 运维工具

PEPE的二代分叉币PEPEP空投和预售正式开启

新消费日报

一文了解什么是ISO 9001认证,以及在静态分析和代码质量领域有哪些通过此认证的工具

龙智—DevSecOps解决方案

代码扫描 静态代码分析 代码分析

何为低代码?何为高代码?

互联网工科生

软件开发 低代码 JNPF 高代码

一文了解JNPF低代码开发平台

高端章鱼哥

低代码 低代码开发 JNPF

补齐OLAP引擎短板!ByteHouse 是如何实现流批一体的?

字节跳动数据平台

数据库 大数据 云原生 数仓 企业号 7 月 PK 榜

如何通过三级缓存解决 Spring 循环依赖

江南一点雨

Java spring

DevOps | 产研协同效能提升之评审、审批流、质量卡点

laofo

DevOps 研发效能 持续集成 持续交付

六步带你体验EDS交换数据全流程

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

大模型时代,科技企业入局能源行业需要新范本

TE智库

新能源 特斯联

大型民营集团如何构建全面预算管理体系?

用友BIP

全面预算

亚马逊云科技与英矽智能合作,利用人工智能技术加速新药研发

Lily

浅谈生成式人工智能

天翼云开发者社区

人工智能

从Istio在CNCF毕业,看服务网格的架构变迁

博文视点Broadview

为什么强调数智底座能力?

用友BIP

数智底座

用友BIP:助力企业数智化转型,实现数智化国产替代

用友BIP

国产替代

AI成为“老师傅”,1份图谱揭露资产故障真因

用友BIP

AI

Debian11系统编译安装PHP教程。

百度搜索:蓝易云

php 云计算 Linux 运维 Debian

IPQ6010 and IPQ6018 what's the difference?|802.11AX WIFI6 Solution|DR6018

wallyslilly

今年值得学习的五种最吸金的编程语言

这我可不懂

Python JavaScript 编程语言

完美日记的微服务实践和优化思路_架构_逸仙电商_InfoQ精选文章