在分布式系统,一次外部请求往往需要内部多个模块,多个中间件,多台机器的相互调用才能完成。在这一系列的调用中,可能有些是串行的,而有些是并行的,排查定位非常困难。
全链路消息分析及全链路消息跟踪可以帮助我们解决这个问题。基于全链路消息分析可以通过跟踪消息的完整传递路径,精确定位故障发生的位置和原因,缩小故障范围,并提高故障排查和调试的效率。全链路消息跟踪可以追踪和监控微服务之间的消息传递路径,为项目团队提供服务器节点定位、异常上下文信息收集、服务健康度监控/预警、关键业务逻辑执行过程追溯、业务过程分析、业务环节耗时跟踪预警等便捷的运维手段。
那什么是全链路消息跟踪?
全链路消息(End-to-End Message),是指在某种业务在一套分布式系统中从发送方到接收方完整传递的、能描述业务全生命周期的消息。它包括了业务在系统中各环节的传递路径、消息内容和相关的上下文信息。全链路消息包含但不限于以下消息范围:
消息主要涵盖以下内容:
为了能够更好地管理和分析全链路消息的传递路径和状态,提供全面的消息监控和分析能力,以便于故障排查、性能优化和系统调试。
抽象链路消息主要包括:
全链路消息跟踪(End-to-End Message Tracing)的目的就是记录和追踪这些消息在系统中的传递过程,以便实现对整个消息传递链路的可视化、监测和分析。
在一个完整的业务操作通常涉及多个服务之间的协作和消息传递,全链路消息可以跨越多个服务、中间件等组件,从发送方经过一系列中间节点,最终到达接收方。通过追踪全链路消息,可以了解消息在系统中的流动和处理过程,包括消息的发送时间、传递路径、中间节点的处理时间等信息。
外部系统进入到系统的时候,通常的日志记录只会到接口层面,即请求前后的出入参以及对应的耗时等。但是在全链路消息跟踪的设计模式下,接口请求的信息只是其中的一部分,还需要记录接口开始后到结束的中间的业务逻辑的消息,当然这个取决于各业务系统的颗粒度。
确定数据源
首先需要明确业务系统中的数据源,包括输入数据的来源和输出数据的目的地。这可以包括数据库、API接口、消息队列、日志文件等。
识别数据链路
根据业务系统的功能和数据流动情况,识别数据链路的各个环节和组件。这可以通过分析业务流程、系统架构图以及相关文档来进行。
定义数据链路
为每个数据链路环节定义清晰的输入和输出数据,以及数据的转换和处理过程。明确每个环节之间的数据传递方式和规则。
追踪数据流
通过合适的手段和工具,追踪业务系统中的数据流动。可以使用日志记录、消息队列监控、数据库查询等方式来获取数据流的详细信息。
数据链路分析
基于追踪到的数据流信息,进行数据链路分析。这包括确定数据链路中的瓶颈、延迟、错误和数据丢失等问题。通过分析数据链路,可以找出导致问题的环节,并提供相应的优化和改进建议。
在全链路消息跟踪中,数据流的跟踪和解析是一个关键步骤,数据流的跟踪通常通过在系统中埋点或拦截关键节点的方式实现。当消息经过这些节点时,会记录相关的信息,如消息的内容、时间戳、发送者和接收者等。这些信息可以被捕获和存储,用于后续的分析和追踪。
目前我们设计模式中有三种方式来进行链路数据的跟踪。
基于日志的实现方法是消息全链路跟踪的一种常见方式。它通过在每个服务或组件中记录相关的日志信息来实现消息的跟踪和监控。下面是基于日志的实现方法的流程:
基于日志的实现方法相对简单且易于扩展,因为它借助于已经存在的日志记录机制和工具。然而,它也存在一些限制,如日志量的增加、日志传递的开销和跨服务边界的上下文传递等挑战。因此,在实际应用中,通常需要结合其他技术和方法,如注入式跟踪和集成式跟踪系统,来实现更全面和高效的消息全链路跟踪。
基于注入的实现方法是消息全链路跟踪的另一种常见方式。它通过在消息传递路径上的每个服务或组件中插入代码来实现消息的跟踪和监控。下面是基于注入的实现方法的流程:
基于注入的实现方法具有较高的灵活性和精确度,因为它可以直接在代码中插入跟踪逻辑。然而,它也需要在每个服务或组件中进行修改和注入代码,对现有代码的侵入性较大。此外,注入的实现方法可能需要更多的开发工作和技术支持,以确保正确的跟踪逻辑和数据收集。
从前面两种实现方式来看,对于现有系统代码的侵入性相对都比较强,对于已经运营的生产系统来说不是最友好的方式,且定制化高,不易于扩展和维护。因此,就有了第三种实现方法——基于AOP的实现消息记录。
AOP通过将横切的信息收集点从业务逻辑中抽象出来,使得信息收集点的实现可以集中在一个地方,提高了代码的模块化和可维护性,减少代码冗余。其次,AOP使得信息收集点的配置和管理更加集中化,可以更方便地管理和修改信息收集点的实现。
基于AOP的实现方法,当然也有它特有的实现步骤:
通过基于AOP的实现方法,可以在关键的方法调用或消息传递上插入跟踪逻辑,实现消息全链路跟踪。这种方法具有较强的灵活性和可扩展性,可以适用于分布式系统。
在实现全链路消息跟踪时,存储和索引跟踪数据是关键的一步。存储和索引跟踪数据可以帮助实现对消息的快速检索、分析和查询,从而支持故障排查、性能优化和系统监控等任务。以下是采用的数据存储方式:
数据存储除了中间件的选型,还需要将数据存储的过程和业务系统做成解耦,避免降低业务系统正常功能的性能情况。
下图是存储数据的过程:
可视化跟踪数据是实现全链路消息跟踪的关键一步,它可以帮助开发人员和运维人员更直观地理解和分析消息传递的流程和性能。