我们正在升级FutureStack的注册,仅到4月30日。条款和条件适用。 现在注册

无服务器是一个梦想。要实现真正的“无服务器”,必须在所有与业务相关的技术问题和所有可以留给供应商处理的武断、繁琐、无趣的平台托管问题之间建立一个完美的边界。实际的、现实世界的产品被标记为“无服务器”,只亚博最新版直播能实现这个梦想,并且仍然让您手动控制细节,在一个完美的世界里,这些细节将是自动的,由供应商处理,并完美地为每个用户工作。用户在无服务器环境中面临的问题通常是设计固有的:安全配置、冷启动和可观察性问题。当大多数(但不是所有运行代码的细节都留给供应商时),您可能会遇到同样的问题。本文将重点讨论无服务器跟踪的特定可观测性问题。

当您将微服务划分为离散的无服务器步骤时,体系结构自然会变成基于事件的。在这里我没有足够的空间来讨论基于事件的架构的优点,但我只想说大多数无服务器的开发人员将理所当然地使用它。在一个体系结构中,实际操作发出由多个服务处理的一个或多个事件,其问题在于可观察性。当多个服务处理一个事件(可能是非常快速和异步的)时,可观察性——即在技术上产生易于解释和可操作的信息的目标——变得很困难。

让我们从一个理想化的例子开始。一个电子商务网站有一个问题报告:有时,当客户输入优惠券代码时,代码应该是有效的,但却是无效的。这个问题是不一致的,所以直接的端到端测试不能轻易地复制这个问题。这意味着您需要查看现实世界的性能。当您查看堆栈中各种组件的指示板时,有数千个已记录的事件,但是跟踪的问题变得更加复杂。

这个事件如何连接到我们服务上的其他事件?

试图通过时间代码或事件属性(如客户ID)连接事件可能会非常困难:在异步处理中,时间代码通常不匹配,而且排队服务或API网关等系统不提供直接的日志记录方法。围绕哪个数据库事件触发了特定的计算事件的问题可能会让操作团队分心,尤其是在活动事件期间。

一般来说,更大的问题是:“这个事件如何与我们服务上的其他事件连接?”标准的云内省工具将回答一些明显相关的问题,如:

  • 哪个服务具有访问其他服务的权限?
  • 哪些服务记录了错误?
  • 每个服务的吞吐量速率是多少?

从这些问题—以及服务组件上可用的任何参数,如前面提到的客户id—您通常可以看到指示性的趋势例如,当一个服务中断时,另一个服务的流量将降为零。但当我们研究一个有限的模式或单个事件时,这些工具往往会失败。

规划可观察性:结构化日志

当处理大型、高速的数据时,人们经常说他们在“从消防水管中饮水”。但是,当处理来自多个云服务的日志数据时,这更像是从海洋中饮水。试图解析日志以获得可观察性可能是一场噩梦。如果您的日志是非结构化的,那么您最终将花费时间使用正则表达式来尝试过滤它们,并且仍然会得到误报。

AWS强烈推荐结构化日志。通常,JSON的格式很容易基于多个参数进行查询。这大大简化了对有意义数据的搜索。

但是,即使使用结构化日志,您仍然会面临根本不允许您进行日志记录的服务的问题。像API网关或排队服务这样的系统不一定允许您将日志配置成一个整齐的结构。

构建可观测性:AWS x射线集成

在某种程度上,只有您的云提供商才能真正了解您的堆栈组件之间发生了什么。由于云提供商管理和运行内部路由层,因此他们应该对整个系统有一个相当完整的理解。AWS x射线当请求在应用程序中传递时,提供请求的端到端视图,并显示应用程序底层组件的映射。

像AWS X-Ray这样的工具只能提供这种层次的洞察力,但它们也有局限性。虽然x射线可以提供对单个交易路径的深入了解,但它需要与整体的可观察工具集成,以突出你最担心的事情。

毕竟,X-Ray提供了单个请求的细节以及它如何连接,但它确实做到了提供洞察请求作为一个整体是如何执行的。不管你用的是New Relic,现在集成了AWS x射线,或者推出自己的解决方案,您将需要某种方式来查看整体性能,然后“放大”到x射线级别。

幽灵未完成的任务:可观察性始于代码

无服务器的承诺是将那些困难的、不必要的工作留给供应商。我们很想尝试那些承诺能够完美地洞察我们的堆栈而不需要做任何额外工作的工具。

然而,现实情况是,虽然观测很困难,但这并不是不必要的工作。只有开发人员才能完全了解代码内部的情况。所以,虽然像New Relic代理这样的工具可以运行在你的无服务器代码上,提供很好的自动洞察,但总有一些细节的重要性只对你的团队有意义。这意味着编写代码的人必须为可观察性制定计划吗当他们写代码的时候。

为了继续讨论New Relic如何让你深入了解你的应用程序,加入我们的社区Slack并与他人分享技巧!