图解支付文件网关:文件交互的底座

news2025/1/26 15:53:31

在上一篇《图解支付报文网关:一种低代码报文网关的设计思路与核心代码实现》,我们深入讨论了报文网关的设计与实现,今天和大家聊聊文件网关的设计与实现。

在这篇文章中,你可以了解到文件网关的作用,什么情况下文件网关需要独立部署,文件网关的几种常见形态,如何抽象通用的模块进行复用。

1. 前言

在支付系统中,和外部银行通道一般有两种信息交互模式:

  1. 实时报文交互:组装指定的格式(JSON,KV等)报文实时发给外部银行通道,银行一般是实时返回结果,或异步通知返回结果。现在一般是通过https进行传输,以前还有直接通过socket传输,现在很少见到。

实时报文交互一般用于支付通道的支付、退款、签约、解约等。

  1. 文件交互:组装文件,发给外部银行通道,或者外部银行通道生成文件,供我方下载处理。一般是通过SFTP进行传输,有些特殊的是通过邮件或https进行传输。

文件交互一般用于支付通道的清算文件,流出转账渠道的流出指令等。

2. 术语

  1. 文件交互

文件交互是指支付平台与银行或其他金融机构之间通过文件形式进行数据交换的过程。与实时接口(如API调用)相比,文件交互通常用于处理批量指令,实时性要求不高。常见的场景包括银行提供的清算文件处理、流出转账的批量指令等。

  1. 文件接口

文件接口是指支持文件格式数据交换的通信界面。在支付系统中,文件接口允许系统批量导入或导出数据,如转账指令、清算数据等,通常以CSV、XML或其他特定格式的文件进行数据传输。

  1. 批处理

批处理是指将一组数据或指令作为一个批次进行处理的过程。在支付系统中,批处理常用于处理大量类似的交易或数据更新任务,如夜间批量处理银行清算文件或执行批量转账指令。

  1. 批转单

批转单是将一批数据或指令分拆成单条进行处理的过程。比如外部银行的一个清算文件通常包含了几百万条数据,把这些文件的内容解析后,一条条发给内部系统进行处理,就是批转单的应用。

  1. 单转批

单转批是指将多个单独的指令聚合成一个批次进行统一处理的过程。比如流出转账指令,上游发下来的是一条条单个转账指令,把这多个指令汇总成一个文件发给外部银行,就是单转批的应用。

  1. PGP加解密

Pretty Good Privacy,是一种加密程序,用于信息传输的加密和解密,保证电子数据的安全性。它通过使用公钥加密和私钥解密的方法,实现了信息的机密性和完整性,同时也支持数字签名以确保信息来源的真实性。

有个形象的说法,PGP就像一个信封一样,不但加密保护里面的信息,还通过签名确定真实的来源。

3. 文件网关在支付系统中的地位

文件网关最核心的作用就是解决文件交互的问题。

再细化分为两种:

  1. 单转批:把内部指令,打批成一个文件,然后上传到外部银行的SFTP上。
  2. 批转单:把外部银行生成的文件,下载后并解析一条条内部需要的数据,然后发给内部应用处理。

4. 文件网关在什么情况下需要独立应用

在一些小型支付公司,一般没有独立的文件网关,可能只是一个小模块,正常也是能运行的。

但是对于大型支付公司来说,和外部银行通道一天的交易可能有几千万笔,一个清算文件有上百M,如果和实时交易系统共用应用,有可能会影响实时交易(比如支付业务),在这种情况,就需要把文件网关独立出去。也就是实时交易和非实时交易拆分开,互相不影响。

5. 文件网关的几种形态

一般来说,从简单到复杂、从固定到灵活,文件网关和实时报文网关会一样,也存在四种形态:

  1. 纯手撸代码
  • 在这种最初级的形态中,每个外部文件都需要单独的代码实现。
  • 优点:针对性强,可以精确控制每个文件的交互细节。
  • 缺点:随着接入通道的增多,代码变得越来越复杂,维护和扩展的成本急剧上升。

  1. 模板方法文件网关
  • 这种形态通过引入模板方法模式,将文件处理流程的共通部分抽象出来,提供统一的处理框架,同时留有接口供具体文件实现其特定逻辑。
  • 优点:提高了代码的重用性,降低了维护成本。
  • 缺点:对于一些特殊需求,模板方法可能仍然不够灵活,需要额外的定制。

  1. 低代码文件网关
    • 低代码文件网关把所有核心的代码逻辑抽象出来,每个文件只需要写一个配置文件,就可以完成文件的对接。
    • 优点:极大地提高了灵活性和易用性,加快了新文件的接入速度,核心代码由有经验的资深工程师编写,减少出错可能性。
    • 缺点:复杂场景下可能需要写一些内联函数,造成了一定复杂度。

  1. 产品化配置文件网关
    • 在低代码报文网关基础上,提供图形化配置界面,进一步降低使用难度。
    • 优点:极大地提高了易用性,加快了新文件的接入速度,以前写代码可能需要4、5天才接一个文件,变成可能0.5天就能接入一个文件。
    • 缺点:平台的初始研发成本很高,如果接入的文件不多,ROI就不够高。

