Uber 工程团队宣布开源uForwarder,这是一款面向Apache Kafka的推送式消费者代理,用于提升分布式微服务间高吞吐事件流的可扩展性、效率与运维管控能力。uForwarder 作为 Kafka 与消费者服务之间的中间层,以 gRPC 驱动的推送接口替代了直接的消费者客户端实现。该系统旨在简化消费者逻辑、集中式管理偏移量、隔离工作负载,并为事件队列提供内置的延迟处理能力。
uForwarder 的诞生源于优步内部的 Kafka 部署场景,它支撑了超过 1000 个下游消费者服务,每日处理数万亿条消息与 PB 级别的数据。标准 Kafka 的消费者组在此规模下存在诸多局限,包括分区管理复杂、跨服务语言支持不一致以及运维开销大。直接使用消费者客户端需要每个服务自行实现偏移量管理、重试逻辑与延迟机制,这会增加队头阻塞的概率并降低资源利用率。

宏观层面的消费者代理架构(来源:优步的博客)
此前的内部消费者代理主要面临四大挑战,也就是,当消息因载荷大小限制或服务实例无效而投递失败时,顺序分区处理可能阻塞,从而产生队头阻塞;运行数千台代理服务器支撑消费者服务被证明效率低下,硬件资源消耗不均;消费者服务通常实现自定义的延迟语义,增加了服务复杂度;生产与非生产环境或不同区域之间的工作负载隔离,要么需要大量 Topic,要么需要复杂的负载均衡配置。
uForwarder 引入了上下文感知路由,以提升工作负载隔离与投递精准度。Kafka 消息头将路由元数据带入下游 gRPC 调用,允许在基础设施层做决策,而非应用层过滤。负载均衡器根据区域、租户或环境,仅将事件投递给匹配的消费者实例,减少无效流量并简化消费者的逻辑。

上下文感知路由(来源:优步的博客)
乱序提交追踪器通过避免分区停滞来强化偏移量管理。它独立监控提交进度,并根据配置阈值检测阻塞位置的偏移量。问题消息会被重定向至死信队列,同时提交指针继续处理,避免队头阻塞并保持各分区吞吐稳定。
消费者自动重平衡器持续评估各工作节点的 CPU 使用率、内存压力与吞吐量,基于实时指标重新分配分区以实现高效负载均衡。流量峰值时快速扩容以减少积压,流量下降时平缓缩容以避免不稳定,从而提升整体资源利用率与性能稳定性。
DelayProcessManager 支持分区级暂停与恢复控制,实现更细粒度的回压(backpressure)处理。当依赖不可用或被限流时,仅缓冲阻塞的分区,而非停止整个消费者;其他分区会继续正常处理,在保持吞吐、减少全局变慢的同时,简化服务内部的延迟处理逻辑。

消费者代理工作者拉取线程中的延迟处理(来源:优步的博客)
优步表示,uForwarder 已经成为其内部主流的 Kafka 消费方案,现已在GitHub上开源。该架构实现了更好的工作负载隔离、更低的消费者延迟、更高的硬件利用率,同时简化了微服务中的消费者逻辑。团队正在扩展队列容量,并通过将偏移量回退到最新位置、同时使用副消费者(side consumer)处理延迟数据来解决积压问题。项目还将原生支持Protobuf,让服务可直接接收结构化的消息。
查看英文原文:Uforwarder: Uber’s Scalable Kafka Consumer Proxy for Efficient Event-Driven Microservices





