Serverless架构在今天已经不再是新鲜的事物。该架构具有多个特点:较低的运营和开发成本、能快速上线、自动扩展、安全性高和适合微服务等。各大云服务商也提供了各自的Severless解决方案。然而,尽管Serverless架构在某些方面表现出色,但在当前轰轰烈烈的“微服务”进程中,它仍然不是一种主要的选择。除了由于本身特性导致的使用场景受限外,我想乏善可陈的关于Serverless最佳实践的总结也是一个重要的因素。我有幸参与了一项基于AWS搭建的Serverless (FaaS) 系统的开发工作,该系统提供了一组核心服务。通过几次系统故障调研和性能优化的实际体验,我发现系统监控在Serverless架构中至关重要。所以本文将从Serverless系统监控的角度来展开一些讨论。
微服务是一个广泛使用的应用架构,而如何使得微服务应用云原生化却是近些年一直在演进的课题。国内外云厂商对云原生概念的诠释大同小异,基本都会遵循 CNCF 基金会的定义: 云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式 API。 这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。 弹性可扩展,是企业选择上云的一个重要原因。它可以为企业节省大量成本,同时保障服务稳定性。我们有个电商客户,平时只有 200 多个服务节点,但在大促时轻松扩容到上千个节点。这个扩容动作通过平台一键完成,只需要秒级的时间。操作之简单、时间之短是在上云之前是不可想象的,那些复杂漫长的硬件采购、环境搭建和服务部署流程被自动化完成。
从单体架构到集群架构再到微服务架构,业务越来越庞大,也越来越复杂。每一次架构的升级,在提升了业务吞吐量的同时,必然会带来更大的复杂度。云原生时代背景下,微服务、Service Mesh、 Serverless 等新技术的出现,业务的复杂度很快就远远超越了个人的人力极限,大规模应用更是需要成千上万专业的人协作才能完成。应用稳定性链路中的因素也越来越多,一个应用相关的稳定性指标从基础设施到中间件,再到应用自身的模块、组件、中间件、基础设施等,每个环节都会有致命的因素导致应用无法正常提供服务。 依赖传统的稳定性体系,通过日志服务查看业务日志,通过各个中间件去感知中间件的运行状态, 再通过网络、存储、操作系统层面的监控来查看基础监控信息, 这些信息每一个都只能片面的代表业务链路中的某一个节点的状态,且每个状态与其他节点之间都是割裂且毫无联系的。最终只能依赖人力投入,汇总分析最终判断,再验证。 在互联网时代, 时间就是金钱这个真理从来都没有像今天这样被深刻的践行着,每一秒的不可用时间里都有可能产生大量的损失。于是,稳定性应急就越来越像是高悬头上的达摩克里斯之剑,成为让运维、研发的睡眠质量急速下降
最近一年,小玉所在的业务部门发起了轰轰烈烈的微服务化运动,大量业务中台应用被拆分成更细粒度的微服务应用。为了迎接即将到来的双十一大促重保活动,小玉的主管让她在一周内梳理出订单中心的全局关键上下游依赖,提前拉通各方对齐重保方案。这个任务可愁坏了小玉,平时她只与直接上下游业务方打交道,现在要梳理出订单中心完整的依赖路径,头发愁掉了一大把仍然不知道该如何下手。无奈之下,小玉再次求助于万能的小明。 针对小玉的问题,小明提出了一个想法,首先调用链可以追踪一次请求的完整调用路径,但是单条调用链无法反映出所有的调用分支,也无法通过流量大小体现出依赖的强弱,而逐条分析调用链的成本又太高。那么,是否可以通过程序将一批具有相同特征(比如经过某个应用,或者调用了某个接口)的调用链聚合成一颗树,通过分析这棵树的形态与流量,就可以快速梳理出关键节点与依赖路径,而这就是链路拓扑功能的雏形。
在我们继续之前,重要的是要注意 JWT 通常被错误地称为 JWT Tokens。在末尾添加 Token 将会使其变成 JSON Web Token Token。因此,在本文中,我们省略末尾的 Token 并简单地称之为 JWT,因为这是更正确的名称。同样地,由于 JWT 通常用作身份验证和授权过程的一部分,一些人将其称为 Authentication Tokens 或 JWT Authentication Tokens。从技术上讲,JWT 只是一个包含 Base64 编码的 JSON 的令牌。它可以用于许多不同的用例,包括身份验证和授权。因此,在本文中,我们不使用这个术语,而是讨论如何在身份验证过程中使用 JWT。
2022 年,关于微服务发生了几件有趣的事情。其一,正式掌管 Twitter 不久的 Elon Musk 对 Twitter 的开发团队 “批判” 了一番。他表示自己为 Twitter 在许多国家的极慢运行速度感到抱歉。之所以如此慢是因为 App 需要执行 1000 多个 “糟糕” 的批处理 RPC,而这只是为了渲染主页的时间线。Musk 表示 “今天的部分工作将是关闭臃肿的"微服务" 。实际上,只有不到 20% 的微服务是 Twitter 需要的。” 其二,GitHub 前 CTO Jason Warner 在社交媒体上表示:“我确信过去十年中,最大的架构错误之一就是全面使用微服务。” “任何构建过大型分布式系统的人都知道他们并不真的那样工作,但还必须适应它。”那么,微服务架构是否是一个错误,或者微服务是否已经过时了呢?