写点什么

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

  • 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:303303

评论

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

从偶然邂逅到深度热爱

TiDB 社区干货传送门

社区活动 学习&认证&课程

下班时刻的私人专访|PingCAP 九周年纪念日这一天,我问了表妹九个问题

TiDB 社区干货传送门

人物访谈

HTML API 设计指南:打造高效、可维护的接口

Apifox

JavaScript html 程序员 前端 HTML API

DCDN连接云和用户:加速企业全球拓展之旅

MasterInTech

阿里云 CDN

前端代码规范 - 图片相关

南城FE

前端 代码规范 图片优化

解锁阿里巴巴1688数据宝藏:API助力批量获取商品价格、标题、图片及库存

技术冰糖葫芦

API boy api 货币化 pinduoduo API

TiDB 监控告警高可用

TiDB 社区干货传送门

TIUP离线镜像管理

TiDB 社区干货传送门

安装 & 部署

NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL

汀丶人工智能

自然语言处理 NL2SQL NL2DSL

NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解

汀丶人工智能

自然语言处理 大语言模型 NL2SQL

TiDB 8.0 新特性尝鲜

TiDB 社区干货传送门

版本测评 新版本/特性解读 8.x 实践

AmzTrends x TiDB Serverless:通过云原生改造实现全局成本降低 80%

TiDB 社区干货传送门

实践案例

🔥🔥httpsok-快速申请谷歌SSL免费证书

物有本末

nginx https SSL证书 SSL/TLS 协议 HTTPSOK

架构思考随笔 - 回归单体架构?

小粽

深入解析decltype和decltype(auto)

爱分享

代码优化 C++11 C++ modern C++ C++14

TiProxy 问题解答 & 未来规划

TiDB 社区干货传送门

新版本/特性发布 新版本/特性解读 数据库连接 8.x 实践

🔥🔥v1.9.2-httpsok快速申请免费谷歌SSL证书

物有本末

nginx https TLS SSL证书 HTTPSOK

利用Python实现数据可视化

技术冰糖葫芦

API Explorer API boy api 货币化

TiDB启动:职业生涯新阶段

TiDB 社区干货传送门

社区活动 学习&认证&课程

社区声音:恭喜 TiProxy 组件 GA!

TiDB 社区干货传送门

版本测评 8.x 实践

干掉DBA!产品经理运维 TiDB,用非技术手段攻克技术挑战

TiDB 社区干货传送门

管理与运维

小镇做题家,成为交大学科创始人,为什么还要来做制造?人工智能怎么用在制造业?

工赋开发者社区

BOE(京东方)2024年一季度净利润预计8亿元-10亿元,三位数增长叩响高质量发展“开门红”

科技热闻

碳视野 | 今后五年国家重点支持三类双碳项目!

AMT企源

数字化转型 双碳 碳管理

LigaAI x 极狐GitLab,共探 AI 时代研发提效新范式

LigaAI

人工智能 DevOps 极狐GitLab LigaAI 研发效能管理

即时通讯技术文集(第36期):《跟着源码学IM》系列专题 [共12篇]

JackJiang

即时通讯;IM;网络编程

tidb 6.1.4 table cache 导致的集群QPS异常问题

TiDB 社区干货传送门

集群管理 管理与运维 故障排查/诊断 6.x 实践

TIKV分布式事务简介

TiDB 社区干货传送门

TiKV 底层架构 学习&认证&课程

TiDB 迁移上云实践(一)之自建MySQL

TiDB 社区干货传送门

迁移

IaC 管理新思路:Walrus 和 Terraform 的差异化探索

SEAL安全

运维 云原生 IaC Terraform Walrus

工刻·标杆工厂探秘之旅:开启卓越成长之路

工赋开发者社区

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