写点什么

如何在分层架构与微服务之间做出合理的选择?

  • 2020-04-17
  • 本文字数:2262 字

    阅读完需:约 7 分钟

如何在分层架构与微服务之间做出合理的选择?

最近似乎所有的电台里都在为国庆长假倒数计时,身边的小伙伴们好像也提前进入了庆欢状态,连我也提前一周打点好了潜水装备,耐心等待那黄金一刻的到来


按照惯例,每年十一黄金周是公司启动下一年战略规划的触发点,对于 IT 侧来说无非就是谈谈架构,算算成本,拢拢人头


既然是谈谈架构,必然会谈到技术改造的话题,比如某某系统的改造,某某系统的重构之类,而且改造(或重构)可以给公司将来带来如何如何的好处和收益,这些其实都是司空见惯的事情,可就在讨论的过程中,由于某系统的改造方案,引起了一场小小的争论……

故事情节回放

故事场景:A 系统,负责公司内部的信息化管理工作,疑似 “OA+资源管理+DevOps(部分)” 的综合性功能类系统


故事背景:由于业务迭代多,速度要求提高,导致 BUG 增多,效率下降,所以决定对 A 系统进行服务拆分


改造目的:


迁移:DevOps 类功能迁移至 PaaS 平台中


拆分:业务垂直拆分,解决改 A 错 B


分层:建立自定义中台,支持大量自定义流程更改并同时快速迭代的需求


资源投入:架构师 1,开发 3


时间要求:1 个月内上线,同时保证正常周迭代需求陆续上线


技术指标:在线<200 人,稳定性要求高



题图:A 君 = 系统架构设计概要图 - 采用 Dubbo 作为 RPC 技术选型


说完情节,回放以下部分对话(A 君 = 架构师):


……(完成对改造方案的说明)……


A 君:大家看看,对这个方案有什么问题吗?


B 君:我感觉没必要拆的那么细吧,不就内部系统吗?又不是在线联机服务,把代码分层做做好,也可以放在不同的 Project 里,表在一个库里用不同的前缀区分业务,获取数据也变得更简单了



题图:B 君 = 系统架构设计概要图 - 代码分层,JVM 内部方法调用


A 君:你这么设计有问题的,问题如下:


如果 A 模块变更,怎么才能独立发布呢?


再如果 B 模块方法入参变更,影响到 C 模块怎么办?


再如果 D 模块因为某某原因导致流量增大,不是把其他功能都拖慢了吗?


再如果 E 模块出现一个 BUG,不是把整个系统都 Crash 掉了吗?


再如果数据库挂了,不是整个系统都不可用了吗?


再如果……


A 君:刚才说的是系统结构,再说说人吧,我们几个都不太会前端技术,只有张三会前端,所以如果按照我的架构设计,我打算把整个表现层都交给张三做,独立的 War 包服务,想怎么玩,想怎么发布都行


A 君:何况外面的系统都是这么玩的,我不觉得我的设计有什么问题,你这个设计太落伍了吧,不利于未来的扩展性、灵活性……


……(略过很多行,不过到这时,B 君已经不再说话了)……


在做出合理的选择之时,我们该考虑些什么?


接口规范远比扩展性与灵活性更重要


相比系统的扩展性与灵活性,接口输入、输出及接口命名的规范与标准化,往往更容易对后期发展造成较大影响(如加个参数,改 A 错 B)


接口标准做好了,换成 RPC 或其他协议,想必也不会困难到哪里去



题图:采用分层架构的某某系统,接口抽样说明


无论分布式数据库,还是数据库集群


自打这世界上有了关系型数据库之后,就从来没听说在高可用上缺乏过解决方案,对于某些非热点(双 11,大促之类)应用或服务,分不分布式,有那么重要吗?


比起运维成本与聚合数据时,应用付出的额外开销,采用数据库集群来满足,可能是一个非常不错的选择


杀鸡不用牛刀,不仅想起了当年的 EJB


回忆起十几年前,那个 EJB 大肆盛行的年代,我见过 40+人的团队,使用 EJB 开发电商系统,同时我也见过 3 个人的团队,使用 EJB 开发 OA 系统的……


面向成果,还是面向简历?


上半年接触到的一个名词 “简历驱动开发”(Resume Driven Development),在很多技术方案讨论中,恰恰融入了很多这样的因素,虽然本身并不是什么坏事,不过还是需要兼顾下 “系统利益获得者(使用方、业务方或运维成本)”


名词解释如下:


选择是否使用一项技术或者架构的标准是是否有利于自己的职业发展,而不是有利于客户/用户;


选择是否使用一项技术或者架构的标准是是否时髦而不是是否符合业务场景;


以技术的名义创造各种 NB 头衔(Job Title);


记得有一次面试,我问面试者:


我:你们用 Docker 吗?


面试者:用啊


我:你们用 Docker 的目的是什么?


面试者:(……略去很多内容,这位小伙伴说了很多 Docker 带来的好处……)


我:嗯,你们有多少台服务器啊?


面试者:2 台


我:……2 台?为什么不选择 Master/Slave,而选择 Docker 呢?


面试者:节约资源呀,况且现在不是很流行吗?不用就要落伍啦,找不着工作啦


有些系统考虑未来毫无必要


每个系统都是有生命周期的,未来会发展成什么样?将一个在其生命周期内不可能产生高并发场景的系统设计成高并发架构,这种行为就是耍流氓


你那么断定吗?万一他哪天有了这样的场景呢?我只是说万一,那推倒重构的成本你过算吗?


当然没算过,不过可以预料的是,由于过度设计而导致的额外支出成本(如排障时间、人员离职及技术 BUG 等)一定比重构成本来的大,何况在大部分情况下,选择重构,多数是由于依赖系统的业务有了发展,我们才会痛下决心去重构,要不然为什么要去操这份心呢?

结束语

虽然从某种角度来说,分层架构与微服务并不属于同一级别,乃至同一层级的话题,但在实际工作场景中,往往会成为初期选择的争论点之一


记得在 SOLID 原则中提到


当我们不确定哪种架构更合适的时候,分层架构将是一个很好的起点


故事讲到这里应该结束了,也许,这样的故事每天都在发生,有可能这次是 A 君 “赢了” ,下次是 B 君 “胜了”,可作为系统设计者,是否更应多从系统的受益方(也许是业务,也许是 IT 的其他岗位)来思考呢?


也许哪一天,“合理的选择” 将不再充满争议……


本文转载自头哥侃码公众号。


原文链接:https://mp.weixin.qq.com/s/kGQoNNsJeKZ5d-hYSobzpA


2020-04-17 15:05977

评论

发布
暂无评论
发现更多内容

内部开发者平台|自建还是购买,企业应如何选择?

SEAL安全

平台工程 企业号 5 月 PK 榜 内部开发平台

基于 Log 的通用增量 Checkpoint 在美团的进展

Apache Flink

大数据 flink 实时计算

SpringBoot + Docker 实现一次构建到处运行

Java你猿哥

Java Docker Spring Boot ssm 容器化部署

龙博机电:90后“厂二代”,靠伙伴云零代码让中小制造业实现数字化“逆袭”

联营汇聚

耕升 GeForce RTX 4060 Ti 系列,为玩家带来DLSS3+1080P光追游戏体验!

极客天地

WorkPlus AI助理 | 将企业业务场景与ChatGPT结合

BeeWorks

CloudQuery v2.0.0 发布 新增数据保护、数据变更、连接管理等功能

BinTools图尔兹

数据库 国产数据库 版本发布

1.5万字+30张图盘点程序员面试必会MySQL索引常见的11个知识点

Java你猿哥

Java MySQL 数据 ssm 索引

企业研发效能度量利器,华为云发布CodeArts Board看板服务

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

最高奖金100万!第二届广州·琶洲算法大赛火热报名中

飞桨PaddlePaddle

百度飞桨 算法大赛

全新一代小度智能屏X9焕新上市 正式开启预售

极客天地

PoseiSwap IDO在Bounce上启动在即,如何参与?

西柚子

有哪些好用的企业即时通讯软件值得推荐?

BeeWorks

以敏捷性为目标,构建良好企业生态

智达方通

数据驱动 数据孤岛 智达方通 全面预算管理 数据分析系统

常用的表格检测识别方法——表格结构识别方法(上)

合合技术团队

人工智能 深度学习 算法 人工智能文字识别 表格检测

深度学习进阶篇-预训练模型[1]:预训练分词Subword、ELMo、Transformer模型原理;结构;技巧以及应用详解

汀丶人工智能

人工智能 深度学习 预训练模型 Transformer ELMo

Flutter三棵树系列之详解各种Key | 京东云技术团队

京东科技开发者

flutter key 企业号 5 月 PK 榜 localkey

直击灵魂!美团大牛手撸并发原理笔记,由浅入深剖析JDK源码

做梦都在改BUG

Java 并发编程 多线程 jdk源码

Scrum的三个工件(产品Backlog、Sprint Backlog、产品增量 )

顿顿顿

Scrum 敏捷 敏捷开发管理 敏捷开发管理工具

深度学习基础入门篇-序列模型:[11]:循环神经网络 RNN、长短时记忆网络LSTM、门控循环单元GRU原理和应用详解

汀丶人工智能

人工智能 深度学习 RNN LSTM GRU

PoseiSwap IDO在Bounce上启动在即,如何参与?

鳄鱼视界

混沌演练实践(二)-支付加挂链路演练 | 京东云技术团队

京东科技开发者

微服务 混沌工程 混沌工程实践 企业号 5 月 PK 榜

升级正当时,高性价比的影驰 GeForce RTX™ 4060 Ti 8G开箱评测

极客天地

视频后期特效处理软件:Motion 5 最新中文激活版

真大的脸盆

Mac Mac 软件 视频特效合成 视频特效工具 特效合成

2023年,Flutter3.10版本的变化有哪些?

没有用户名丶

小程序容器

3天速成!阿里人私用的Netty速成实战手册,3天Github星标11.5k

Java你猿哥

Java 源码 Netty ssm netty内存管理

Elasticsearch与Clickhouse数据存储对比 | 京东云技术团队

京东科技开发者

数据库 elasticsearch Clickhouse 企业号 5 月 PK 榜

红旗软件正式发布龙蜥社区版国产高可靠操作系统

OpenAnolis小助手

Linux 开源 龙蜥社区 红旗软件 社区版操作系统

ps vs top:CPU占用率统计的两种不同方式

极限实验室

Linux 运维 监控系统 INFINI Console

如何在分层架构与微服务之间做出合理的选择?_架构_头哥侃码_InfoQ精选文章