使用 TiDB 作为 ZaloPay 商户平台核心数据库

2024-04-08 02:38

本文主要是介绍使用 TiDB 作为 ZaloPay 商户平台核心数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者介绍:Tan To Nguyen Duy,VNG DevOps 工程师,参与电子钱包 ZaloPay 基础架构的开发。

首先介绍一下 VNG。VNG 是越南领先的互联网科技公司,在 2014 年,我们被评为越南唯一一家估值 10 亿美元的创业公司。VNG 推出了许多重要产品,比如 Zalo、ZaloPay、Zing 等,吸引了数亿用户。Zalo 是 VNG 集团的旗舰产品,发布于 2012 年,是越南使用最广泛的通讯 APP,目前活跃用户数达到 1 亿。而本文主角 ZaloPay 是一款移动支付应用,它建立在 Zalo 的基础上,继承 Zalo 生态中的诸多便利,满足用户的日常生活和商业需求。ZaloPay 发布于 2017 年,当时 Zalo 已经拥有大量用户,形成了一个生态系统。也就是说,ZaloPay 的系统必须能够处理非常大的用户量,并且有连续不断的扩展性。

ZaloPay 系统的商户解决方案

2020 年初, ZaloPay 上线了一个新功能,大约 1 亿的 Zalo 用户可以使用 ZaloPay 来转账、收款等。在越南,ZaloPay是在线上聊天平台提供转账和支付功能的先驱。

为 ZaloPay 建立一个必须能够满足大量 Zalo 用户需求的基础架构,并不是一件容易的事,而是一个巨大的挑战。我们不能根据旧的模型来构建服务和设计架构,因为新的系统要有可扩展性、弹性、一直在线的可用性、性能监控功能,还要有严密的安全性。它必须适配尽可能多的云模式。

越南正融入世界上其他地区,迈向互联网时代的高峰,对电子钱包的需求日益增长。我们要推动各种体量的商户使用电子钱包,包括餐饮业、旅游业等的账单支付。这正是“无现金化”电商所普遍追求的目标,我们都知道,实现复杂的交易业务,需要复杂且一致的系统架构。

数据库的挑战

我们认识到业务正在迅速扩张,也清楚地意识到,在不久的将来,数据存储和数据处理会成为一个重大问题,并且这个问题需要尽早处理。随着业务的蓬勃发展,我们的系统基础架构必须能够及时响应业务的增长。

在调研数据库的解决方案时,我们发现了 TiDB,一个 NewSQL 数据库,支持 HTAP 负载,兼容流行的 MySQL 协议。在座的各位都非常了解 TiDB。我可能不需要多说 TiDB 的架构,这部分内容留给 PingCAP 的专业人士,大家当然都知道 TiDB 能做到的事情。请允许我讲一讲我对 HTAP 的理解。

HTAP 数据库的主要技术挑战在于,如何在同一个数据库里,高效处理许多高频更新的小事务和遍历多行数据的复杂查询,以及如何防止分析查询干扰业务的运行。

HTAP 的大多数应用都是通过内存技术(in-memory)实现的,内存技术可以处理大量事务,并提供预测和模拟等功能。HTAP 通过复杂的实时海量数据分析,提供即时的商业决策能力,以此改变企业的经营模式。企业决策者可以实时获知各种问题,查看结果,了解趋势,例如风险管理和欺诈检测等领域。

TiDB 是一个支持 HTAP 工作负载的 NewSQL 数据库,旨在满足数据开发、数据可伸缩性、数据分析等需求。我最喜欢 TiDB 的一点是,我可以用 TiSpark 轻松分析数据。随着业务高速发展,我们需要不断扩展数据存储容量,同时进行大量的数据挖掘,以便迅速提供业务建议,TiSpark 在这种场景下非常有用。

让我们回到 ZaloPay 和 TiDB。Zalopay 致力于移动支付领域,这是一场全新的技术革命。Zalopay 的系统需要与许多商业交易紧密结合,并迅速提供业务分析建议。TiDB 是支持混合事务处理与分析负载的新型数据库。对,这就是我们所需要的。这正是我们现在和未来都想要的数据库。