每种形态都反映了各公司在特定时期的技术水平和方案选型,但总体来说,对于中大型公司来说,低代码报文网关和产品化配置报文网关是一个比较不错的选择。一方面可以提高效率,减少出错的可能,另一方面也有足够的研发资源来建平台。

6. 低代码文件网关的设计思路

看过《图解支付报文网关:一种低代码报文网关的设计思路与核心代码实现》的同学可能知道,实时报文的核心处理流程是固定的,其实文件网关的处理流程也是固定的。下面文件下载为例说明设计思路,上传逻辑也是差不多的。

从上图可以看到,标准流程只有5个:

  1. 任务调度:一天的什么时候执行,执行多少次等。一般使用CRON表达式来做。比如银行的清算文件每天凌晨5点生成,那么一般设计任务在5点到7点之间执行,每30分钟尝试一次。
  2. 登录SFTP并下载:一般是SFTP,也有可能是邮件,设计成接口就行。如果是SFTP,一般SFTP的主机名,用户名,密码,目录,文件名规则等。其中文件名一般是每天变化,建议使用正式表达式来做。
  3. 文件解密:这个一般是可选的,有些银行可能会使用PGP加密,这种情况下,就先进行解密,需要用到银行公钥进行验签,我方私钥进行解密。
  4. 文件解析:根据银行接口文档,可能有XML,CSV,EXCEL等多种格式,相关的代码在网上都有。最主要的是解析出我方需要的数据,比如银行可能叫:charge_no,我们内部叫:pay_no,那就把对方的数据解析后并映射到内部的数据。
  5. 发消息:根据消息体配置,把一条数据按照消息体的配置,组装成消息,通过消息中间件发出去。

我们只需要把上面5个步骤所做的操作,全部抽象出单独的代码,然后通过配置文件来驱动即可。

7. 文件网关架构图

几点说明:

  1. 核心上下文:把解决配置、临时变量等保存在上下文中,供后面流程引擎驱动文件的解析或打批。
  2. 核心处理Handler:把核心处理能力抽象成通用的Handler,比如上传下载,报文解析,报文映射,消息发送等。
  3. 流程引擎:把各handler组成一个责任链,依次执行。
  4. 配置中心:提供产品化配置的能力。
  5. 流程管控:解决发布和回滚问题。

8. 核心代码实现

核心的代码实现思路和报文网关基本是一致的,详见:《图解支付报文网关:一种低代码报文网关的设计思路与核心代码实现》。

但是具体的代码实现和报文网关是不一样的,比如SFTP下载通常使用jsch来做,PGP加解密也有公开的组件,csv文件使用使用Apache Commons CSV库解析等。

另外的区别在于文件网关需要考虑任务调度,失败重试等,而报文网关是不需要考虑的,失败就由上游发起重试。

实现有困难的同学可以私聊。

9. 常见问题及应对方案

文件网关主要处理批量文件,有几个特殊的地方需要重点考虑,否则在后续的运维过程中可能是一头的包:

  1. 任务分配不均

在分布式场景下,有多台服务器并发处理任务,如果调度系统设计不好,有可能部分服务器持续高负载处理,部分服务器持续在闲置,一些任务一直在排队,无法得到及时处理。

一般这种情况下,最简单的做法,就是随机调度一台服务器执行。另一种做法就是轮询法,先通过接口判断服务器当前状态是否空闲,如果正在执行任务,就找下一台,直到找到空闲的服务器。

  1. 任务踩踏与并发执行

所谓任务踩踏,就是一个任务执行的时间非常久,在还没有结束时,另外一台服务器(也可能是同一台服务器)也被调度起来执行相同的任务,导致一个任务被两个服务器并行处理。

常用的解决方案,就是给任务加锁,但是加锁时需要设计超时释放。因为有可能任务跑到一半服务器重启,如果锁不释放,这个任务就无法重新被捞取执行。

  1. 瞬时超大并发流量

文件网关解析文件是很快的,有可能几分钟解析出几百万条数据,如果不做任何保护措施,有可能瞬间对内部系统造成上万TPS的高并发压力,进而有可能影响在线实时业务的处理。

