追踪案例研究

这是Clearcode如何为我们的一个内部项目——跟踪器确定和构建MVP的故事。

每个Adtech和Martech平台都不同。

例如,需求侧平台(DSPs)通过实时竞价(RTB)帮助广告商根据印象从发行商那里购买库存。

另一方面,客户数据平台(CDPs)从各种来源收集第一方数据,创建单一的客户视图(scv),并将受众推向其他系统和工具。

尽管AdTech和MarTech平台的功能和目标各不相同,但它们都有一个共同点;它们都需要一个组件,从不同的来源(如网站)收集数据并将其发送到不同的系统(如dsp)。

该组件称为a跟踪器

重点:

  • 追踪器用于收集来自不同来源的事件数据(如印象、点击和视频指标)。
  • 我们设计并建立了自己的跟踪系统,可以用于未来的客户项目。
  • 它是我们AdTech基金会的一部分——各种组件可以用来帮助我们的客户在构建AdTech和MarTech平台时节省数月的开发时间和数万美元。
  • 我们通过运行基准测试来选择编程语言和技术堆栈。
  • 两个表现最好的技术堆栈是Go(又名Golang)和Nginx + Lua,但选择Go是因为它越来越受欢迎。
  • 通过在您的AdTech或MarTech开发项目中使用我们的跟踪器,您可以w88优德官网页节省数千开发成本和数月的开发时间
跟踪器

我们的跟踪器可用于收集Adtech&Martech平台的事件数据。

Krzysiek Trębicki, Tracker项目经理

Tracker_Magazine

现在下载,以后再读

下载我们的Tracker案例研究的完整版本。

现在下载


构建跟踪器的开发过程

以下是我们在构建追踪器时所遵循的开发过程概述:建立我们跟踪器的发展阶段

MVP范围相

最小可行产品(MVP)界定阶段的目标是定义项目的范围并选择体系结构和技术堆栈。

我们通过以下方式实现了这一目标:

创建故事地图

我们通过创建故事地图来帮助我们来启动项目:

  • 定义跟踪器的关键组件和特性。
  • 确定并解决主要的技术挑战,如性能、速度和可伸缩性。
  • 决定跟踪器应该收集什么事件以及如何收集。
以下是故事地图的概述:追踪者最有价值球员的故事地图

定义功能需求

基于故事映射会话的结果,我们为跟踪器创建了一个功能需求列表。

功能需求与跟踪器的特性和过程有关。

我们确定跟踪器需要:

  • 接收和处理多种类型的请求(印象,点击,转换等)。
  • 处理请求并生成具有适当维度和度量的事件。
  • 允许配置请求类型和事件的预处理。
  • 通过公开API来扩展它的基本功能。
  • 将生成的事件公开给指定的收集器(插件),并允许它们通过配置附加到特定的事件类型。
  • 包括内置的日志和队列收集器。
  • 包括一个内置插件为我们的预算管理组件,银行家。
  • 支持请求重定向。

定义非功能性需求

项目的非功能性需求与构建工作产品无关,而是与跟踪器的性能、可伸缩性、安全性、交付和互操作性有关。

我们确定了跟踪器的以下非功能性需求:

  • 高可用性(99.999%)。
  • 每秒请求数高(2000个请求/s)。
  • 低要求处理延迟(平均15毫秒)。
  • 安全
    • 隐私——例如,当我们需要与其他组件共享个人数据时,确保我们不会将其暴露给第三方。
    • 可用性 - 确保平台不会受到不良请求的分布式拒绝服务(DDOS)的影响。
  • 可部署到AWS、GCP和Azure。
  • 能够与自定义插件集成。
  • 能够与其他DSP组件集成,如银行家。
  • 平台可扩展性 - 跟踪器需要能够处理事件的大幅增加。
  • 等幂-多次处理相同的日志,以防出现错误或临时不可用

选择架构和技术堆栈

我们通过以下方式选择跟踪器项目的架构和技术堆栈:

  • 研究用于测试编程语言性能的基准工具。
  • 比较技术堆栈的不同变体。

基准测试工具的研究

我们研究了不同的基准工具,以帮助我们为跟踪器选择合适的编程语言。

