改造完成后,小明和小红分清楚各自的锅 。两人十分满意,一切就像是麦克斯韦方程组一样漂亮完美 。
然而……
04 没有银弹春天来了 , 万物复苏,又到了一年一度的购物狂欢节 。眼看着日订单数量蹭蹭地上涨,小皮小明小红喜笑颜开 。可惜好景不长,乐极生悲 , 突然嘣的一下,系统挂了 。
以往单体应用,排查问题通常是看一下日志,研究错误信息和调用堆栈 。而微服务架构整个应用分散成多个服务,定位故障点非常困难 。小明一台机器一台机器地查看日志 , 一个服务一个服务的手工调用 。经过十几分钟的查找,小明终于定位到故障点:促销服务由于接收的请求量太大而停止响应了 。其他服务都直接或间接地会调用促销服务,于是也跟着宕机了 。
在微服务架构中,一个服务故障可能会产生雪崩效用 , 导致整个系统故障 。其实在节前,小明和小红是有做过请求量评估的 。按照预计,服务器资源是足以支持节日的请求量的,所以肯定是哪里出了问题 。不过形势紧急,随着每一分每一秒流逝的都是白花花的银子,因此小明也没时间排查问题 , 当机立断在云上新建了几台虚拟机,然后一台一台地部署新的促销服务节点 。几分钟的操作后,系统总算是勉强恢复正常了 。整个故障时间内估计损失了几十万的销售额,三人的心在滴血……
事后,小明简单写了个日志分析工具(量太大了,文本编辑器几乎打不开,打开了肉眼也看不过来) , 统计了促销服务的访问日志,发现在故障期间,商品服务由于代码问题,在某些场景下会对促销服务发起大量请求 。这个问题并不复杂 , 小明手指抖一抖 , 修复了这个价值几十万的Bug 。
问题是解决了,但谁也无法保证不会再发生类似的其他问题 。微服务架构虽然逻辑设计上看是完美的,但就像积木搭建的华丽宫殿一样,经不起风吹草动 。微服务架构虽然解决了旧问题 , 也引入了新的问题:
- 微服务架构整个应用分散成多个服务,定位故障点非常困难 。
- 稳定性下降 。服务数量变多导致其中一个服务出现故障的概率增大,并且一个服务故障可能导致整个系统挂掉 。事实上 , 在大访问量的生产场景下 , 故障总是会出现的 。
- 服务数量非常多,部署、管理的工作量很大 。
- 开发方面:如何保证各个服务在持续开发的情况下仍然保持协同合作 。
- 测试方面:服务拆分后,几乎所有功能都会涉及多个服务 。原本单个程序的测试变为服务间调用的测试 。测试变得更加复杂 。
小明小红痛定思痛,决心好好解决这些问题 。对故障的处理一般从两方面入手,一方面尽量减少故障发生的概率 , 另一方面降低故障造成的影响 。
文章插图
图片
05 监控 - 发现故障的征兆
在高并发分布式的场景下,故障经常是突然间就雪崩式爆发 。所以必须建立完善的监控体系,尽可能发现故障的征兆 。
微服务架构中组件繁多,各个组件所需要监控的指标不同 。比如redis缓存一般监控占用内存值、网络流量,数据库监控连接数、磁盘空间,业务服务监控并发数、响应延迟、错误率等 。因此如果做一个大而全的监控系统来监控各个组件是不大现实的,而且扩展性会很差 。一般的做法是让各个组件提供报告自己当前状态的接口(metrics接口) , 这个接口输出的数据格式应该是一致的 。然后部署一个指标采集器组件,定时从这些接口获取并保持组件状态,同时提供查询服务 。最后还需要一个UI,从指标采集器查询各项指标,绘制监控界面或者根据阈值发出告警 。
大部分组件都不需要自己动手开发,网络上有开源组件 。小明下载了RedisExporter和MySQLExporter,这两个组件分别提供了Redis缓存和MySQL数据库的指标接口 。微服务则根据各个服务的业务逻辑实现自定义的指标接口 。然后小明采用Prometheus作为指标采集器,Grafana配置监控界面和邮件告警 。这样一套微服务监控系统就搭建起来了:
推荐阅读
- 如何实现微服务全链路灰度发布?
- 一文读懂常见的缓存策略
- 微信上,几乎不发朋友圈的男人,并不是低调,多半是这种人
- 微信昵称后面“小耳朵”是干什么用的?我也是刚知道,真的很实用
- 苹果手机微信语音无声音解决攻略
- 微信进一步规范“自媒体”:准确标注信息来源
- 苹果手机微信怎么设置拍一拍名字和文字 苹果手机微信怎么设置拍一拍名字
- 微信憨笑表情包什么意思 微信憨笑表情是啥意思
- 不锈钢可以放微波炉吗 不锈钢饭盒可以放微波炉吗
- 微波炉可以用的容器 微波炉可以用的容器有哪些