一般来说,文件网关不要通过RPC直接调用内部应用,而是通过消息的形式通知内部应用。主要考虑:文件网关短时间内解析出大批量的数据,如果直接调用内部应用,内部应用如果不限流,有可能把内部应用打到宕机,如果做了限流,文件网关还需要做调用失败重试。

如果通过消息中间件的形式通知内部应用,一方面可以由内部应用根据自己的能力来控制数据消费的速度,另一方面可以由消息中间件来缓存数据,无论是文件网关还是内部应用的实现都可以做得比较简单。

  1. 通过RPC还是消息交互

如果是内部应用调用文件网关,建议使用RPC调用,这样比较简单。比如流出打款的指令。

如果是文件网关调用内部应用,建议使用消息中间件。解决文件网关瞬时超大并发流量对内部应用的冲击问题。

  1. 任务恢复与重试

对于大文件的执行,有可能执行一半服务器就被重启,这种情况下就需要做任务恢复,对应的,上下游都需要做好幂等设计,因为部分数据可能会被重复解析并发送。

  1. 异常单据处理

外部银行通道生成的文件,有可能因为系统BUG导致生成的部分数据的格式或内容有问题,无法正常解析。

常用的解决方案一般也是两种:1)记录有问题的数据,继续往下执行。2)任务终止,等外部银行修复文件后,重新执行。

一般是建议记录后,继续执行。主要是考虑外部银行修复会比较慢,有问题的数据放在差异里面去处理更好。

另外,对于部分数据缺失的场景,我们还可以主动补齐数据。比如正常情况下,外部银行通道需要给我方单号,银行单号,金额,币种等数据,假如一个包含几百万条数据的文件中有5条数据没有给我方单号,但是银行单号、金额、币种都能对上,那么我们就自行补全我方单号就行。没必要非得从几百万条数据中取出5条让银行补上。

  1. 顺序执行与并发执行

对于银行的清算文件来说,系统正常是按顺序执行的,比如先解析20240101的数据,再解析20240102的数据,如果在解析20240101数据出现问题,通常也有两种方式:一、卡住,等20240101处理完成,才处理20240102。二、不管20240101失败,继续处理20240102的数据。

这里体现的是两种思维方式:顺序执行与并发执行。一般来说,推荐使用并发执行,一个任务失败,不要影响另一个任务。

10. 结束语

在本文中,我们探讨了文件网关在支付系统中的定位、不同形态的发展,到一种低代码设计思路,以及对应的系统架构。一个完整的文件网关代码量比较多,这里没有贴,后面在一些技术专题的拆解中,再贴上一些代码供参考,比如讲工厂模式,讲责任链模式。因为整体代码没有什么特别难的地方,无外就是把原理想清楚,加上一些常见的设计模式就能实现。

这是《百图解码支付系统设计与实现》专栏系列文章中的第(24)篇。和墨哥(隐墨星辰)一起深入解码支付系统的方方面面。

欢迎转载。

Github(PDF文档全集,不定时更新):GitHub - yinmo-sc/Decoding-Payment-System-Book: 百图解码支付系统设计与实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1454211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stable diffusion webui学习总结(2):技巧汇总

一、脸部修复:解决在低分辨率下,脸部生成异常的问题 勾选ADetailer,会在生成图片后,用更高的分辨率,对于脸部重新生成一遍 二、高清放大:低分辨率照片提升到高分辨率,并丰富内容细节 1、先通过…

多线程---线程同步,线程通信

线程同步 1.概述 线程同步是多线程编程中的一个重要概念,它指的是在多线程环境中,通过一定的机制保证多个线程按照某种特定的方式正确、有序地执行。这主要是为了避免并发问题,如死锁、竞态条件、资源争用等,确保数据的一致性和完…

超强!中科院1区算法改进!改进雪融优化GVSAO-CNN-BiGRU-Attention融合注意力机制预测程序代码!直接运行!

适用平台:Matlab2023版及以上 雪消融优化算法(Snow Ablation Optimizer,SAO),于2023年6月发表在SCI、中科院1区顶级期刊《Expert Systems With Applications》上。该算法刚刚提出,目前还没有套用这个算法的…

【Java EE初阶十七】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制,都是在保证 tcp 的可靠性; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了); 滑动窗口,就让可靠传输对性能的影响,更…

【摸鱼日常】使用Docker部署RPG网页小游戏

一、本次实践介绍 1. 本次实践简介 本次实践部署环境为个人测试环境,快速使用docker部署RPG网页小游戏。 rootWellDone:/home/goodjob# uname -a Linux WellDone 6.5.0-14-generic #14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2 x86_64 x86_…

SG5032VAN晶体振荡器规格书

