写点什么

HubSpot 使用 Apache Kafka 泳道实现工作流操作的实时处理

作者:Rafal Gancarz

  • 2023-12-11
    北京
  • 本文字数:1194 字

    阅读完需:约 4 分钟

HubSpot 使用 Apache Kafka 泳道实现工作流操作的实时处理

HubSpot 采用在多个 Kafka 主题(称为泳道,swimlanes)上为同一生产者路由消息的方式,避免了消费者群组滞后的积压,并且能够优先处理实时流量。通过自动和手动相结合的方式探测流量峰值,该公司能够确保大多数消费者的工作流能够在无延迟的情况下执行。


HubSpot 提供了一个业务流程的自动化平台,其核心采用工作流引擎来推动操作(action)的执行。该平台可以处理数百万个活动的工作流,每天执行数亿个操作,每秒执行数万个操作。



工作流引擎概览(来源:HubSpot 工程博客)


大部分处理都是异步触发的,使用 Apache Kafka 进行传递,从而实现了操作的源 / 触发器与执行组件之间的解耦。该平台使用了许多 Kafka 主题,负责传递来自各种源的操作数据。使用消息代理的潜在问题在于,如果消息发布得太快,而消费者无法及时处理,等待处理的消息就会积压,这就是所谓的消费者滞后(consumer lag)。


HubSpot 的工程主管 Angus Gibbs 描述了确保近实时处理消息所面临的挑战:


如果在主题上突然出现大量消息,我们就必须处理积压的消息。我们可以扩展消费者实例的数量,但这会增加基础设施成本;我们可以添加自动扩展,但增加新的实例需要时间,而客户通常希望工作流能够以接近实时的方式进行处理。团队认识到,他们需要解决的问题是对所有相同类型或相同来源的消息使用了相同的主题。考虑到该平台被许多客户使用,如果某一个或一小部分客户开始产生大量消息,那么所有的流量均会延迟,所有客户的用户体验都会受到影响。


为了解决这个问题,开发人员选择使用多个主题,他们将其称为泳道(swimlanes),并为每个泳道配置专用的消费者池。应用这种模式的最简单方式是使用两个主题:一个负责实时的流量,一个负责溢出的(overflow)流量。这两个泳道以完全相同的方式处理流量,但是每个主题都有独立的消费者滞后,通过在两者之间适当地路由消息,可以确保实时泳道避免出现任何的(或明显的)延迟。



Kafka 泳道(来源:HubSpot 工程博客)


如果可能的话,系统会从发布的消息中提取元数据,基于此在泳道之间实现消息的自动路由。例如,批量导入所产生的消息可以在消息模式中明确标记出这种操作类型,这样路由逻辑就可以轻松地将这些操作发布到溢出泳道。此外,开发人员还引入了按客户配置来限制流量的功能,并且能够根据报文消费者的最大吞吐量指标设置适当的阈值。


决定如何在泳道之间路由消息的另一个角度是查看操作的执行时间。实际操作将被路由到一个泳道,而慢速操作将被路由到另一个泳道。这一点对 HubSpot 平台尤为重要,因为客户可以创建执行任意 Node 或 Python 代码的自定义操作。


最后,该团队还开发了将特定客户的所有流量手动路由到专用泳道的方法,以防来自客户的流量意外地在主(实时或快速)泳道上造成滞后,而此时自动路由机制均未启动。这样,在团队排查延迟原因时,就对流量进行隔离了。


原文链接

https://www.infoq.com/news/2023/11/hubspot-apache-kafka-swimlanes/


2023-12-11 14:334437

评论

发布
暂无评论
发现更多内容

前端工程师leetcode算法面试必备-二叉树深度广度遍历

js2030code

JavaScript LeetCode

“程”风破浪的开发者|一起来看看北大才女刘媛媛珍藏已久的学习方法吧!一定要点进来

跟着飞哥学编程

学习方法 “程”风破浪的开发者

信用卡监管精细化,强化用户风险防范意识并驱动银行规范管理

易观分析

银行 信用卡

服务器故障用什么软件解决好?大家有推荐的吗?

行云管家

高可用 服务器 ha

嘉为蓝鲸可观测性产品获Gartner Toolkit 推荐

嘉为蓝鲸

运维 监控 Gartner 可观测

如何让 SAP Spartacus 访问 navigation node 的上下文,暴露更多的字段

阿英

typescript angular SAP Spartacus 10月月更

嵌入式 Linux 入门 环境篇(二、安装虚拟机 — 体验 Ubuntu 22.04)

矜辰所致

Ubuntu20.04 嵌入式Linux 10月月更

新闻贴 | KaiwuDB 受邀亮相中国 1024 程序员节

KaiwuDB

JavaScript刷LeetCode拿offer-经典高频40题

Geek_07a724

JavaScript LeetCode

前端工程师leetcode算法面试必备-简单的二叉树

js2030code

JavaScript LeetCode

半导体初创公司如何加速成功?

龙智—DevSecOps解决方案

IP IP管理

DevOps下测试的生存之道

嘉为蓝鲸

DevOps 测试

【FAQ】关于华为地图服务定位存在偏差的原因及解决办法

HMS Core

地图

2022年最新数据库经典面试题及答案汇总(含PostgreSQL、Oracle、MySQL)

墨天轮

MySQL 数据库 oracle postgresql 面试题

Apache Linkis 介绍

鹏哥AI数据

计算中间件 大数据 开源 数据计算 10月月更

前端工程师leetcode算法面试必备-二叉树的构造和遍历

js2030code

JavaScript LeetCode

企业上云选择哪家好?需要考虑哪些因素?

行云管家

公有云 企业上云 云厂商

SAP | 在ABAP中如何使用方法

暮春零贰

SAP 方法调用 10月月更

华为开发者大会 2022即将举办 HarmonyOS开发者用“代码”创造无限可能

Geek_2d6073

WhaleDI自助建模实践与探索

鲸品堂

AI Codec 建模

ITSM | 对话龙智资深技术顾问,探讨ITSM实践如何从过去转向未来

龙智—DevSecOps解决方案

ITSM ITSM解决方案

排障最后一公里,“融合”型的日志平台应该如何建设?

嘉为蓝鲸

运维 监控 日志 可观测性 告警

开源代码安全 | 微软是如何应对开源代码安全问题的?

龙智—DevSecOps解决方案

开源 开源代码

Java | Map集合的子类

陌上

Java 编程 10月月更

MobLink for Flutter

MobTech袤博科技

flutter ios android

滴滴Java后台3面题目:网络+内存溢出+各种锁+高性能+消息队列

小小怪下士

Java spring 面试 JVM

云原生时代的应用端到端可观测体系如何构建?

嘉为蓝鲸

运维 监控 可观测性 告警

澜舟科技推出【熊猫小说家】小程序,用 AI 书写你的故事

澜舟孟子开源社区

人工智能 nlp AIGC

JavaScript刷LeetCode拿offer-二叉树层序遍历篇

Geek_07a724

JavaScript LeetCode

JavaScript刷LeetCode拿offer-链表篇

Geek_07a724

JavaScript LeetCode

uniapp 提示 打包时未添加 push模块

源字节1号

软件开发 前端开发 后端开发 小程序开发

HubSpot 使用 Apache Kafka 泳道实现工作流操作的实时处理_实时计算_InfoQ精选文章