腾讯微服务观测平台 TSW(Tencent Service Watcher,以下简称 TSW)是一款分布式架构链路追踪中间件,用于提供云原生服务可观察性解决方案。TSW 能够追踪到分布式架构中的上下游依赖关系,绘制拓扑图,为您提供多维度调用监控与统计,助您掌控系统关键指标,及时发现错误调用与性能瓶颈。TSW 还支持各类主流框架与协议,兼容业界通用的 Opentracing 标准,拥抱开源生态,支持多种主流编程语言。
刘潇
腾讯云中间件团队高级工程师 微服务平台TSF、微服务观测平台TSW 研发 热衷于云原生和开源技术,在微服务、APM、大数据、消息队列等领域拥有丰富经验,目前致力于服务可观测性技术的落地和推广
冉小龙
腾讯云微服务产品中心研发工程师 Apache Pulsar Committer
Apache BookKeeper Contributor
基于分布式架构的微服务链路监控诊断
在分布式场景下,服务调用错综复杂,问题分析与定位非常困难,TSW 的链路跟踪系统能迅速定位到有问题的服务,快速发现问题节点。
微服务性能优化
在依赖拓扑图中能对各个服务的调用次数以及耗时进行分析,找到负载较高以及负载较少的服务,对资源进行合理分配。
数据协议
TSW 兼容 Opentracing (https://github.com/opentracing-contrib/opentracing-specification-zh/blob/master/semantic_conventions.md)标准协议,OpenTracing 中的Trace(调用链)通过归属于此调用链的Span来隐性的定义。特别说明,一条Trace(调用链)可以被认为是一个由多个Span组成的有向无环图(DAG图), Span与Span的关系被命名为References。
Span 数据定义
系统设计
Trace 数据从客户端 Agent 采集,通过 APM Gateway 进行协议转换、鉴权等接入,数据写入 Pulsar 进行数据堆积、流量削峰等,使用 Pulsar Functions 实现的 Span splitter 进行数据的 ETL,一部分数据通过Pulsar IO Functions 数据写入 ES 做倒排索引,一部分数据通过 Flink 进行复杂计算,计算出 metrics 数据并写入到时序数据库。从此图看出 TSW 大量使用了 Pulsar Functions 来做数据转换、数据写入等操作,后面会详细介绍落地细节。
Apache Pulsar (https://pulsar.apache.org/en/)是新一代云原生流数据平台, 采用业界主流的计算与存储分离,分层分片的体系架构,极大的简化了消息处理,存储以及计算的能力。在提供最基础的消息处理以及消息持久化的功能之外,还基于 serverless 的事件触发模型,设计并实现了 Pulsar Functions。
Pulsar Functions 是一个轻量级的计算框架,像 AWS 的 lambda、Google Cloud 的 Functions 一样,Pulsar Functions 可以给用户提供一个部署简单、运维简单、API 简单的 FASS(Function as a service)平台。开发者可以使用 Pulsar Functions 编写用户所需要的计算逻辑,并将其作为 instance 的一部分,交给 Function Worker 处理和调度。
当我们进行流式处理的时候,很多情况下,我们的需求可能只是下面这些简单的操作:
Pulsar Functions 作为 serveless 的计算框架,具有以下特点:
在此基础上,Pulsar Functions 具备如下优点。
灵活的 Runtime
允许用户在不同的环境及场景下部署 Pulsar Functions,目前支持如下三种形式:
多语言支持
允许用户使用不同的语言来编写指定的 function 计算逻辑,目前支持如下三种语言:
语义保证
Pulsar Functions 提供了以下三种消息传递语义,来保证不同场景下对消息传递的语义要求。
灵活的订阅类型
Apache Pulsar 通过对 consumer 的抽象,支持了灵活的订阅模型,可以应对 Queue 和 Streaming 两种不同的消费场景,在 Pulsar Functions 中,将这一优势同样继承过来,支持了如下三种订阅模式:
TSW 面临的需求
从上面 Pulsar Functions 的介绍,在 Pulsar 生态下,可以方便使用 Functions 来解决以上问题。
1. 比如数据拆分,可以简单实现 Pulsar Functions 的 API 即可。
import org.apache.pulsar.functions.api.Context;
import org.apache.pulsar.functions.api.Function;
public class SpanSplitterFunction implements Function<Span, Span> {
@Override
public Span process(Span input, Context context) {
// 数据ETL
return Span.split();
}
}
2. 数据写入第三方组件。Pulsar 官方提供常见的 IO functions 实现,所以只简单配置即可。例如将数据写入到ES:
import org.apache.pulsar.functions.api.Context;
import org.apache.pulsar.functions.api.Function;
public class SpanSplitterFunction implements Function<Span, Span> {
@Override
public Span process(Span input, Context context) {
// 数据ETL
return Span.split();
}
}
从例子中,我们可以看到 Pulsar Functions 在解决数据ETL、数据落库上,降低了开发和部署成本,助力 TSW 产品的快速迭代。
《深度解析:Pulsar的消息存储机制和Bookie的GC机制原理》