账户账务系统架构与实践

       由于企业每条业务线都有各自的用户、商家以及运营补贴策略。在开始阶段我们并没有统一的账务系统,每个业务线都有类似账务系统相应的系统。导致的问题就是资金池业务吻合严重,对账难,以及数据不统一,另外成本也非常高,为此我们做了统一的账户系统。账务系统作为到家业务线的基础服务,为到家业务提供统一清算、账户、对账、财务报表能力。

一、账务系统概况

       目前账户系统的日均流水金额达上亿级别。我们按照业务线进行分库,保证每个业务线落在同一数据源上,对于数量快速增长的表水平拆分。另外还对一些数据量增长较快,但是只访问近期新增数据的表做了冷热数据分离,定期备份。

二、账务系统架构 

1.1、支付平台架构

       以整个支付的流程来对支付平台的架构做个说明:用户下单 -> 交易生成账单 -> 用户确认支付 -> 交易校验账单 -> 生成交易请求 -> 收银台调起三方完成支付 -> 同步交易、同步业务线。此时交易系统会对卡券进行核销。
       交易系统完成后,账单会推送到账务系统,账务系统进行记录,清算,入账等

1.2、清结算流程

       因为业务的特色,清算分为不同的模块,有银行渠道、合作机构、分佣、优惠券、保险等。清算后生成账户流水,对账户流水做归档、核算等处理。

1.3、对账系统

       对账系统是一个非常核心的系统。目前分为多级别对账和多频次对账。多级别分为分账对账:对各种流水,以及总账对账,总分对账:流水与总金额的对账。多频次对账分为日对账,准实时对账,交易推送账单之后约十分钟进行检查,账务系统会查询这笔账单是否存在,以及对账单的金额进行对账。对账系统会尽快的发现问题,进行差错处理。出错处理主要是挂账、补单、退款和登账。

1.4、监控系统 

       账务系统最核心的问题是稳定、数据准确、无异常,且能在第一时间发现问题,尽量降低问题带来的影响。因此监控系统显得尤为重要。
       目前监管系统主要用来做异常报警和数据埋点。异常报警很好理解,就是系统中如果出现错误就会在开发时打错误日志,扫描到有错误出现就会通过手机短信发送给开发人员,开发人员就会尽快查询报警原因和对日常报警是否有数据影响,进行相应的处理。
       数据埋点,就是对关心的数据做埋点(如每天总额、账单总额、商家提现总额),对埋点数据进行收集、分析、展现。若展现的数据跟平常有较大差异,我们会找出数据差异原因,看是否有问题。保证有问题能及时发现,及时补救处理。

三、账务系统的挑战 

从技术层面来说,主要分幂等性数据一致性两块。

3.1、幂等性

       大多数系统会拆分成多个子系统服务,而一个子系统往往会调用另一个服务,服务之间相互调用就有可能出现服务器处理完毕后没有返回结果的情况。客户端没有接收到返回结果,就可能重复调用。幂等性是系统的接口对外的一种承诺(而不是实现), 承诺只要调用接口成功, 外部多次调用对系统的影响是一致的。
       目前账户系统主要是根据业务需求做了几种幂等性

1、充值时对充值流水号做了唯一的处理,外部调用充值接口时,传一个唯一的流水号,判断这个流水号在系统中存在,就返回,多次调用,也不会给这个账户进行累加充值。
2、对奖惩做了外部唯一 ID 的幂等性,调用者会传入唯一 id ,根据唯一 id 判断此笔奖惩是否已经进行清分入账。
3、订单则有区别,因为订单有一个退款的流程,如果把订单做唯一性,订单发生退款时无法区分这个订单是新增加的,还是退款的,这样的话账户的金额就可能不准确。因此采用了账单金额轧差
       订单轧差是什么呢?举个例子,商家第一次支付的金额,传到账务系统进行清算,比如通过支付宝支付 100 元,那么给这个商家进行入账,入 100 元,下次该订单发生了退款,假设退 90 元(此时交易系统会将该订单实际支付金额传到账务系统,即 10元),实际上本次需要给商家入账 -90 元,而不是 10 元,此次用账单的金额 -90 元跟旧的金额 100 进行一个轧差,利用轧差结果进行清算入账。
4、提现失败返还,根据申请提现生成的提现 id 反查账户流水表,看是否有提现并且没有提现返还,根据流水金额反向生成流水返还记录及入账,保证幂等性。

3.2、数据一致性

1、本地事务
       按照业务线进行分库,使得对同一个业务线的操作均落到同一数据源上,利用本地事务进行数据的访问和更新,从而保持数据一致性。

2、柔性事务(需幂等)
主要采用了 TCC 模式和事务补偿的模式。

