Razorpay 如何在 IPL 等事件期间处理大量交易突发

Razorpay 如何在 IPL 等事件期间处理大量交易突发

Razorpay 是印度领先的支付网关服务,为企业提供一套产品来接受、处理
和支付付款,使他们能够建立在线业务。

他们处理了一个有趣的问题:印度板球超级联赛等赛事期间交易突然爆发的问
题。企业,尤其是食品配送和游戏领域的企业,在板球比赛前几分钟和比赛期
间向顾客提供限时抢购和各种优惠,这导致了交易的突然爆发。

该公司的基础设施托管在 AWS 上并配置为自动扩展。但要做到这一点,集群
和节点的自动缩放器必须启动。这需要 3-4 分钟。此时,由于交通流量过大,
系统一度瘫痪。

在 IPL 2019 赛季期间,他们的系统连续 3 天出现短时间宕机。他们被迫
对客户进行速率限制,以确保系统正常运行。

IPL是印度板球超级联赛的简称。

关键的问题

赛季结束后,他们彻底审查了自己的架构,并重点关注了几个关键问题:

他们没有实施限制。这使他们无法控制到达其服务器的流量。

监控警报的配置方式是在问题发生后触发。问题发生和警报之间存在明显的
时间滞后。

活动期间,对不同银行的 API 调用延迟显着升高。这对他们的服务造成了
背压。此外,没有低延迟的自动流量路由到银行系统。

他们的后端是用 PHP 编写的,由于编程语言本身不支持连接池,因此无法
通过数据库进行扩展。MySQL DB 连接大量闲置,占用资源。

解决方案

代理SQL

由于银行的高延迟响应,MySQL 服务器有大量空闲连接。由于 PHP 本身不
支持连接池,因此无法有效地使用数据库连接。

这成为了瓶颈。为了解决这个问题,添加了ProxySQL作为应用程序和
MySQL 服务器之间的拦截器。

部署在 Kubernetes 上的 ProxySQL 不仅提供了高效的池机制,而且使持
久层具有更高的可用性和可扩展性。

速率限制和节流

实施速率限制和节流是为了保护他们的系统免受大量请求和 DDoS 攻击。

最初,他们使用漏桶算法在应用程序服务器上实现了非常基本的速率限制。他
们将速率限制实现升级为具有专用缓存的基于 Nginx 的代理服务器。

该算法从漏桶改为固定窗口,事实证明效率更高。可以利用几种不同的算法来
实现速率限制。每个都有自己的用例。

此外,仅在后端实施速率限制并不能阻止客户端发送请求。在这种情况下,带
宽会不断消耗,并且速率限制逻辑必须不断在后端运行,消耗额外的计算资源。

如果我们可以控制客户端,则需要对其实施速率限制,以在客户端开始接收响
应错误时降低向后端发送请求的速率。

可观察性

Razorpay 工程团队使用VictoriaMetrics和Grafana构建了实时警报系
统。这使他们能够更快地对问题做出反应并调试问题。

速率限制和节流

智能路由请求

Razorpay架构

为了应对流量爆发期间银行系统响应高延迟的挑战,编写了一个基于机器学习
的系统,以智能地将请求路由到其他可用的银行系统。

最初此路由是手动完成的,但当峰值负载达到每秒 200 到 1500 个请求时,
手动路由请求不再可行。

机器学习系统使用支付成功和失败事件来实时预测支付请求应定向到何处。该
模型提供了成功概率,每个银行网关将支付成功率提高了 60%。

除了这些重大变化之外,还对应用程序和基础设施进行了其他一些小的调整,
以帮助系统扩展,例如代码优化、基础设施自动化、从同步处理转向异步处理等。