「Java技术架构TB」这也太厉害了,微信支付软件架构( 四 )

文章图片
对比旧架构:
杜绝了一对多通信造成的Bug
生命周期和业务逻辑绑定 , 不会出现业务结束 , Cgi回来后再触发动作 。
高内聚 , 低耦合 。 将Cgi相关的数据 , 能力集中处理 , 业务侧无需感知 。
提供统一的缓存 , 加密能力 。

文章图片
第一步和第二步 , 我们抽象了业务流程 , 加入了路由机制 。
在第三步管理网络请求后 。 我们的软件架构演进为这样子 。

文章图片
4.规范数据传递
iOS和安卓的旧架构都存在信息传递不当和数据污染问题 。 这个问题最严重 。 iOS和安卓都出过不少bug 。
首先我们来看看最近现网出现过的问题:
之前iOS出现 , 不少内部同事 , 外部的用户都在反馈:进行零钱页后 , 会无故弹空白框 。 而支付又和金钱有关 , 引起用户的恐慌 。

文章图片
具体原因就是:
进入支付首页时 , 后台返回了数据 , 然后被写入到一个公共的Model.
然后进入钱包页 , 再进入零钱页 。 这个公共model一路被传递过去 。
然后零钱页读取了公共Model的数据 , 但是代码无法处理 , 导致出现了这个让用户恐慌的问题 。
除此之外 , 之前还有有很多发生在安卓 , iOS , 像钱包页零钱展示错误 。 付款的时候 。 银行卡失效等等问题 。
这些问题五花八门 , 看起来发生的地方 , 场景都不一样 。 每次遇到这类问题的时候 , 就只能去修修补补 。
但是深究下去 , 会发现真正的原因 , 是软件架构上存在的问题:

文章图片
支付旧的架构采用了黑板模式 , 虽然方便了数据读写 。 但是带来的问题和收益完全不成正比:
1.存在公共读写的数据类型 。
安卓传递的数据类型是一个字典 , 而iOS则是一个Model对象 。 所有的界面 , 业务逻辑都共用一个数据 。
2.无序的数据流动 。
数据的流动是不可追溯的 , 数据的修改可以发生在任意使用公共数据的地方 。
那么支付跨平台软件架构 , 为了杜绝这样的问题 。 我是这么做的:

文章图片
去掉公共读写的数据类型
传递值类型(ValueType)的数据,后面流程修改数据时 , 不影响前面的流程 。
单向传递数据 , 只依赖注入必要数据 。
如果数据修改需要通知前序流程 , 使用代理模式通讯 。
规范数据传递后 。 对比旧架构:
从架构上根本解决了困扰微信支付已久的数据污染的问题 。
数据的流动变为单向 , 数据流动变得可追溯 。
前面三步 , 我们抽象了业务流程 , 加入了路由机制 , 统一管理网络请求 。
那么规范数据传递后 , 我们软件架构就演进为这样子 。

文章图片
总结
软件的本质复杂性存在于复杂的业务需求中 。 而软件架构的本质就是管理复杂性 , 因此真正的好的架构 , 正是在复杂的业务需求中反复提炼和总结归纳而来 , 解决了真正的业务问题 , 不是空谈 。
软件架构除了清理历史旧架构的缺陷 , 是我们业务开发的基石之外 。 还能够赋能业务 , 为业务带来价值 。 在建立软件架构的基础上 , 还围绕着软件架构建立起微信支付的跨平台自动化数据上报机制 , 防重复支付 , 安全横切等带来巨大业务收益的能力 。 有机会的话 , 后面也会进一步编写相关文章和大家交流探讨 。
推荐阅读
- 『Java』java数据结构系列——什么是数据结构
- 二台格物设计的与时俱进
- 『Java』马云:成功人跟普通人差不多,但这三点我一定要分享给所有年轻人
- ZAKERCTP、刀片、无钴……动力电池新技术的幕后黑手是谁?
- 李先生看点技术人员都要抱着电脑睡,在珠峰海拔6500米5G基站难度非常大
- 华为■美国无奈宣告“妥协”,将采用华为5G技术,任正非果然没有说错
- #Java#java线程到底有多少种状态?
- 数码狂人“云演唱会”会成为音乐产业新常态吗,5G+4K+VR+多视角技术融合
- IT168“共享智能”技术,AI华人科学家张本宇解密蚂蚁
- #智能手表#1、初识java-1