SG5032VAN是一款具备高精度、高稳定性及多功能的石英晶体振荡器,通过锁相环技术和AT晶体单元实现宽频率范围,能够满足各种应用场景的需求。频率范围从73.5 MHz到700 MHz,可以满足多种无线通信设备和系统,供电电压2.5V/3.3V,为用户提供了更加灵活的电源选择。还具备输…

通俗的讲解什么是机器学习之损失函数

想象一下,你在玩一个靶心射击的游戏,你的目标是尽可能让箭簇命中靶心。在这个游戏中,损失函数可以看作是测量你的箭簇与靶心距离的规则。损失函数的值越小,意味着你的箭簇离靶心越近,你的射击技能越好。 在机器学习中…

Mouse Anti-HDM IgE Antibody Assay Kit

哮喘作为一种常见的慢性炎症类疾病,影响着全世界约3亿各年龄段的人。哮喘一般是由于暴露于过敏原(尘螨、宠物皮屑、花粉及霉菌等)引起的,其特征是气流阻塞和支气管痉挛。屋尘螨(house dust mite, HDM)是最常…

贪心算法练习day2

删除字符 1.题目及要求 2.解题思路 1)初始化最小字母为‘Z’,确保任何字母都能与之比较 2)遍历单词,找到当前未删除字母中的最小字母 3)获取当前位置的字母 current word.charAt(i); 4)删…

BUGKU-WEB 变量1

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; flag In the variable !<?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET[args])){$args $_GET[args];if(!preg_match("/^\w$/",$args…

深度学习系列53:大模型微调概述

参考系列文章&#xff1a;https://zhuanlan.zhihu.com/p/635152813 github链接&#xff1a;https://github.com/liguodongiot/llm-action 1 训练范式 下面这种instructive learning&#xff0c;在模型参数达到80亿后&#xff0c;会发生质的提升&#xff1a; 类似的还有手写pr…

error: ‘QWidget‘ file not found

说明你没有加载 widgets模块 缺少widgets&#xff0c;就报错

【Java EE初阶十二】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制&#xff0c;都是在保证 tcp 的可靠性&#xff1b; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了)&#xff1b; 滑动窗口,就让可靠传输对性能的影响,更…

CSS 圆形的时钟秒针状的手柄绕中心点旋转的效果

<template><!-- 创建一个装载自定义加载动画的容器 --><view class="cloader"><!-- 定义加载动画主体部分 --><view class="clface"><!-- 定义类似秒针形状的小圆盘 --><view class="clsface"><!-…

从概念到现实:数字孪生在智慧园区建设中的实现路径

目录 一、引言 二、数字孪生与智慧园区的关联 三、数字孪生技术的核心要素及实现路径 1、数据采集与处理 2、建立数字孪生模型 3、实时更新与优化 4、实现与智慧园区的集成 四、数字孪生技术在智慧园区中的应用场景 1、能源管理 2、安全监控 3、设施管理 五、面临的…

解读OpenAI视频生成模型Sora背后的原理:Diffusion Transformer

Diffusion Models视频生成-博客汇总 前言&#xff1a;OpenAI最近推出的视频生成模型Sora在效果上实现了真正的遥遥领先&#xff0c;很多博主都介绍过Sora&#xff0c;但是深入解读背后原理的博客却非常少。Sora的原理最主要的是核心模型主干《Scalable Diffusion Models with T…

119. Pascal‘s Triangle II(杨辉三角 II)

问题描述 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 问题分析 其实这个问题与118.杨辉三角解决思路一样&#xff0c;只不过此问题只返回杨辉三角的某一行而已。 代码 i…

BUGKU-WEB eval

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?>解题思路 PHP代码审计咯 相关工具 百度搜索PHP相关知识 解题步骤 分析脚…

JDK-JVM-hotspot

JVM JDKJDK内部体系结构&#xff1a;JVM 与 跨平台JVM在程序运行过程中的运行细节&#xff0c;内存分配 和 流转模型。JVM结构体系1. 虚拟机栈2. 线程栈2.1. 栈帧2.2. 数据结构栈 与 线程栈 的关系&#xff1a;2.3.栈帧的内部结构&#xff1a;2.4 方法中的数据 在栈帧中的流转过…

《Go 简易速速上手小册》第7章:包管理与模块(2024 最新版)

文章目录 7.1 使用 Go Modules 管理依赖 - 掌舵向未来7.1.1 基础知识讲解7.1.2 重点案例&#xff1a;Web 服务功能描述实现步骤扩展功能 7.1.3 拓展案例 1&#xff1a;使用数据库功能描述实现步骤扩展功能 7.1.4 拓展案例 2&#xff1a;集成 Redis 缓存功能描述实现步骤扩展功能…