《详聊微服务观测》系列文章:Telegraf架构设计并发编程
优采云 发布时间: 2021-08-17 05:05
《详聊微服务观测》系列文章:Telegraf架构设计并发编程
作者|江有名
出处|尔达尔达公众号
指南:为了让大家更好的了解MSP中APM系统的设计和实现,我们决定写一系列《浅谈微服务观察》文章深入产品、架构设计APM系统的基础技术。本文是文章系列的第三篇,主要介绍Telegraf数据处理链路的实现原理和插件实现方法。
《详谈微服务观察》系列文章:
Telegraf 是 InfluxData 开源的一个非常受欢迎的指标采集 软件。 GiHub 中已经有数以万计的星星。在社区的帮助下,拥有200多种采集插件和40多种导出插件,几乎涵盖了机器监控、服务监控甚至硬件监控等所有监控项目。
架构设计流水线并发编程
在 Go 中,Pipeline 并发编程模式是一种常用的并发编程模式。简单的说,它是由一系列的stage作为一个整体组成的,每个stage由一组运行相同功能的goroutine组成,每个stage之间通过一个channel连接起来。
在每个阶段,goroutine 负责以下内容:
通过入口通道接收上游阶段产生的数据。处理数据,如格式转换、数据过滤和聚合等。将处理后的数据通过出口通道发送到下游阶段。
其中,除了第一级和最后一级分别只有出口通道和入口通道外,每个阶段都有一个或多个出口和入口通道。
在 Telegraf 中实现
Telegraf 使用这种编程模型,它有四个主要阶段,即输入、处理器、聚合器和输出。
并且它们也是通过通道相互链接的,架构图如下:
如您所见,它整体使用管道并发编程模型。先简单介绍一下它的运行机制:
Fan-in:多个函数向一个通道输出数据,一个函数读取该通道直到它关闭。
扇出:多个函数读取同一个通道,直到它关闭。插件设计
Telegraf 有这么多的输入、输出和处理器插件,它是如何高效管理这些插件的?以及如何设计插件系统来应对不断增长的扩展需求?别担心,请让我详细说明。
其实这里的插件并不是通常意义上的插件(即运行时动态加载和绑定动态链接库),而是基于工厂模型的变体。首先我们看一下 Telegraf 插件的目录结构:
plugins
├── aggregators
│ ├── all
│ ├── basicstats
│ ├── registry.go
...
├── inputs
│ ├── all
│ ├── cpu
│ ├── registry.go
...
├── outputs
│ ├── all
│ ├── amqp
│ ├── registry.go
...
├── processors
│ ├── all
│ ├── clone
│ ├── registry.go
...
从上面可以看出,目录结构是规则的(下面我们都以Inputs插件为例,其他模块的实现类似)。