背??景今天跟大家分享一个话题,就是对于跟钱相关的在线计费系统,可能会存在一些在线误算钱的问题,以及我们如何设计架构来解决这些问题。但是任何与金钱计算相关的系统都是每个公司的重中之重,比如价格系统、运费系统、计费系统、支付系统、资金系统、财务系统、结算系统等等,因为这些系统在运行过程中,由于技术问题或人为操作错误,钱随时可能被计算错误。那么今天我就跟大家聊聊这种与金钱计算相关的系统。怎么保证他不会算错钱呢?计费业务系统架构设计业务场景介绍首先介绍一个业务场景,假设我们现在有B端、M端和C端三个系统。其中,B端可以通过商户/常驻客户/供应商/合作伙伴等B端角色来设置和调整其部分计费规则,M端是公司运营可以调整统一的基础计费规则,C端是面向用户的。在处理一些请求时,会根据B端和M端的计费规则计算当前支付金额。如下图:这个时候你可能会说,这个好像没问题,不是可以在平台层和商户层修改计费规则,然后c端系统计算根据两个系统的计费规则实时计费。真的是这样吗?上面的计费模型看起来很简单,但实际上包含了很多问题。让我一一解释。业务系统消息同步丢失首先,由于历史原因,上面的计费模型会非常复杂,并不是我们想象的那么简单。实际上,B端系统每次修改计费规则后,需要通过MQ将计费规则同步到M端系统,M端系统再汇总B端所有商户的计费规则。-端系统,然后是后续的C端系统在计费的时候,调用M端系统的接口拉取所有需要的计费规则进行计算。如下图所示:仅仅是上图中的架构可能会导致我们在计费时由于一些技术原因而出现问题。比如最典型的就是无论什么原因,在B端系统修改计费规则后,由于网络原因、MQ故障等各种原因,可能无法同步到M端系统和代码错误。导致C端系统一直沿用旧的计费规则进行计费。严格来说,这导致了计费错误。如下图所示:这只是同步问题导致的计费错误。其实还有一个比较麻烦的问题,就是M端系统接收到B端系统同步过来的计费规则后,可能会将复杂的计费规则陆续写入多个数据存储中。没错,你没有看错,M端系统有可能会采用异构的数据存储架构来存储不同的计费规则,比如MySQL、MongoDB等。如下图:计费业务系统计费问题这个时候可能会有一个问题,就是C端系统在同步你的BillingRules规则进行计费的时候,可能会从你的M端系统查询各种计费。但是这时候可能会出现一个问题,就是MongoDB中可能已经有最新的计费规则,但是在MySQL中却发现了旧的计费规则,也就是说完全有可能使用不一致的计费规则。计费的计费规则。例如下图:这是第二种可能会出现计费错误的场景。第一条计费规则同步失败和第二条计费规则并发读写都是技术问题。第三种计费错误场景是我们商家或者我们自己运营,欠账甚至手拉,把计费规则改成非常离谱的错误。比如某条计费规则的正常基准金额是100元级别,他改成了几元,这可能会给公司造成严重的损失。如下图所示:这些问题都可能导致计费错误。说到这里,你是不是想说不容易,逐案优化处理不会就此结束。比如对B端和M端系统进行大规模加固,实现MQ消息不丢包保障机制,读写M端系统的异构存储,加分布式锁,不能写的时候读,读的时候不能写,在操作修改计费规则的时候校验,加上各种校验规则,乱改不让通过。没错,大家说的其实都没错,但是不知道大家有没有想过一个问题。对于一个真正复杂的公司级系统,比如上面提到的B端系统,看起来只是图中的一个方框。其实一个公司可能就是一个由几十个人维护的大平台,M端系统也是一样。因此,如果要推广各种技术方案进行保障,跨部门推广的成本会非常高。这只是一,二是你现在采取了一些措施加强它,但不代表以后不会有新的问题。比如你实现了MQ同步的消息不丢失方案,但是万一哪天MQ挂了怎么办?比如你在M端系统实现write和read加分布式锁互斥,可能会导致Concurrency性能大幅下降。例如,您在计费规则修改中添加了验证规则,但是随着计费规则不断变化,很可能导致您的验证规则失效,或者您需要不断增加新的验证规则。如下图所示:计费业务数据补偿系统设计所有这些其实都是治标不治本。对于这类网贷类的,当然要严防技术和业务,但这全靠技术团队的技术素养,以及业务验证规则的持续维护,如果想做一次的话对于所有,那么我们通常会引入计费数据补偿系统。该计费数据补偿系统是另外独立开发的。让我们看看我们将用这个系统实现哪些功能来解决我们刚刚看到的问题。首先,从本质上讲,不管B端和M端的具体代码逻辑怎么写,第一点是确定的,就是B端和M端需要实现数据同步和最终一致性。所以,不管是通过MQ同步还是什么方式,我们都可以直接监控B端和M端系统的数据存储情况,通过定时拉取数据进行对比。如果双方数据不一致,会自动实现补偿。如下图所示:那么我们来看第二题。无论你的M端计费规则的编写和查询逻辑如何,最大的问题是你的计费结果可能不会遵循一致正确的计费规则。继续。因此,我们的计费数据补偿系统可以直接让C端系统的计费接口将每次计费请求的日志上报给我们。那么我们也可以同时将M端系统的各个计费规则的查询和修改日志上报给我们,我们可以将相关的日志数据存储在大数据系统中。那么我们可以基于大数据技术对相关系统进行日志计算,在每次计费查询查询多条规则时,检查是否在短时间内先后修改了多条规则,导致使用不一致的规则来计算问题。如下图所示:最后针对运营可能误操作的计费规则不正确的问题,我们可以拉取C端系统的每一个计费结果,然后我们可以对计费进行链式比对验证结果。也就是说,您可以将每个计费结果与过去类似的计费结果进行比较。如果差距过大,超过50%,就会自动向操作员发出警报,提醒他可能存在计费错误。费用金额规则误操作的问题。如下图:总结通过上述的计费数据补偿系统,可以直接绕过所有具体的计费规则和计费逻辑,与C端系统、B端系统、M端系统完全解耦.自行使用拉取数据、拉取日志、拉取计费结果等方式,利用大数据等技术进行各种测试,从根本上解决问题,实现因技术问题或错误导致的在线计费系统。操作问题导致的计费错误。