T:Try。 完成所有业务检查,预留出必须业务资源);
C:Confirm。真正执行业务,不做任何业务检查,只是用 Try 阶段预留的业务资源;
C:Cancel。取消执行业务,释放资源。

       在 Try 这段,是对这个数据进行一个验证,验证通过之后,将数据资源进行预留。在 Confirm 阶段,只对这个数据直接进行操作,而不进行验证处理,但是只操作预留这部分的数据。若是发生取消的操作,将预留的操作返回到账户。TCC 模式主要是用于余额消耗。当商家只能用余额支付时,先将其余额支付的金额进行冻结,真正对账单进行结算时,只使用第一部分冻结的金额,而期间不做任何验证,订单完成支付时,对它冻结的这部分金额做真正扣减。如果中间订单取消了,将冻结的金额进行返还,这样保证账户里的金额真正发生消耗时是充足的,不用进行反复的检查。
       事务补偿就是操作失败后的补偿。申请提现的时候将账户的金额进行扣减,只要申请提现成功,那么账户金额就做扣减。真正提现出金结果,则会通知账务系统,若出金失败,账务系统对提现系统的 ID 进行查询,按照提现申请时生成的账户生成提现失败返还流水,按照返还流水更新账户金额。

3、消息队列(消息应答ACK机制)
       交易系统是通过发送异步消息到账务系统,账务系统处理成功之后,ack 消息;处理失败则不 ack 消息。利用消息系统重复发送机制再次发送消息,保证账务系统每条消息均可处理成功。但可能会发生 ack 消息后,消息系统未接收到,那么就会重复的发送。所以用消息队列 ack 机制,一定要保证幂等性。例如:RabbitMQ支持消息应答。消费者发送一个消息应答,告诉RabbitMQ这个消息已经接收并且处理完毕了,RabbitMQ就可以删除它了。

4、分布式锁
       直接锁定资源避免了多节点操作引起的数据不一致,只有业务上的硬性要求的时候才用,目前用于控制提现申请的频率。

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

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

相关文章

原 R语言柱状图排序和x轴上的标签倾斜

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_35242986/article/details/69503875 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_…

Google 资深软件工程师 LeetCode 刷题笔记首次公开

BAT 等国内的一线名企&#xff0c;在招聘工程师的过程中&#xff0c;对算法和数据结构都会重点考察。但算法易学难精&#xff0c;我的很多粉丝技术能力不错&#xff0c;但面试时总败在算法这一关&#xff0c;拿不到好 Offer。但说实话&#xff0c;数据结构和算法花点时间&#…

【JavaWeb】XML和Jsoup的相关内容

文章目录1 概念2 语法2.1 基本语法2.2 组成部分2.3 约束2.3.1 使用DTD约束2.3.2 使用Schema约束3 解析3.1 将文档中的数据读到内存3.2 XML常见的解析器4 Jsoup4.1 使用Jsoup4.2 对象的使用4.2.1 Jsoup对象4.2.2 Document对象4.2.3 Element对象4.3 快捷查询方式4.3.1 selector选…

论文浅尝 | Learning with Noise: Supervised Relation Extraction

Luo B, Feng Y, Wang Z, et al. Learning withNoise: Enhance Distantly Supervised Relation Extraction with Dynamic TransitionMatrix[C]// Meeting of the Association for Computational Linguistics.2017:430-439.链接&#xff1a;http://www.aclweb.org/anthology/P/P1…

项目架构之传统三层架构和领域模型三层架构

一、架构之传统三层架构 传统三层架构是一种软件架构&#xff0c;是一种典型的、基于贫血模型的、面向过程的JavaWeb分层方式。该架构分为以下三个层次&#xff1a; 数据访问层&#xff08;DAL - Data Access Layer&#xff09;即对包括数据库在内的数据源进行操作的部分。业务…

服务器 | 安装最新版R和Rstudio(3.5.3)

前言 目前为止&#xff0c;除了WGCNA分析要求内存比较高以外&#xff0c;windows下的R和Rstudio都能满足我的使用需求。 近来&#xff0c;再分析师兄的RNA-seq数据&#xff0c;两种处理5个时间点&#xff0c;差异基因很少&#xff0c;表型数据很多&#xff0c;想着再做个WGCNA分…

限定域文本语料的短语挖掘(Phrase Mining)

一只小狐狸带你解锁NLP/ML/DL秘籍正文来源&#xff1a;丁香园大数据前言短语挖掘&#xff08;Phrase Mining&#xff09;的目的在于从大量的文本语料中提取出高质量的短语&#xff0c;是NLP领域中基础任务之一。短语挖掘主要解决专业领域&#xff08;如医疗、科技等&#xff09…

论文浅尝 | Hike: A Hybrid Human-Machine Method for Entity Alignment

Zhuang Y,Li G, Zhong Z, et al. Hike: A Hybrid Human-Machine Method for Entity Alignmentin Large-Scale Knowledge Bases[C]// ACM, 2017:1917-1926. ( CIKM 2017 )论文链接&#xff1a;http://dbgroup.cs.tsinghua.edu.cn/ligl/crowdalign.pdfMotivation随着语义网络的迅…

