Phoenix 框架 从0到1设计业务并发框架 小米商城产品站革新之路

前言

小米商城产品站之前由于历史原因,存在着诸多问题与不便,随着技术的快速变革,技术部中台化的建设 ,越来越不适用于现在快速迭代的业务需求,接下来我将以技术的视角讲解我们遇到的痛点,以及解决这些痛点的思路,也就是 Phoenix 框架诞生的故事。

为啥要进行设计一个框架,其实是业务发展导向的结果,若是我们不进行设计,那么我们会遇到如下一些问题:

  • 在新的产品需求规划下,无法承接大型项目,只能进行小修小改;
  • 小米网产品站最初,每个端一套代码逻辑,风格各异;
  • 历史沉淀,一个接口函数 2000 多行,熟悉代码逻辑的成本越来越大;
  • 隔离性差,服务可用性严重依赖下游,下游一个接口的抖动都会给我们接口带来恐慌;
  • 技术上整体中台化建设,随着调用接口越来越多,接口越来越慢
  • 代码没有解耦,特别对新同事而言,新项目上线风险高
  • 缺少 Go 基础组件的维护,无法对下游接口实时监控

思考

我们从技术上计划进行重构,那么我们如何将现有的调度逻辑抽象出一套兼顾稳定性、便捷开发、可维护性且可监控的框架模型是我们首先带来的问题。

我去调研了开源的一些并发框架,发现传统的并发调度模型基本上都有依赖关系、超时控制、线程池分配调度、熔断限流、接口监控等功能。

为啥我们没有直接使用开源并发框架进行开发呢?

我调研发现业界 LiteFlow 框架是最受欢迎与好评的框架,于是在 Github 上面去了解框架底层实现的细节,随着深入阅读源码,发现这款框架设计的是真的很优秀,但是也过于庞大、复杂,特别是 EL 规则的写法,相对来说还是有一定的上手成本。

那么我就在思考,我作为业务开发人员的话,我不想关心这么复杂的依赖关系,只需要关心自己产品站业务调用到的中台的接口及其依赖接口即可。特别是大型接口捆绑了几十个下游接口的逻辑,要是理解每个接口的设计细节更是不太可能的,要是依赖关系特别复杂,那么 EL 规则会写的非常复杂且维护成本极高。

那么该如何设计一款轻量、快速、高效、从根本上解决开发人员手动维护依赖关系的并发框架呢?

既然存在依赖关系,那是不是可以通过算法进行自动构建依赖关系呢?

设计

根据产品站的实际场景,我们发现,调用下游接口若干个,且请求接口存在不同的请求协议与不同的中间件。

更重要的是,接口存在着依赖关系,我们梳理接口调用发现,接口依赖正好是有向依赖图的结构, 那么我们就可以进行遍历依赖关系进行编排并发分组。

这样就解决了依赖的问题,我们可以依次并行执行每个并发组的任务,这样就可以得到所有接口或依赖的结果。

那么获取到结果之后,怎么进行业务逻辑的编排,怎么隔离下游接口,其实原理很简单,既然任务可以进行分层,那么我们业务调用、业务编排、防腐蚀层也可以进行分层设计。

  • Transfer 层的作用是业务逻辑层,用来进行业务编排,将 BO 数据提供给客户端使用;
  • Task 任务层 是并发执行的核心设计层,在这里通过并发分组的每个子 Task 在这里进行编排后执行调用,用来进行超时控制、耗时统计等操作;
  • Infrastructure 层 作为防腐层设计,用来隔离下游接口的调用,这样的设计提高了接口的稳定性;

写在最后

好了,上文就是给大家讲解的自动构建并发调用图的业务框架,也就是 Phoenix Framework。

Phoenix,最初在周志明老师的网站"凤凰架构"提及,一方面是对周老师的架构设计理解与 Java 相关知识学习的致敬,另一方面,Phoenix 不死鸟,软件的生命周期也是如此,随着业务的快速发展诞生、并随着业务的的收缩而凋亡,生生不息。

最后,我会以系列的方式进行讲解这个框架遇到的问题以及解决思路,感谢大家的阅读,大家要是感兴趣的话推荐大家关注,让我们一起变得更强~

本文首发于:blog.debuginn.com 公众号:Debug客栈

相关推荐
JAVA学习通3 分钟前
零基础OSS组件(Java)
java·linux·leetcode
草莓熊Lotso7 分钟前
《算法闯关指南:优选算法--二分查找》--19.x的平方根,20.搜索插入位置
java·开发语言·c++·算法
YJlio11 分钟前
Process Monitor 学习笔记(5.7):长时间运行追踪与日志文件体积的控制
java·笔记·学习
失散1314 分钟前
分布式专题——45 ElasticSearch基础数据管理详解
java·分布式·elasticsearch·架构
没有bug.的程序员14 分钟前
分布式监控体系:从指标采集到智能告警的完整之道
java·分布式·告警·监控体系·指标采集
想不明白的过度思考者31 分钟前
JavaEE初阶——TCP/IP协议栈:从原理到实战
java·网络·网络协议·tcp/ip·java-ee
心灵宝贝35 分钟前
nginx-1.16.1-2.p01.ky10.sw_64.rpm 安装教程(详细步骤,适用于Kylin V10/SW64架构)
nginx·架构·kylin
devnullcoffee1 小时前
深度解析:如何构建企业级电商数据采集架构?Pangolin API实战指南
架构·scrape api·pangolin api·亚马逊数据采集 api·amazon 爬虫
好家伙VCC1 小时前
**发散创新:渗透测试方法的深度探索与实践**随着网络安全形势日益严峻,渗透测试作为评估系统安全的
java·python·安全·web安全·系统安全
白萤1 小时前
SpringBoot用户登录注册系统设计与实现
java·spring boot·后端