写点什么

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

  • 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:05920

评论

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

使用 pyVmomi 采集 vSphere 监控指标

冯骐

Python 运维 监控 Open-Falcon vpshere

技术解析 | Doris Compaction机制解析

百度开发者中心

百度 apache doris

第四章作业(二)

LouisN

四面美团开发岗,成功斩获offer,分享个人面经

Java架构之路

Java 程序员 架构 面试 编程语言

程序员之禅(一)

每天读本书

读书笔记

技术案例 | 云原生微服务落地难?百度自用CRM这样做

百度开发者中心

微服务 CRM #百度智能云#

接口测试--apipost中cookie管理器的使用

测试人生路

接口 Cookie

智慧党建管理系统,智慧组工平台开发方案

13530558032

2021最新京东、字节跳动「3面面经」盘点大厂后端面试高频题

Java架构之路

Java 程序员 架构 面试 编程语言

QA视角看数据匿名化

BY林子

数据安全 测试右移 用户数据 数据脱敏

EEPROM CAT24CXX实现分页读、写数据

不脱发的程序猿

28天写作 CAT24C08 EEPROM 嵌入式软件 单片机

Pgbouncer最佳实践:系列一

PostgreSQLChina

数据库 postgresql 软件 开源社区

Kubernetes 稳定性保障手册 -- 极简版

阿里巴巴云原生

云计算 容器 开发者 云原生 k8s

区块链农产品溯源平台,农产品区块链防伪

13530558032

山东青岛推进平安小区建设!源中瑞智慧社区平台解决方案

源中瑞-龙先生

解决方案 山东 源中瑞 青岛 智慧社区

国产芯片WiFi物联网智能插座—电耗采集功能设计

不脱发的程序猿

28天写作 国产芯片 电耗检测 电压电流 华大MCU

Git学习游戏化,从Learn Git Branching 开始

程序老王

git 学习 学习方法 git 学习

算力挖矿系统开发|算力挖矿软件APP开发

系统开发

程序员成长第十七篇:项目转测

石云升

项目管理 程序员 28天写作 3月日更

2021备战金三银四血拼一波算法:字节+百度+美团+网易+拼夕夕+腾讯+滴滴

比伯

Java 编程 程序员 架构 面试

LeetCode题解:123. 买卖股票的最佳时机 III,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

【LeetCode】区域和检索 - 数组不可变Java题解

Albert

算法 LeetCode 28天写作

Serverless 如何在阿里巴巴实现规模化落地?

阿里巴巴云原生

阿里巴巴 Serverless 容器 微服务 云原生

从0到1建立数据分析指标体系底层逻辑

小飞象@木木自由

数据分析 数据指标 数据分析体系

从0到1建立软件测试质量体系

程序员阿沐

软件测试 测试工程师 质量保证

Vim,人类史上最好用的文本编辑器

沉默王二

vim 开发工具 vim教程

887页Java面试“成神”手册,已助朋友狂砍9个一二线大厂Offer

Java架构追梦

Java 阿里巴巴 架构 面试 金三银四

#集赞送好礼#百度大脑AI开放平台的2020年

百度大脑

浅谈基于ARP协议的网络攻击

行者AI

网络安全

OS命令--shell中数组的操作

cloudcoder

数组 Shell 循环引用

极限编程技术实践

Teobler

敏捷 敏捷开发 TDD 重构 极限编程

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