Apache Pulsar 在腾讯计费场景下的应用

2024-03-23 21:32

本文主要是介绍Apache Pulsar 在腾讯计费场景下的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=gif

腾讯计费平台

腾讯计费(米大师)是孵化于支撑腾讯内部业务千亿级营收的互联网计费平台,汇集国内外主流支付渠道,提供账户管理、精准营销、安全风控、稽核分账、计费分析等多维度服务。平台承载了公司每天数亿收入大盘,为 180+ 个国家(地区)、万级业务代码、100W+ 结算商户提供服务,托管账户总量 300 多亿,是一个全方位的一站式计费平台。

640?wx_fmt=png

腾讯计费的核心痛点

在体量如此庞大的腾讯计费场景下,我们要解决的核心问题就是如何确保钱货一致。腾讯计费自研了分布式交易引擎 TDXA,这是一套交易控制解决框架方案,致力于解决交易过程中应用层逻辑一致性问题。从业界现状看,TDXA 也是少有的专注于应用层的交易事务解决方案提供者,整体架构如下:

640

  • TM:分布式事务管理器。作为 TDXA 的控制大脑,采用去中心化模式,提供高可用服务,支持纯接口调用的 TCC 以及 DB 混合事务。在执行效率方面借助协程异步框架 TDF 以及 TDSQL 异步事务(Prepare 后可以关闭链接)能力支撑全公司的计费业务。

  • CM:作为 TDXA 的配置中心,引入可灵活注册的跳转控制机制,即时构建事务流程有向图,可以自动对流程的正确性和完备性进行检查,并以图形界面展示给用户,在图形界面进行管理。

  • TDSQL:自研金融级分布式数据库,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,为用户提供完整的分布式数据库解决方案。

  • MQ:为 TDXA 提供高一致、高可用的消息通道能力,结合事物状态表最终对各种异常进行收敛。


MQ 在计费场景的应用

围绕计费高一致目标,MQ(message queue)在腾讯计费中的应用可以分为在线服务和离线准实时服务。

640

在线服务场景

失败和超时,腾讯计费覆盖 80+ 特点各异的渠道,300+ 不同业务逻辑,单个支付逻辑常横跨众多不同的内外部系统,调用链路比较长,异常出现的概率相对也会比较大,特别是网络超时(比如海外支付业务)。

TDXA 在处理这类情况会配合本地事务状态库,通过消息队列、消息到期重发,从断点开始继续执行整个交易事务,保证每日亿级交易请求的一致性。


离线准实时服务场景

怎么证明计费系统的高一致呢?那就必须通过第三方对账系统来验证,对账时间粒度越小,就能越早发现问题。在互联网移动支付行业,用户体验是第一位,倘若在玩王者荣耀时,购买英雄后没有及时发货,势必会影响用户体验,甚至遭到投诉。


借助 MQ 实时管理能力以及流式计算框架对计费流水进行实时对账和监控,与 TDXA 相辅相成,共同保证整个交易的时效性和一致性。


其它场景

当遇到王者荣耀周年庆活动时,交易请求会突发 10 倍以上的流量增长。借助 MQ 削峰填谷的能力,交易流水查询和推送以及 Tips 通知等场景能够顶住洪峰压力。


同时,在付费用户画像场景对用户行为数据进行实时挖掘分析,能为业务提供更智能的营销服务。


为什么选择 Pulsar

腾讯计费系统对分布式消息队列的要求如下:

  • 一致性要求:计费场景要求数据一条不能丢,这是最基本的诉求。

  • 高可用要求:需具备容灾能力,在异常情况下能够自动修复。

  • 海量存储需求:在移动互联网时代,产生大量的交易数据,需要具备海量堆积能力。

  • 快速响应要求:在亿级支付场景下,要求 MQ 能提供平滑的响应时间,尽可能控制在 10ms 内。

目前业界使用比较多的是 Kafka,主要场景是大数据日志处理,较少用于金融场景。RocketMQ 对 Topic 运营不太友好,特别是不支持按 Topic 删除失效消息,以及不具备宕机 Failover 能力。我们选 Pulsar 是因为其原生的高一致性,基于 BookKeeper 提供高可用存储服务,采用了存储和服务分离架构方便扩容,同时还支持多种消费模式和多域部署模式。Kafka、RocketMQ 和 Pulsar 的对比如下:

640?wx_fmt=png

对 Pulsar 的功能优化

Pulsar 的开源生态为开发者提供了广阔、灵活的开发空间,为了在腾讯计费场景中更好地应用 Pulsar,我们对 Pulsar 做了一些功能优化:

  1. 支持延迟消息和定时重试(2.4.0 支持)。

  2. 支持二级 Tag。

  3. 完善控制台,支持消息查询和消费追踪。

  4. 完善的监控和告警体系。

延迟消息

在计费场景中,延迟消息是比较常见的需求,比如交易引擎中超时处理,又或者团购砍价活动等。