【HTML/CSS】CSS权重、继承及引入方式

1 CSS权重 1.1 权重规则 CSS匹配的选择器中每一种选择器类型的数组决定了选择器的权重&#xff0c;CSS的优先级规则&#xff1a; 权重高的样式会被应用到元素上。如果权重相同则使用最后声明的样式。属性后加上!important&#xff0c;无条件优先 1.2 权重计算 内联样式的权…

TCC分布式实现原理及分布式应用如何保证高可用

一、业务场景介绍 咱们先来看看业务场景&#xff0c;假设你现在有一个电商系统&#xff0c;里面有一个支付订单的场景。 那对一个订单支付之后&#xff0c;我们需要做下面的步骤&#xff1a; 更改订单的状态为“已支付”扣减商品库存给会员增加积分创建销售出库单通知仓库发货…

IJCAI 2018:中科院计算所:增强对话生成一致性的序列到序列模型

IJCAI 2018&#xff1a;中科院计算所&#xff1a;增强对话生成一致性的序列到序列模型文章来源&#xff1a;企鹅号 - 读芯术你和“懂AI”之间&#xff0c;只差了一篇论文号外&#xff01;又一拨顶会论文干货来袭&#xff01;2018年6月9-10日&#xff0c;代表学术界和工业界的顶…

一时学习一时爽,持续学习持续爽

一只小狐狸带你解锁NLP/ML/DL秘籍作者&#xff1a;小鹿鹿鹿 net~net~你围棋下的这么好&#xff0c;斗地主应该也不错吧不敢当不敢当但是人家柯洁才得了欢乐斗地主全国第一呢那让老夫也学习学习吧~巴拉巴拉小魔仙Training。。。net net stop&#xff01;你怎么斗地主还没学会&am…

【HTML/CSS】HTML元素种类的划分

1 种类划分 1.1 块级元素 特征&#xff1a;独占父元素的一行&#xff0c;可以设置宽高&#xff0c;高度默认由内容决定。常用标签&#xff1a;div、p、h1~h6、ul、ol、li、dl、dt、dd、table、form不常用标签&#xff1a;pre用来定义预格式化文本&#xff0c;pre内的文本会保…

基于“大中台+小前台”思想的电商系统总体架构设计

一、架构总原则 1. 大中台小前台的架构思路 2. 业务中台采用领域驱动设计&#xff08;DDD&#xff09;&#xff0c;在其上构建业务能力SAAS&#xff0c;持续不断进行迭代演进。 3. 平台化定位&#xff0c;进行了业务隔离设计&#xff0c;方便一套系统支撑不同玩法的业务类型和便…

问答系统总结

最近在研究问答系统,但是在查找资料的过程中一直处于懵逼状态,因为问答系统分类比较多,根据不同的依据可以分为不同种类,总是搞混,也没有找到资料详细全面的介绍,所以在一边学习查找资料的同时,自己也整理出一份总结,用于以后学习过程不至于思路混乱,如有错误请帮忙指出.19世纪…

论文写作葵花宝典

一只小狐狸带你解锁NLP/DL/ML秘籍作者&#xff1a;小鹿鹿鹿论文写作套路老板说&#xff1a;写论文是有套路的老板说&#xff1a;introduction写好了&#xff0c;论文就成功了一半老板说&#xff1a;你的motivation是什么&#xff0c;contribution又是啥&#xff1f;小夕说&…

李涓子 | 机器智能加速器:大数据环境下知识工程的机遇和挑战

本文转载自公众号&#xff1a;数据派THU。 导读&#xff1a;知识图谱已经成为推动人工智能发展的核心驱动力之一。本文选自清华大学计算机科学与技术系教授、清华-青岛数据科学研究院科技大数据研究中心主任李涓子老师于201…

【HTML/CSS】CSS盒模型及其理解

1 盒模型 概念&#xff1a;CSS盒模型本质是一个盒子&#xff0c;包括&#xff1a;外边距margin、边框border、内边距padding、内容content 分类&#xff1a;标准盒模型&#xff08;W3C&#xff09;和怪异盒模型&#xff08;IE&#xff09; 标准盒模型&#xff1a;width的值就是…

Netty异步非阻塞事件驱动及原理详解

本文基于 Netty 4.1 展开介绍相关理论模型、使用场景、基本组件、整体架构&#xff0c;知其然且知其所以然&#xff0c;希望给大家在实际开发实践、学习开源项目方面提供参考。 Netty 是一个异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服…

文本预处理跑得慢?抱抱脸团队又放福利,1GB文本语料分词只需20s!

一只小狐狸带你解锁NLP/DL/ML秘籍正文素材来源&#xff1a;量子位缘起BERTBERT带来的并不是只有一大波paper和嗷嗷上线&#xff0c;还带火了一个NLP团队——Huggingface&#xff08;中文译作抱抱脸&#xff09;。抱抱脸团队是一个创业团队。他们的Transformers是github上最火的…