Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

1.引言

产品要求的功能都都开发完了,但这并不是终结。怎么样做才能让我们的服务具有更好的质量。
笔者结合自己的遇到的问题和工作中的经验,并以提问的方式,给读者一点点建议

2. 提问

重要性不分先后

2.1 如果服务器重启,服务是否能自动拉起?

2.2 如果程序异常退出,服务是否能够自动拉起?

2.3 如果程序异常退出,能够自动拉起,那么你怎么知道服务是否发生了重启?

2.4 如果是web服务,QPS是多少?每个URL的QPS是多少?

峰值是多少?一般在什么时间点触发?
每种URL的请求量是否合理?

2.5 如果是web服务,每个请求的响应时间是多少?TP90?TP99分别是多少?

2.6 异常请求(比如HTTP非200的比例是多少?)什么样的比例是合理的?为什么?

2.7 如果是多实例部署,那么整个系统的承载极限是多少?如果达到了极限,瓶颈在哪儿(木桶原理中所谓的短板)

2.8 服务都有哪些依赖项(微服务/数据库/文件系统)

其中哪些是无状态的,哪些是弱状态的,哪些是强状态的。这些外部服务和系统,是否已经做到高可用?能否做到快速扩容?

2.9 服务消耗的带宽多少?是否有可能达到带宽上限

如果是面向公网的服务,请求是否已经进行了压缩?

2.10 服务在部署上,是否已经做到了二地三机房

每个地区的网络线路,是否能做到2套或2套以上
(防止光纤被挖断的情况)

2.11 DNS服务是否能够对后端服务进行探活,自动修改域名的解析列表

2.12 部署是否实现了自动化

如果服务需要紧急扩容,该怎么做?
基于docker的容器化方案,还是ansible脚本?

2.13 文档是否完整,文档是否能与代码保持一致

2.14 如果是比较复杂的业务系统,是否有完整的自动化测试脚本

2.15 如果使用了数据库,比如用到了Redis/MySQL

Redis连接池和MySQL连接池,是否已经打满(达到最大的poolSize)
打满之后,程序是会等待,还是报错?

2.16 如果使用了Redis,每次Redis操作的耗时是多少?TP90?TP99?

有没有慢查询?这些慢查询是否合理?

2.17 如果使用了MySQL,SQL是否做过审核

哪些表的操作频率最高?那种类型的操作最多?
有没有慢查询?这些慢查询是否合理?
有没有联表过多的查询?

2.18 如果使用了cache,cache的命中率是多少?cache容量是否达到上限?

cache会不会与数据库存储不一致,不一致是否可以容许
cache的容量是否达到上限,是否已经触发了LRU

2.19 如果使用了负载均衡,负载均衡与服务之间是长连接吗?

如果服务和其它服务有交互,他们之间是长连接吗?

2.20 服务所在机器CPU负载怎么样?连接数高吗?

是否有大量的TIME_WAITCLOSE_WAIT

2.21 是否做了tracing

2.22 是否记录了access log

2.23 服务是否能够优雅退出?

2.24 服务如果是异常退出,是否会造成数据不一致?

如果有可能造成不一致,那么如何发现这种不一致?有没有对应修复的策略
比如在交易系统中的定期对账

2.25 这个服务中,哪些部分是最核心的,是否能做熔断降级处理

比如一个新闻客户端,如果出现服务出现故障,可以降级为新闻只读,但是无法评论

2.26 如果是API服务,有没有对请求做超时处理

防止请求一直阻塞。

2.27 如果调用方是APP,那么是否在APP中,埋有探针,以便日后分析排障

2.28 数据库有没有定期备份?

如果已经做了备份,是否是备份在异构的数据库中

2.29 如果是API服务,是否有请求频率限制

如果有是按照用户维度,还是按照IP维度来限制?

2.30 如果是消息队列中间件,或者是数据库,那么Page Cache的命中率怎么样?

2.31 在内存占用较多的情况,Buffer Cache被谁使用了?

2.32 如果是Java和Golang语言编写的程序,GC的情况怎么样?

GC的耗时情况是怎样的?
GC消耗的CPU在总的CPU时间中的占比是多少?
GC的频率情况?
如果是Java的话,Full GC的时间有多长?
如果是Golang的话,STW(PauseNs)的时间有多长?

后记

2021年12月3日 ebpf能够监控内核函数调用请求,能够观测到的指标更多了。


请我喝瓶饮料

微信支付码

1 对 “开发更高质量的服务”的想法;

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据