对于失败超时重试场景,并不需要在短时间内大量重试,因为很可能还是失败,依次扩大时间间隔进行重试是比较合理的。采用 Delay Topic,定时对每个队列的头部进行到期时间检查,高效地把消息投递出去,理论上可以支撑无限大的延迟消息。

640?wx_fmt=png

Delay Topic 基本上能满足绝大部分场景,也有少数其它场景需要指定任意延迟时间。采用 Time wheel 的方式可精确到秒,但需要维护索引关系,不太适合大规模的延迟消息。


在不改变 Pulsar 内部存储模式的前提下,我们支持这两种模式,支撑了王者荣耀英雄砍价活动。


二级 Tag

腾讯计费有上万个业务代码,为了提高安全性,需要按业务同步交易流水。如果按业务代码创建 Topic,需要创建上万个 Topic, 这样会增加管理 Topic 的负担;如果一个消费者需要消费交易流水的所有业务,则需要维护上万个订阅关系。


我们在消息元数据中加入 Tag 属性,用户在生产消息时可设定多个 Tag ,消费时 broker 端会过滤掉不匹配的 Tag。

640?wx_fmt=png


控制台

消息队列在线上大规模使用需要具备一个完善的控制台。用户经常会问以下几个问题:

  • 这条消息的内容是什么?

  • 这条消息的生产者是谁?

  • 这条消息被消费了吗?消费者是谁?

针对于这几个问题,我们对消息的整个生命周期(即从消息产生到消息被消费)进行追踪。

640

我们对 Pulsar 消息元数据加入生命周期相关数据(由于消费时间和消费地址不是消息本身的属性,因此不能将它们直接加在消息元数据中,但可以通过 ES 中流水日志关联查询到它们的信息),再注册 Topic、生产组、订阅关系以及权限,提供统一接入流程管理。


监控告警

我们在 Pulsar 中加入系统监控数据采集组件,数据最终对接计费平台部的鹰眼运营平台,可以自定义告警规则,按业务秒级精准告警。如有临时突发情况,鹰眼平台会根据当前负载情况生成扩容方案,并支持一键扩容。

640


告警有以下类型:

  • 积压告警:在线服务中,如果出现大量消息堆积,说明后端消费成为瓶颈。此时需要及时告警,通知相关人员进行处理。

  • 延迟告警:在交易记录查询场景中,要求购买记录在 1 秒内查出。撮合监控组件采集的生产流水和消费流水,能统计出每条消息生命周期。

  • 失败告警:常规统计流水中的错误信息,从业务、IP 等多维度进行监控告警。


总体架构

如前文所述,腾讯计费优化了 Pulsar 四大模块的功能,由此搭建了以下架构:

640

  • Broker 作为消息队列代理层,负责消息的生产和消费请求,支持水平扩展,根据负载按 Topic 自动进行均衡。

  • BookKeeper 作为消息队列的分布式存储中心,可配置多个消息副本,在异常情况下具备 Failover 能力。

  • ZooKeeper 作为消息队列的元数据和集群配置中心。

  • 支持多种消费模式,其中 Shared 模式下的消费者突破对分区个数的依赖, function 模式非常适合简单的交易流水清洗场景。

  • 提供了统一的 HTTP proxy 接入能力,方便其它语言接入。

  • 腾讯计费还有部分业务是 JS 和 PHP 等语言,提供了统一的 HTTP proxy 接入能力,并对客户端加上生产失败重试能力,提升生产成功率。集群出现异常时,客户端会做降级处理,将消息发送至本地或发送至容灾集群。

以上是我们对 Pulsar 所做的功能优化。我们会继续和 Apache Pulsar 社区合作,把这些优化的功能贡献给社区,希望帮助到社区的其他用户。我们也希望更多的用户加入 Pulsar 社区,共同完善 Pulsar 功能。


Pulsar 在腾讯计费的使用情况

分布式消息队列目前基本上覆盖了大部分计费系统,很多已经成为了支付环节的关键路径。Pulsar 稳定提供的高一致、高可用的消息通道能力,助力计费交易引擎稳定高效运转。目前,Pulsar 已在腾讯计费大规模使用,经受住了业务洪峰的压力和交易一致性的考验,达到了 5 个 9 的高可用率。

640

总结

Pulsar 是一个年轻的开源项目,拥有非常多吸引人的特性;Pulsar 社区发展迅猛,在不同的应用场景下不断有新的案例落地。我们会持续关注并和 Apache Pulsar 社区深入合作,把优化的功能奉献给 Pulsar 社区,和社区其他用户一起进一步完善、优化 Pulsar 的特性和功能。


腾讯计费历经 15 年打磨,提供一整套的高一致计费平台,经受住了腾讯公司内部付费业务的考验。腾讯计费平台是一个中台型的产品,已经在腾讯云上开放给外部的合作伙伴,目前已应用在多个领域,欢迎关注联系。

640?wx_fmt=png

点击看演讲视频


640?wx_fmt=gif

这篇关于Apache Pulsar 在腾讯计费场景下的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/839580

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit