.Net架构篇:实用中小型公司支付中心设计

前言

说起支付平台,支付宝量级的支付平台和一个小型公司的支付不可同日耳语。一个初创或刚创业一两年的公司,一没人力,二没财力的情况下,如果也想对接支付那怎么办呢?感谢支付宝和微信支付,两大行业巨头提供了简单易用的方案,简化了对接流程,又能支持大部分银行。今天我们就来根据不同业务规模,设计一个能经受业务考验的支付平台。

第一阶段

举个例子,阿力空闲时间,接了个外包的分销系统。业务模型如:成为会员,可以自动带二维码的分销海报,扫描你二维码的人成为会员后,你获得提成。

这个例子有几个核心步骤:

申请会员,支付成为会员,自动生成海报,

计算分销提成。

有点小挑战的自动生成海报。这个可以参考微信参数二维码接口和GDI+绘制图片来搞定,利用html5的canvas也能搞定。

最核心的部分,当然是支付。

先来一张订单表流程图压压场面。

640?wx_fmt=jpeg

订单模型

前些天看领域驱动提到了核心域和子域,那么整个交易流程是是这个模型的核心域,订单表是交易流程的子域。

我大概说下这些字段,业务类型和业务id以及业务处理url实现了各个业务的解藕,各个业务线都有自己的限界上下文。它可以根据取消日期和取消地址完成订单的取消动作,可以根据支付平台交易id和支付平台查询对账。业务通知状态是用来综述通知业务处理是否成功。说完了订单,让我们来看下整体交易流程。

640?wx_fmt=jpeg

交易流程

订单有三个主流程,提交订单是用户主动触发,支付回调是属于支付平台触发,定时取消是后台任务根据设定的取消时间自动运行,小业务可以不考虑订单取消问题。

这样来说,第一版支付中心就完成了。由于刚上线,流量每天很少,平稳了运行一段时间后,也许会出现支付平台支付,但搭建的支付中心却未支付,只能手动修改数据库了,并触发业务回调了,这在最终一致性里,可以成为人工补偿。后来不厌其烦,加了个支付日志,记录任何与支付平台交互的信息,然后每隔一段时间扫描最近变更的日志表,并和订单表对比,发现不匹配的,修复为已支付,完美的解决了这个问题,这在最终一致性里,可概括为定时补偿。

640?wx_fmt=jpeg

交易日志表

老板缺少人手,业务量又上升,又对阿力解决问题的能力很欣赏,就直接把阿力工资翻倍从原公司挖了过来。(故事纯属虚构)

第二阶段

刚过来新公司不久,就接到了一笔融资,然后新公司扩招了很多同事,市场销售人一多,产品线更多,线上支付流量也加快起来。阿力信心满满,觉得很有干劲。得意不久,就遇到了服务线反馈的问题:有客户重复支付,需要退款。于是改订单,清理数据,财务退款,临时解决了问题。后来次数多了,手工处理及易出错,就查询支付宝和微信的自动退款接口,然后依赖日志表记录过支付成功对比判定重复支付,发起退款,引入了自动退款流程。

640?wx_fmt=png

交易流程补充自动退款流程

然后又接到了一个线上客户需要抢购的需求,每月有一天集中一起抢,类似小米秒杀那样。然后到了激动的那天,系统撑过了三分钟,华丽丽的挂了!熬了二十分钟才恢复正常。

痛定思通,支付中心进入重构优化阶段。由于公司人员扩张,有时间和精力和能力去重购优化更健康的业务架构。

一,引入消息队列Rabbitmq支撑流量削峰。如支付回调先进消息队列,由消息队列去通知业务。大幅度缩短单次请求处理时间,提升兵法能力。

二,全面引入Redis缓存,减小数据库访问压力,部分关键业务表启用HttpRuntime缓存,性能指数级提升。

三,引入专业调度工具quartz.net或hangfire。可以用来处理定时查询订单交易问题,及退费问题。

四,购买商业.net监控平台,如听云。检测程序性能。

阿力跟随新公司技术体系,也对支付中心实现了升级。

支付平台回调通知后,先转发到消息队列,由消息队列来通知业务处理,如失败后延时转发到消息队列继续执行,最高重试5次,然后发短信或邮件通知责任人。

针对之前线上支付平台和自建平台不一致问题,利用hangfire调度机制定时每天晚上拉取一周数据和支付平台核对。确保了两个异构系统的一致性。

为防止支付平台同时通知,造成两条支付日志,先更新订单成功后,在队列里,用redis的incr和decr原子性操作,来确保只能同时操作一个订单,另一个通知延迟处理。

数据库开启读写分离,部署集群。

经过阿力和同事们两个月的协力合作与加班加点,新系统终于在那个客户第三次线上抢购前一段时间上线。经过线上抢购验证,新的系统轻轻松松的抗过了抢购,大家一片欢声笑语。阿力看到十几分钟XX百万的交易额惊呆了!,这真是金牌客户啊!

到了年底,微信红包火热起来,许多客户申请开通微信红包,有家客户粉丝有二十多万,发的钱也特别多。当时一到点,十万人齐刷刷摇手机抢红包。最后,重启了几遍应用程序池也不顶用。针对如此的流量,我们应该怎么办呢?每秒万级的请求暂时就不是小公司处理的来的,况且这流量就过年才有,像级了春运。人有那么多,抢到红包的人是有限的。百分之九十五的人都是无效流量。那就取巧吧,随机抽取一部分人的数据进入服务器,其他的人就本地留存吧,通过这种思路减少了一大部分流量。

只考虑第一,第二阶段的话,上面关于支付中心的思考架构是完全可以满足交易量的。况且又有多少公司能迈向独角兽之路呢?

念天地之悠悠,独怆然而泪下!

第三阶段

上面那种方式虽然取巧,针对特定业务,本来就是抢红包,大部分人都是无效的,能说的过去,假如是主业务流程有万级每秒甚至百万千万级每秒的请求量应该怎么办呢?阿力陷入了迷茫。

听说过docker,kuberneters为代表的容器编排,听说过CI/CD自动部署,听说过微服务的强大,听说过负载均衡,仿佛都是方向。

大海跨不过陆地,台风却能轻易穿梭,大化为小,繁化为简,聚简成面,规模化微服务也许才是解决巨量请求之道!(故事纯属虚构,不要代号入座)

附录:最终一致性

说完了解决中小型流量的问题,我们来了解下一致性问题。

1、关系型数据库事务追求ACID:

A: Atomicity,原子性

C: Consistency,一致性

I: Isolation,隔离性

D: Durability,持久性

2、CAP(帽子理论)

C:Consistency,一致性, 数据一致更新,所有数据变动都是同步的

A:Availability,可用性, 好的响应性能,完全的可用性指的是在任何故障模型下,服务都会在有限的时间处理响应

P:Partition tolerance,分区容错性,可靠性

帽子理论证明,任何分布式系统只可同时满足二点,没法三者兼顾

3、Base模型:

BA:Basically Available,基本可用

S:Soft State,软状态,状态可以有一段时间不同步

E:Eventually Consistent,最终一致,最终数据是一致的就可以了,而不是时时保持强一致

利用查询模式,补偿模式,异步确保模式,定时校对模式等可实现分布式系统最终一致性。


最终一致性更详细用法参考李艳鹏老师关于分布式一致性的讲解。https://www.jianshu.com/p/1156151e20c8?from=singlemessage&isappinstalled=0

后言

阿力解决了支付中心的稳定问题后,就买了许多书,看到了上面关于最终一致性的陈述时,心里想到,这些都是我已经实现了的,原来还有这么多头头道道??

阿力又看到了领域驱动设计等书,感慨:支付领域模型真是学习领域驱动设计的最好实践。它具有独立的限界上下文,通过回调url和其他业务限界上下文沟通。


最后再用交易流程在做个总结吧!


640?wx_fmt=png

交易流程

关键点:

1.回调部分,有消息队列通知,并支持失败重试。

2.每天晚上定时拉取支付平台对象记录核账,保证最终一致性。

3.支付平台回调时,根据支付日志判定是否重复支付,重复支付的发起自动退款。

源码

计划用.netcore按领域驱动的方式,完成以上设计。日期未定。

声明

全文除附录部分最终一致性外,均为原创。如文章能给你带来帮助,请点下推荐,感谢支持。

相关文章:

  • ICanPay 统一支付网关

  • ASP.NET Core 2.0 使用支付宝PC网站支付

  • ASP.NET Core Web 支付功能接入 微信-扫码支付篇

  • 微信和支付宝支付模式详解及实现(.Net标准库)

原文链接:https://www.cnblogs.com/fancunwei/p/9612567.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

【期望】选书问题(金牌导航 期望-7)

选书问题 金牌导航 期望-7 题目大意 有n个人,每个人有自己的选书目录,一个人有p的概率选当前的书,有1-p的概率不选,即去查看下一本书(过n后回到1),现在问你选书的逆序对的期望数 输入样例 …

[CSA49G][XSY3315] Bunny on Number Line (DP)

CSA49G XSY3315 因为判断两串是否本质不同只看某几项是不是好数,与究竟是哪个好数无关,所以考虑转换一下题意: 给出一个长度为aka_kak​的01串SSS,第a1,a2,...,aka_1,a_2,...,a_ka1​,a2​,...,ak​项为1,其余项为0。 …

Rabbit的工作(2)

牛客网 文章目录题目描述题解:代码:题目描述 Rabbit通过了上次boss的考核,现在她又遇到了一个问题。 Rabbit接到了K个任务,每个任务她可以自由选择用i天去完成(1≤ i≤ N)。刁钻的boss想让Rabbit恰好用W天完成所有任务。 已知Rabb…

jzoj6065-[NOI2019模拟2019.3.18]One?One!【FFT】

正题 题目链接:https://gmoj.net/senior/#main/show/6065 题目大意 oneness(x)oneness(x)oneness(x)表示xxx的约数中全是111的数的个数,给出一个长度为lll的随机生成的数nnn,求∑i1noneness(i)\sum_{i1}^noneness(i)i1∑n​oneness(i) 解题思路 转换一…

netcore编程之后面对不习惯的xshell黑屏部署,是时候使用jenkins自动化发布工具了...

在很久之前net还只能在windows上部署的时候,或许很多创业公司的朋友发布项目还都是人肉部署,反正windows都是可视化的界面,拖拖拉拉,开开关关还不是特别麻烦。。。现如今你的项目需要在linux上部署,可惜的是再也没有什…

【期望】关灯游戏(金牌导航 期望-8)

关灯游戏 金牌导航 期望-8 题目大意 有n盏灯,有些是亮的,有的是暗的,现在如果按一个位置的开关,那么是它因数的位置的灯都会改变开关情况,现在如果用k步不能直接关完,就随机按,直到可以k步关…

【招聘(重庆)】新空间(重庆)科技有限公司招聘.NET Core

全新平台公司,技术氛围好,未来上升空间巨大!平台架构师薪资范围:15K至40K岗位职责:1、负责公司业务以及相关平台的架构设计、技术选型、研发工作, 参与产品架构的规划与设计;2、遵循总体的架构规划与规范设计项目的应用…

jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】

正题 题目链接:https://gmoj.net/senior/#main/show/6067 题目大意 nnn个点的一张竞赛图&#xff0c;第iii个点向第jjj个点(i<j)(i<j)(i<j)连边的概率是ppp&#xff0c;否则就是第jjj个点向第iii个点连边。 对于每个i(i<n)i(i<n)i(i<n)求出能够选出一个大小…

[XSY3320] string (AC自动机,哈希,点分治)

XSY3320 前置芝士&#xff1a;回文前缀&&borderborderborder 推荐博客 推荐博客 考虑点分治&#xff0c;问题变成求经过重心的回文路径个数。 一条经过重心的回文路径长这样&#xff1a; xxx到zzz的串与yyy到rootrootroot的串相同。 建出根到每个节点对应的串的AC自…

【期望】守卫挑战(金牌导航 期望-9)

守卫挑战 金牌导航 期望-9 题目大意 有n个数&#xff0c;到第i个数&#xff0c;有p_i的概率选择这个数&#xff0c;问你最后选了最少L个数&#xff0c;且选的数的和再加k大于等于0 样例输入 3 1 0 10 20 30 -1 -1 2样例输出 0.300000数据范围 0⩽k⩽20000\leqslant k\leq…

xinjun与阴阳师

来源&#xff1a;牛客网 文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 xinjun是各类手游的狂热粉丝&#xff0c;因随手一氪、一氪上千而威震工大&#xff0c;现在他迷上了阴阳师。xinjun玩手游有一个习惯&#xff0c;就是经过层层计算制定出一套方案来使操作利益…

P3311-[SDOI2014]数数【AC自动机,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3311 题目大意 求一个不超过nnn的数字使其不包含任何sss集合中的数字串。 解题思路 很经典的ACACAC自动机上面dpdpdp&#xff0c;但是因为是数字所以要来点数位dpdpdp的东西&#xff0c;多开一维用0/10/10/1表示是否在上界…

如何在 ASP.Net Core 中使用 Consul 来存储配置

原文: USING CONSUL FOR STORING THE CONFIGURATION IN ASP.NET CORE作者: Nathanael[译者注&#xff1a;因急于分享给大家&#xff0c;所以本文翻译的很仓促&#xff0c;有些不准确的地方还望谅解]来自 Hashicorp 公司的 Consul 是一个用于分布式架构的工具&#xff0c;可以用…

[XSY3381] 踢罐子(几何)

XSY3381 点被选为点对之一的贡献我们单独计算&#xff08;这部分贡献的总和为4n(n−1)(n−2)4n(n-1)(n-2)4n(n−1)(n−2)&#xff09;。接下来只讨论剩余部分的贡献。 先把任意三个点构成的六种选择方案合并&#xff0c;发现在外接圆周和弦之间的点每个有2的贡献&#xff0c;…

GDKOI2021总结

前言 因为疫情的原因&#xff0c;以学校为单位在校参加&#xff01;&#xff08;就很秃然&#xff09; 注&#xff1a;前三天是普及组&#xff0c;后三天是提高组 Day 1 第一次参加&#xff0c;以为会被虐得成狗&#xff0c;以忐忑的心情打开T1 4⩽n⩽20004\leqslant n\leqs…

The Bottom of a Graph Poj 2553

牛客网 poj 2553 文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Description We will use the following (standard) definitions from graph theory. Let V be a nonempty and finite set, its elements being called vertices (or nodes). Let E be …

P7244-章节划分【RMQ,贪心,递归】

正题 题目链接:https://www.luogu.com.cn/problem/P7244?contestId38911 题目大意 nnn个数字&#xff0c;分成连续非空的kkk段要求每一段的最大值的gcdgcdgcd最大。 解题思路 首先答案一定是最大值的约数&#xff0c;这些数不多我们可以枚举这些数xxx。然后我们称xxx的倍数的…

[XSY3382] 专家系统(二分+线段树)

XSY3382 二分ccc&#xff0c;问题变成能否用一个长ccc宽ccc的矩形框住至少kkk个点。 二维数点问题考虑用扫描线解决。将所有点按照xxx从小到大排序。 枚举一段xxx坐标相差不超过ccc的点&#xff08;双指针推进&#xff09;&#xff0c;初始想法是根据这些点的yyy值建一棵权值…

关于.NET Core是否应该支持WCF Hosting的争论

本文要点本文试图回答“.NET Core 是否应该支持 Windows 通信基础&#xff08;WCF&#xff09; Hosting&#xff1f;”的问题&#xff1b;支持者论据&#xff1a;许多工程师喜欢把 WCF 作为一种编程模型&#xff0c;不希望因为迁移到 .NET Core 而产生&#xff08;机会成本&…

战争尾声(nowcoder 215073)

战争尾声 nowcoder 215073 题目大意 在平面直角坐标系&#xff08;x,y范围均为1~200&#xff09;上&#xff0c;给你n个点&#xff0c;让你找到一个点&#xff0c;使其到所有点直线距离相等&#xff08;答案坐标均为整数&#xff09; 输入样例#1 2 1 2 2 1输出样例#1 1 1…