业务架构交流与分享
1. 内容简介
1.1. 个人介绍
- 07~11, 南大数学本科
- 11~13, 南京华为业软, 即时通讯软件开发
- 13~15, 上海点评, 商家后台, 产品中心, 审核, 风控, CRM
- 15~19, 票牛网
- 15~16: 全站研发
- 16~17: 负责站内运营(商品, 会员, 活动)
- 17~18: 负责行业系统研发
- 18~19: 负责公司后端研发
1.2. 分享目的
- 探讨一下架构的目的和要解决的问题以及常见解决办法
- 分享过去在票牛的决策和经历
- 分享了解到的别的架构团队的关注点和工作
- 探讨一下各自对架构的观点和体会
2. 架构是什么
2.1. 官方解释(wiki & book)
Architecture is like teenage sex,everybody talks about it,nobody really knows what is it。
- 提供一套预定义的子系统, 规定它们的职责, 并包含用于组织它们之间关系的规则和指南。
- 描述组件, 边界以及组件与组件之间的关系
- 最高层次的规划, 难以改变的决定
- 有关软件整体结构与组件的抽象描述, 用于指导大型软件系统各个方面的设计
2.2. 架构的五个层次
- 可用
- 可伸缩
- 可见
- 可调控
- 可适应
2.3. 常见关注点
- 功能
- 性能
- 可扩展
- 可见性
- …
3. 票牛架构演进
3.1. 主线
- 支持和保障业务规划的完成
- 资源有限, 如何最大化利用
- 如何平衡当期和对未来的投资
- 减少业务的试错成本
- 研发效率和质量
3.2. 0-1 (2 个月)
- 问题
- 功能性, 快速, 能较低成本发展壮大
- 人员
- 后端: 2, 前端: 2
- 业务
- 系统
- 一个代码仓库, 一个 project, 3 个 module(job, web, biz)
- 2 台 api, 1 台 job, 1 台 ecs (op), 一台 solr+memcached
- 2 台 ecs (数据库, 主从, 从库仅用于备份)
- 七牛
- eventbus
- 测试环境
- 发布(ansible) 2015-10-23
- 监控, 备份
3.3. 配置中心
- 问题
- 增加了 pc 和商家, 部署的机器增多
- 业务逐渐复杂,配置项增多
- 配置项的更新需要发布全部机器
- 解决
- zk 提供应用级别配置, 以及业务级别配置变更的通知
- 数据库提供业务级别的配置
- 不同环境使用不同的 zk
- 手工提供一个简易版本的配置中心
3.4. 优惠系统
3.5. 支付网关 (15 年 11 月)
- 问题
- 用户的支付渠道极其丰富(尽管支付宝微信占比 90%以上)
- 银联, 招行一网通,招行账上生活,农行掌银, 兜里积分, 杉德支付3
- 解决
- 提供支付网关, 统一接入规范
- 支付请求, 回调, 退款,查询, 对账
- 提供支付网关, 统一接入规范
3.6. 报表中心
- 问题
- 运营分析手动拉数据(sqlboy)
- 拉了一次还不够, 日周月年
- 大体一致的需要,每次参数调整都需要研发
- 解决4
- 日周月年的报表自动配置生成
- 提供 sql 的参数化能力
3.7. 垂直分库
- 问题
- 某次报表业务把线上库拖跪了
- 用户推送消息过多影响下单
- …
- 解决
- 独立部署部分业务的数据库5
3.8. openapi (16 年底)
- 问题
- 分销给猫眼, 需要一定的定制
- 不希望影响站内
- 解决6
- 作为和 pc, m 站同级的分销平台,建立 openapi 模块
3.9. 数据库迁移 RDS (17 年初)
- 问题
- 周杰伦抢票,宕机一小时…
- ecs 的 io 性能
- mysql 的 query cache 配置
- 无人监控&维护数据库
- 周杰伦抢票,宕机一小时…
- 解决
- 迁移至 rds
3.10. 发布系统 (17 年下半年)
- 问题
- 业务类型变多(jar, war, node, 静态资源)
- 上线的机器变多
- 人员变多(后端 10, 前端 14)
- 测试代码被带上线
- 解决办法7
- 自定义的 mozart 文件(发布的规则文件, 定义生命周期)
- 图形化的页面
- lightMerge(多分支)的合并测试
3.11. solr 迁移 solr-cloud (18 年初)
- 问题
- xx 抢票, 宕机小半天…
- solr 的 gc 配置
- solr 的单机瓶颈
- xx 抢票, 宕机小半天…
- 解决
- 简单的调优+迁移 solr-cloud, 单机 60qps -> (2 台) 集群 600qps
3.12. xxl-job 分布式 job 管理
- 问题
- 单机情况下, 不方便扩容
- 可见性比较差
- 对于 job 的执行的控制不是很方便管理
- 解决
- 引入 xxl-job
3.13. 流控
- 问题
- 攻击
- 抢票时的峰值流量
- 解决
- 在 nginx 前放一个 阿里云的 slb…
3.14. 支付中心(收银台)
- 问题
- 要支付的业务实体增多, 无统一的管理
- 解决
- 定义支付中心, 统一接入规范
3.15. 订单中台(18 年中, 6 人月)
- 问题
- 业务模式复杂: 拼团,套票,抢票,抽奖,求票,买会员, 买优惠券…
- 解决
- 用更抽象的概念承载业务实体和流程
- 用户订单
- 商品
- 采购单
- 发货单
- 定义统一的控制流和生命周期
- 用更抽象的概念承载业务实体和流程
3.16. 业务拆分 module
- 问题
- 业务边界缺乏约束
- 相似功能放在不同的业务模块中,不易发现
- 无法找到 owner 对某块业务负责
- 解决
- 拆分出演出, 推荐, 商品, 订单, 分销, 供应链模块
3.17. 分销中台
- 问题
- 分销系统对于可见性要求高
- 分销系统对于同步延时,容错处理等要求高
- 不同平台的商品定制要求不一(价格调整,黑白名单,详情定制…)
- 无统一的运营维护平台
- 无统一的机制, 导致问题要重复解决, 质量参差不齐
- 解决
- 定义分销领域统一的视图和概念
- 建立分销中台,定义和规范 h5, api 等分销的流程
- 定义扩展点
3.18. 总结
- 对业务发展,研发效率最有帮助的地方
- 业务框架(不用干活, 效率最高)
- 可见性
- 清晰的模块边界(关注点小, 确定, 简单)
4. 其他案例分享
4.1. 华为
- 基线与定制分离
- 外包团队管理
- 专门的设计文档撰写(SE)
4.2. 点评
- 中间件
- cat, pigeon, swallow
- 业务架构
- 阿波罗(中后台业务架构: CRM, 商家, 结算, 产品制作, 风控, 审核, 券…)
- v1 -> v4
4.3. 抖音
- 异地多活, 用户的单元化存储, 存储中间件
- 审核系统设计
musically:
- 做了一年的准备工作,老板不想做了,把公司卖了
- (去了抖音之后)性能现在是最容易解决的问题, 跨洲的多活很难。尤其做一套统一的模型,更难。
4.4. 秉坤
- ERP 自助开发的 IDE
- 输入, 输出, 管道, 过滤器
5. 典型的架构模式8
5.1. 从混沌到结构
避免形成组件或者对象的海洋,将系统任务受控地分解成可协作的子任务
- 分层架构(Layers)
- 管道和过滤器(Pipes and Filters)
- 黑板(Blackboard)
5.2. 分布式系统
- 代理者(Broker)
5.3. 交互式系统
- 模型-视图-控制器(Model-View-Controller)
- 表示-抽象-控制(Presentation-Abstraction-Control)
5.4. 适应性系统
- 微核 (Microkernel)
- 映像 (Reflection)
6. 个人观点
6.1. 我对架构的认识
架构: 我是谁, 我从哪里来, 我要到哪里去
架构的价值依托于系统本身.
- 系统能带来价值, 但是存在问题需要解决。
- 架构就是在高层的视角下看到的问题和提供的解决方案。
6.2. 架构解决的主要问题
- 复杂性
- 可扩展性, 系统的生命周期
- 性能, 规模
- 可行性(受限资源下)
6.3. 架构的成本和收益
- 当期收益 & 未来收益
- 不可行 -> 可行
- 更长的生命周期
- 未来更低的实现成本
- 未来更低的维护成本
- 可控的复杂
- 成本
- 设计理念的门槛和理解成本增加
- 当期的实现工作/难度增加
6.4. 架构重点
- 预见性
- 概念的一致性, 规范的强制性
- 权衡
- 成本/收益
- 现在/将来
- 做什么, 方案, 程度