我们想要测试的主要参数是:

  • 请求延迟
  • 每秒请求
  • 误差率
  • 百分位数延迟
  • 理想的基准测试工具需要易于与我们的持续集成(CI)环境集成,可以通过命令行或Jenkins的插件运行。

    下面是满足我们需求的基准测试工具的优缺点。

    Wrk

    Wrk是一个能够产生大量负载的HTTP基准测试工具。

    优点

    • 它不是特定于域的语言(DSL),这意味着我们不必学习一个新的编程语言。
    • 测试脚本是用Lua编写的,这提高了测试的速度。
    • 易于设置和使用。

    缺点

    • 虽然Lua在测试期间提供了速度,但它包含了一些影响测试结果的问题。
    • 不存在基准测试结果的可视化。


    对于简单的性能和负载测试,最好的选择是Wrk,但是如果我们需要一些更高级的场景,它需要在Lua中进行配置测试,这可能很耗时。它也不支持开箱即用的指标可视化。


    转k6

    优点

    • 它不是领域特定语言(DSL)。
    • 测试是用JavaScript编写的,所以团队很容易使用。
    • 易于设置和使用。
    • 易于与Grafana集成进行指标可视化。

    缺点

    • 测试是用JavaScript编写的,而JavaScript并不是理想的测试语言。


    蝗虫

    Locust是一种易于使用的分布式负载测试工具。它是用Python编写并在Requests库上构建的。

    优点

    • 它不是DSL,测试是用Python编写的,所以团队很容易使用。
    • 易于设置和使用。
    • 可选的web UI与图表。

    缺点

    • 在基准测试阶段,我们发现Locust有点慢,并且需要大量的基础设施来在基准测试工具上创建相当多的负载。


    k6和Locust似乎比较容易设置和使用,虽然选择Locust是因为它允许我们用Python编写测试,这是团队非常熟悉的一项技术。


    加特林

    Gatling是一个功能强大的开源负载测试解决方案。

    优点

    • 有一个Jenkins插件,可以让我们在Jenkins中查看Gatling生成的报告。

    缺点

    • 它使用基于scala的DSL来编写测试,这意味着我们必须在开始运行测试之前学习如何使用它。
    • 开始和设置需要时间。


    由于其复杂性和用于配置测试的基于标量的DSL, Gatling被放弃了。一旦我们选择了基准测试工具,我们就继续选择将要测试的技术。

    技术比较

    我们决定测试以下编程语言和技术:

    • Golang(又名Go)因为它越来越受欢迎,我们也很熟悉它。
    • Rust是因为其他开发团队过去曾使用它来构建跟踪器。
    • 因为我们对它很熟悉。
    • OpenResty = Nginx + Lua,因为它允许我们只用一个Nginx HTTP服务器来创建一个跟踪器。

    我们决定使用上面列出的基准测试工具在所有技术上运行初始的基准测试,但后来重点关注使用wrk2、gatling和locust运行更多的测试。

    所有这三个工具都配置为允许最大的弹性。

    结果和选择的程序设计语言

    两种性能最好的编程语言是Nginx + Lua和Golang,虽然它们在所有的基准测试工具上都有相似的结果,但我们选择Golang是因为目前的市场需求和它的流行程度。

    MVP确定阶段花了1个sprint(2周)完成。

MVP开发阶段

随着MVP界定阶段的完成和我们的架构和技术堆栈的选择,我们开始构建跟踪器的MVP。

我们在5个sprint(10周)中构建了追踪器。

下面是我们在每个sprint中产生的内容的概述。


Sprint 1

我们在此冲刺中实现和内置的内容:

  • 基本功能实现。
  • 配置的事件类型。
  • 创建基准作为持续集成(CI)步骤。
  • 生成可视化的基准测试结果。

Sprint 2

我们在此冲刺中实现和内置的内容:

  • 创建和测试请求重定向。
  • 对跟踪器进行测试。

Sprint 3

我们在此冲刺中实现和内置的内容:

  • 为日志存储组件构建一个插件。
  • 增强配置允许我们配置任何跟踪路径..
  • 生成跟踪器的文档。

Sprint 4

我们在此冲刺中实现和内置的内容:

  • 为我们的银行家构建了一个插件(预算管理组件)。
  • 配置事件提取。
  • 跑步结束测试。

Sprint 5

我们在此冲刺中实现和内置的内容:

  • 生成的自动生成文档。
  • 创建快速入门指南。
  • 构建docker映像并将其推入内部注册表。

我们的追踪者如何帮助你?

加快您的定制AdTech或MarTech平台的开发阶段。
将其实施到现有的Adtech或Martech平台上以收集数据。