热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微服务优化日记

自建商城在设计之初,业务部门就提出了两个要求:不崩&快速上线。在立项之后,团队还没有完全配备好,一边从其他团队里调取人手,一边大力招聘,与此同时,我们的架构师也在搭建一套分布式商城

 

 

 

 

 

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

在立项之后,团队还没有完全配备好,一边从其他团队里调取人手,一边大力招聘,与此同时,我们的架构师也在搭建一套分布式商城开发框架,编写 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 后也能保持良好的性能。

参考:完美日记分享


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 数据库锁的分类和应用
    本文介绍了数据库锁的分类和应用,包括并发控制中的读-读、写-写、读-写/写-读操作的问题,以及不同的锁类型和粒度分类。同时还介绍了死锁的产生和避免方法,并详细解释了MVCC的原理以及如何解决幻读的问题。最后,给出了一些使用数据库锁的实际场景和建议。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
author-avatar
菜蔸蔸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有