高频交易支付架构并不复杂( 二 )


文章插图
 
如上图所示,web服务器将不再直接连接主库DB1,而是连接KeepAlive虚拟出的一个虚拟ip,再将此虚拟ip映射到主库DB1上,同时添加DB_bak从库,实时同步DB1中的数据 。
正常情况下web还是在DB1中读写数据,当DB1宕机后,脚本会自动将DB_bak设置成主库,并将虚拟ip映射到DB_bak上,web服务将使用健康的DB_bak作为主库进行读写访问 。
这样只需几秒的时间,就能完成主数据库服务恢复 。
组合上面的结构,得到主从高可用结构图:

高频交易支付架构并不复杂

文章插图
 
数据库高可用还包含数据修补,由于我们在操作核心数据时,都是先记录日志再执行更新,加上实现了近乎实时的快速恢复数据库服务,所以修补的数据量都不大,一个简单的恢复脚本就能快速完成数据修复 。
数据分级支付系统除了最核心的支付订单表与支付流水表外,还有一些配置信息表和一些用户相关信息表 。如果所有的读操作都在数据库上完成,系统性能将大打折扣,所以我们引入了数据分级机制 。
我们简单的将支付系统的数据划分成了3级:
  • 第1级:订单数据和支付流水数据;这两块数据对实时性和精确性要求很高,所以不添加任何缓存,读写操作将直接操作数据库 。
  • 第2级:用户相关数据;这些数据和用户相关,具有读多写少的特征,所以我们使用redis进行缓存 。
  • 第3级:支付配置信息;这些数据和用户无关,具有数据量小,频繁读,几乎不修改的特征,所以我们使用本地内存进行缓存 。
使用本地内存缓存有一个数据同步问题,因为配置信息缓存在内存中,而本地内存无法感知到配置信息在数据库的修改,这样会造成数据库中数据和本地内存中数据不一致的问题 。
为了解决此问题,我们开发了一个高可用的消息推送平台,当配置信息被修改时,我们可以使用推送平台,给支付系统所有的服务器推送配置文件更新消息,服务器收到消息会自动更新配置信息,并给出成功反馈 。
粗细管道举个简单的例子,我们目前订单的处理能力是平均10万下单每秒,峰值14万下单每秒,如果同一秒钟有100万个下单请求进入支付系统,毫无疑问我们的整个支付系统就会崩溃,后续源源不断的请求会让我们的服务集群根本启动不起来,唯一的办法只能是切断所有流量,重启整个集群,再慢慢导入流量 。
我们在对外的web服务器上加一层“粗细管道”,就能很好的解决上面的问题 。
高频交易支付架构并不复杂

文章插图
 
请看上面的结构图,http请求在进入web集群前,会先经过一层粗细管道 。入口端是粗口,我们设置最大能支持100万请求每秒,多余的请求会被直接抛弃掉 。出口端是细口,我们设置给web集群10万请求每秒 。
剩余的90万请求会在粗细管道中排队,等待web集群处理完老的请求后,才会有新的请求从管道中出来,给web集群处理 。
这样web集群处理的请求数每秒永远不会超过10万,在这个负载下,集群中的各个服务都会高校运转,整个集群也不会因为暴增的请求而停止服务 。
如何实现粗细管道?Nginx商业版中已经有了支持,相关资料请搜索
nginx max_conns,需要注意的是max_conns是活跃连接数,具体设置除了需要确定最大TPS外,还需确定平均响应时间 。
end:如果你觉得本文对你有帮助的话,记得关注点赞转发,你的支持就是我更新动力 。
如果您有不同的看法,欢迎在评论区留言与我们一起讨论

【高频交易支付架构并不复杂】


推荐阅读