TiDB 在 ZaloPay 基础架构中的角色

我想谈谈我对数据的认识和理解。数据无所不有,无处不在。尽管人们将数据视为金矿,但由于技术和人力的限制,很少有人或机构能够挖掘这座金矿。

我从 博客 中读到,东南亚知名电商巨头 Shopee 将 TiDB 用于风控系统 中。他们已经从传统的分库分表 MySQL 迁移到了 TiDB。在 2019 年初,他们的 TiDB 集群已处理了大量非交易数据。他们正打算将一些交易类数据从 MySQL 迁移到 TiDB。他们还计划将 TiDB 用作 MySQL 同步方案的一部分,让 TiDB 作为 MySQL 的从库,把 MySQL 中的数据实时同步到 TiDB。

目前,ZaloPay 把 TiDB 集群运行在本地自有机器上。我刚才提到,ZaloPay 在 2020 年初推出了一项新功能,允许 1 亿多活跃用户在 Zalo 通讯 APP 中转账、支付、充值、预订酒店/旅行等。Zalo 用户可以轻松下单产品,在群聊里分享账单,在家庭群组里发红包,通过商户的 Zalo 官方账号付款,商户类型覆盖了零售业、餐饮业、服务业、电商等多个行业。商户拥有一个官方页面,就像脸书的粉丝主页一样,用户可以在 Zalo APP 中与商户网站上的产品进行交互,然后使用 ZaloPay 付款。

此外,这个功能还允许用户通过手机应用向其他人赠送礼物,比如代金券、电话卡、红包或任何东西。仅仅是常用支付领域,我们每天就有几十万笔交易。你们可以想象到,我们的 TiDB 集群工作量之大,集群每天要处理一百万个请求,令人难以置信。

未来我们可能会扩大 TiDB 在分析服务以及非交易业务中的使用。我们产品里还有许多数据挖掘系统、推荐系统等。我们已经知道 TiDB 是一个 HTAP 分布式数据库。我们从一开始就使用 TiDB,因此对我们来说,可以很容易地开发这些系统。

TiDB 带来的价值

我们的口号是 “ZaloPay,两秒付款”。要实现这个口号,我们必须改善许多业务流程和技术流程。为了实现服务,我们使用了匹配 TiDB 实现的 Golang。我们的工程师熟悉 Golang,因此,他们可以轻松阅读并理解 TiDB 源码,从而提升服务性能,优化应用程序与 TiDB 数据库核心间的软件性能。

有了 TiDB,我们可以更容易地实现服务和应用的云模式,也就是可伸缩性、弹性、监控等。

感谢 PingCAP 提供优秀的开源产品。我的中国朋友告诉我,PingCAP 是中国非常知名的开源公司。PingCAP 的产品可以帮助许多公司解决系统运行的问题,提供具体的数据库解决方案。在座的各位或许对 TiDB 和 PingCAP 很感兴趣,我也一样。开源产品能帮助使用产品的程序员了解该产品的特性、功能以及工作原理。感谢 PingCAP 的贡献。

我可能不需要讲 TiDB 如何工作了,因为 PingCAP 的专业人士们无论是在文档里,还是 TiDB DevCon 2020 上,都清楚地说明了这个部分。

PingCAP 的社区支持

最后谈谈 PingCAP 对我的支持。我很感谢 PingCAP 的社区支持。不久前,我在使用和维护 TiDB 上遇到了一些麻烦,我去了 PingCAP 社区。在这里,我得到了高级工程师、工程 VP 和专业社区人员的热情帮助,帮我们排查并解决了问题,并不是每个开源组织或个人都能做到这一点。再次感谢 PingCAP 成员热心帮助我们学习并使用 TiDB。也十分感谢今天来参与 DevCon 的所有人。

这就是我的全部分享,谢谢大家!

本文整理自 Tan To Nguyen Duy 在 TiDB DevCon 2020 上的演讲,大会相关视频可以关注官方 Bilibli 账号主页(ID:TiDB_Robot)。

这篇关于使用 TiDB 作为 ZaloPay 商户平台核心数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud