本文要点
AWS Lambda可能是过去几年软件开发中云原生转换最典型的技术之一。根据其官方网站的公告:“使用AWS Lambda,用户无需提供或管理服务器即可运行代码,用户只需为所消耗的计算时间付费。”从2014年最开始只支持Node.js,到现在AWS Lambda已经可以支持在各种编程语言中开发和部署函数,包括Go、Java、Python、Ruby和C#等。
AWS Lambda的发布向我们推出了作为主流云原生范例的无服务器计算(以函数即服务作为“计算”基本面)。其他主流的云平台也提供过类似的功能,如Google Cloud函数和Microsoft Azure函数,以及像Knative和Apache OpenWhisk这样的开源项目也提供过。
在推出五年多之后,AWS Lambda可以说仍然是最知名的以及采用度最高的的无服务器平台,尽管没有其被采用的精确数据,而且相对公平来讲,它已经超越了“早期采用者”阶段(即仅在开发初期选择使用)。
然而,AWS Lambda仍然与过去几年云原生的另一个典型主题-可观察性有些矛盾。尽管Lambda集成了CloudWatch的metrics和logs,以及X-Ray的分布式跟踪,但调试出错时要找出生产中某个函数的问题仍然是一个相当大的挑战。
本文重点关注分布式跟踪,并基于AWS Lambdas在当今计算环境中所使用的用例,讨论了在AWS Lambda函数中获取和利用可观察性的最佳实践。
使用AWS Lambda,用户可以定义同步执行的函数,例如为HTTP请求提供服务,或者异步地响应其他AWS服务生成的事件。能触发AWS Lambda函数的事件非常丰富,并且还在不断增长,其中被采用最多的事件类型有:
但是除了AWS Lambda的基本功能之外,采用者也不需要对它的典型特性多加处理:
AWS Lambda达到了上面的要求吗?这里面最主要的是,用户可以只在需要的时候将代码放到AWS Lambda运行,并且只支付函数为工作负载服务的时间(虽然会四舍五入到最接近的100ms)。然而,这是以性能上的不可预测性为代价的。当AWS Lambda启动一个实例来处理负载时,因为初始化需要运行时间,通过该实例的第一个请求将遭受相当高的延迟。
这种现象被称为“冷启动”,为此Amazon提出来一个创造性的解决方案来保持函数“温暖”,允许用户通过付费的方式来为一定数量的实例”保暖“,通过这种方式开发人员可以专心于基础设施,这可以算是固定成本,但是这对于“对Lambda工作负载延迟峰值”非常敏感的用户来说非常有用。
与所有通用计算平台一样,用户可以使用AWS Lambda做很多不同的事情。在实践中,最经常出现的用例如下:
人们似乎对将AWS Lambda用于机器学习用例越来越感兴趣,尤其是与AWS Sagemaker结合使用。
对于Lambda是一个优秀的业务流程和系统集成工具这一事实,有一个有趣的推论,(几乎)没有Lambda函数是孤岛。Lambda函数,往往召集其他Lambda函数,以及没运行在Lambda上的系统。这些从Lambda函数中调用的系统,要么是AWS管理的服务,要么是部署在其他AWS计算平台(如EC2、ECS或Fagate,甚至是本地平台)上的其他客户系统。相关地,后面将讨论关于分布式跟踪AWS Lambda函数的需求。
每一个计算范例都伴随着权衡,Lambda也不例外:
许多AWS Lambda架构中固有的分布式复杂性,以及在AWS“生产”中运行的AWS Lambdas的有限调试能力,都要求用户集中Lambda函数的所有可观察性。这意味着,除了CloudWatch中明显的logs和metrics之外,还要对Lambda函数采用分布式跟踪。
自本世纪初以来,分布式跟踪已成为应用程序性能监测方法中不可分割的一部分。而且由于OpenTracingAPI和implementations通过开源项目实现,比如Zipkin,Jaeger,以及像一些无关的项目OpenCensus和HTrace,分布式跟踪最近已经在监测和可观察性的前沿拥有了很大话语权。虽然OpenTracing和OpenCensus项目已经停止了,但是他们的继承者OpenTelemetry仍在积极地工作着。
微服务和云原生架构的出现无疑使我们的分布式系统比以往任何时候都更加分布式。与此同时,信号软件的组件变得越来越小。如果用户越希望有更多的活动部件协同工作以服务于工作负载,那么他的集体和个体行为就越需要可见,特别是与“如何为最终用户服务”有关的行为。有人说,开发人员的工作越来越像水管工的工作,专注于连接各种微服务的“管道”。
这种增加的分布性和相互依赖性正是分布式跟踪变得如此重要和有价值的原因。分布式跟踪是一种监测实践,它涉及到服务,以集体和协作的方式记录那些描述它们在服务一个请求时所采取的操作的spans。与相同请求相关的spans被分组在一个跟踪中。为了明了哪个跟踪被记录了,每个服务都必须在它自己对其他上游服务的请求中包含跟踪上下文。简而言之,你可以把分布式追踪想象成一场接力赛,一种田径运动,运动员轮流跑,互相传递接力棒。
将分布式跟踪类比为接力赛,每个服务都是运动员,跟踪上下文是接力棒。如果其中一个服务丢失了它,或者服务之间的切换不成功(例如由于实现了不同的分布式跟踪协议而导致的不成功),那么跟踪就会中断。分布式跟踪和接力赛之间的另一个相似之处是,比赛的每个环节都很重要,都有可能会让你输掉比赛,但除了在每个环节不掉链子之外,同时你必须在每个环节都跑得快才能出类拔萃。
在讨论跟踪AWS Lambda有什么可用之处之前,让我们讨论一下分布式跟踪解决方案应该满足的功能性和非功能性需求::
我想了很久,很难在上面的列表中添加一个名为“与其他AWS服务集成”的条目。毕竟,Lambda函数是从其他服务生成的事件异步调用的,以及从AWS的API网关和应用程序负载均衡器同步调用的。而拥有来自API网关的相同跟踪spans将有助于回答“这个延迟是从哪里来的?”,这真的和分布式系统一样古老。但是,我仍然决定没加进来。因为延迟的根源是很少使用负载平衡器和Lambda函数之间的AWS网络,而不是AWS Lambda函数本身,也不是他的dependencies,阻碍或等待长时间运行的同步调用,或其内部运算。
追踪数据的收集是由专门的Instrumentation来执行的。一般来说可以分为两大类:
注意,如果在用户消费的框架、库,以及供应商管理的服务(如AWS RDS)中内置ProgrammaticInstrumentation,它们实现Instrumentation的方式让您感觉像是自动的,因为用户不需要维护这些代码。对我来说,这正是问题的关键:实现Instrumentation的好代码是用户不需要持有和维护的。
但是,用户如何将Instrumentation交付到生产系统以便利用它收集需要的数据呢?要实现也是有梯度的,从手动到自动。
正如我认为自动化配置优于Programmatic配置一样,交付Instrumentation所需的工作量越少越好。从这个角度来看,人们可能认为ProgrammaticInstrumentation有其优点,只要它也是内置的。但在我的经验中,情况并非如此。维护ProgrammaticInstrumentation的工作比交付Drop-inInstrumentation的工作要昂贵得多。在大多数情况下,自动化的交付可以在CI/CD管道中一次性设置完成,或者只需要很少的维护。
但是ProgrammaticInstrumentation需要随着代码不断变化,而且只要代码不断变化,就需要付出一定的代价。根据Lehman的软件进化法则,软件需要不断变化才能保持有用。在考虑ProgrammaticInstrumentation时,那些保持软件有用所需的更改可能需要调整Instrumentation。在Lambda中,这个变化的可能性会造成的需要调整Instrumentation的频率高于往常,随着用户应用于Lambda的变化越多,集成软件系统需要关心如何与这些变化进行交互,这通常需要调整跟踪数据的收集,并需要在Lambda码库的生命周期持续投入大量ProgrammaticInstrumentation。
总结一下,我之前已经讨论过,最好的Instrumentation类型是自动的,并且在没有太多开销的情况下交付它是非常重要的。那么,这将如何实现呢?在目前的技术水平下,有两种方法可以实现这些需求:
总而言之,在我看来,最好的Instrumentation是自动的,并且以尽可能最简单的方式交付。
AWS Lambda仍旧是无服务器计算的标准,即使随着无服务器函数在应用程序开发中的使用达到了空前的高度,Amazon公司仍在探索无服务器计算在生产环境中的有效性能达到一个怎样的程度。
随着越来越多的组织将无服务器函数作为其应用程序开发过程和平台的重要组成部分,他们正在考虑如何在生产应用程序中使用更多的无服务器函数(以及是否应该使用)。
还有一个担心就是可观察性,对于实现无服务器生产代码的团队来说,这仍然是一个主要的挑战,尤其是因为遗留APM工具仍然努力达到开发团队所需的可见性水平。
AWS Lambda为开发人员和操作人员带来了显著的差异,强调了专门构建云原生监测工具的需求,这些工具能够应对无服务器监测的挑战,并使用不同的方法来获取应用程序的可观察性。
任何考虑将无服务器作为其生产环境的一部分的人都应该将端到端可观察性作为一个必要的需求,并专注于能够跨分布式系统的监视和跟踪解决方案,这些分布式系统是基于云原生技术、像Lambda这样的无服务器平台、以及通过Lambda集成的可能较老的技术构建的(因为无服务器很少是孤岛)。
Michele Mancioppi担任Instana高级技术产品经理,负责代理、分布式跟踪、Cloud Foundry和VMware Tanzu的所有产品开发工作。在加入Instana之前,他是SAP云平台性能团队的开发专家和技术领导。Michele拥有意大利Trento大学计算机科学学士和硕士学位,以及荷兰Tilburg大学信息系统博士学位。
领取专属 10元无门槛券
私享最新 技术干货