「如何实现流动式软件发布」线上课堂开课啦,快来报名参与课堂抽奖吧~ 了解详情
写点什么

Monoliths 的分类

2016 年 9 月 17 日

在过去的几年中,我们发表了很多有关于微服务的文章,包括对各种反模式的介绍、它们与 monoliths 的关系以及微服务架构的发展趋势等内容。虽然许多开发者是从零开始使用微服务搭建应用程序,但有许多人都会选择用它来帮助分解遗留的 monolithic 应用程序。过去我们采访过很多人他们在相关领域的经验,最近 Derek C. Ashmore 提出了分类 monoiths 的想法,在下面的文章中我们将讨论如何将其分解为多个管理组件,并可能会实现为微服务。

monolith 这个应用程序过于庞大,我们无法有效管理它。想要改善和修复它代价很高。改变到 monoliths 通常会带来意想不到的后果,比如说你在修复一些部分的时候,另外的一部分就被破坏了。要想管理好 monoliths 必须充分了解技术栈,因此它不能像其他的新技术一样简单地发展和成熟。由于 monolith 很庞大,它的代码很难理解,所以新的开发者要学习太多的相关知识,其代价很昂贵并且非常费时。同样的特性也让公司想将其外包变得不太可能。

所以让我们一起来看看 Derek 所定义的分类,他强调这些特性适用于所有的简单 monolithic 应用程序。在一开始,他介绍了“功能过于花哨的 web 应用程序”:

这类 monolith 特定于 web 应用程序。由于新功能的加入,它变得越来越大、越来越复杂。此外,其中的一些新功能在刚开始设计应用程序的时候并没有考虑进来。因此,这些新的功能的加入非常尴尬,它们不符合最初的应用程序设计。通常我们没有时间和预算在应用程序设计中加入方便维护和支持的新功能。这往往会给技术债务中附加不必要的耦合。

在这一类中 Derek 讨论了几个常见的问题和影响,比如说添加新功能可能会让整个应用程序变得更复杂:

新功能不仅仅只影响了用户界面,它还影响了支持这个界面和底层数据库的服务器端代码。通常服务器端代码和数据库与用户界面紧密耦合,并“假定”目前的业务流程是由界面实现的。

同样,大多数 monolitic 应用程序不能测量或者追踪特定功能的使用:

因此,一旦功能实现了就永远不会移除。移除不用的或者是不常使用的功能似乎逻辑上看起来非常合理,因为这些代码会增加系统复杂度,会对新功能的添加造成负面影响。可悲的是,由于这样做的优势很难衡量,在大多数组织中很难申请到去除功能的预算。

下一种 monolith 的类型是“数据存储扼杀”:

尽管数据库(关系型和非关系型)已经存在了很长一段时间,许多组织的数据库设计能力还远远不够。因此你得到的往往是面向过程的数据存储结构。就是说基于过程的数据存储结构现在由数据库支持的应用程序实现。

Christian Posta 最近提出,数据是微服务中最难处理的部分,Derek 同意这也是 monoliths 的驱动因素之一,并将它们分离。如他所说,重构数据库比重构应用程序代码更难并且会花费更多时间:

任何数据库重构发生的同时还需要支持现有的代码。同样,任何数据库重构还需要转换一些数据的类型。代码的存在状态是非常短暂的,它只在运行时间存在。数据库状态是永恒的。对数据库的改变必须包括将存储在其中的数据也改成新的格式。

根据 Derek 的经验,重构数据库比重构代码风险更大,由于当发现重构数据库发生错误的时候,返回原状态非常复杂,与此同时还要兼顾在重构发生之后输入的新数据不会丢失。在大多数的组织中,丢失数据并不会给予考虑。

Derek 所述的最后一个分类是“过度设计的原始码组件”,Derek 说开发者有时候会“感到无聊,找一些更有趣的事情来做”,而不仅仅是完成手头的任务。这就带来了一些连锁反应,当原来的开发者离开之后,维护代码就会变得更困难,因为一些复杂的代码仅仅存在原来开发者的脑中。

这些就是迄今为止 Derek 对 monoliths 的所有分类。在未来,他打算在博文中展示它们如何可以分解成为更多可以管理的组件或是应用程序。到那时,我们也会跟踪报道后续的文章。

查看英文原文 Categories of Monoliths

2016 年 9 月 17 日 19:00748
用户头像

发布了 217 篇内容, 共 54.0 次阅读, 收获喜欢 70 次。

关注

评论

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

讲真,你知道Python咋来的吗?

华为云开发者社区

Java Python 编程语言 C语言 代码

五周 - 总结

水浴清风

如何应对Spark-Redis行海量数据插入、查询作业时碰到的问题

华为云开发者社区

数据库 redis spark 开源 数据

一张图彻底理解Spring如何解决循环依赖!!

冰河

spring aop ioc 源码解析 循环依赖

《具有算法和程序的离散数学基础》PDF免费下载

计算机与AI

算法 离散数学

WSL2:我在原生的Win10玩转Linux系统

梁桂钊

学习工作即游戏:游戏化生存的现实物语

脑极体

go-zero 如何扛住流量冲击(二)

万俊峰Kevin

go microservice

白皮书丨关于工业互联网,你想知道的都在这儿

华为云开发者社区

工业互联网 华为云 白皮书 ICT 智能

数仓搬迁:从方法到实践,带你解决数据一致性对比

华为云开发者社区

数据仓库 数据 存储 数据校验 搬迁

多线程源码明白了吗?不明白的话来看腾讯大牛给你画的面试重点

小Q

Java 学习 架构 面试 线程

和同事交流不会kafka怎么行,API奉上,不是大神也能编

小Q

Java 学习 架构 面试

C语言常用错误代码释义大全,让你编译运行报错不是烦恼

ShenDu_Linux

编译原理 常见错误

年轻人,学好Nginx,走遍天下都不怕

程序员小灰

c++ nginx Linux 服务器 架构师

iOS 项目避坑:多个分类中方法重复实现检测

iOSer

ios 项目管理 编程语言 iOS Document

Week 10 作业

黄立

架构师训练营第 1 期 - 第十周总结

Todd-Lee

极客大学架构师训练营

阿里要求其内部程序员必须精通的并发编程笔记:原理+模式+应用

Java架构追梦

阿里巴巴 编程 面试 并发 java架构

区块链技术赋能信息通信行业信用监管

CECBC区块链专委会

区块链 信用

让“数字鸿沟”变为“数字通途”

CECBC区块链专委会

数字化时代 支付产品

tcp/ip协议栈——epoll的内部实现原理

Linux服务器开发

TCP/IP 后端开发 epoll 网络协议栈 服务器开发

架构师训练营第十周课后作业

Gosling

极客大学架构师训练营

食堂就餐卡系统UML设计

简简单单

Python进阶——什么是上下文管理器?

Kaito

Python

架构师训练营第 1 期 - 第十周作业

Todd-Lee

极客大学架构师训练营

Linux IO模式及 select、poll、epoll详解(含部分实例源码)

linux大本营

c++ Linux 后台开发 异步IO epoll

美团Java面试一轮游,太激烈了,问啥啥不会,我该怎么办?

比伯

Java 编程 架构 面试 计算机

区块链创新中国价值链

CECBC区块链专委会

区块链

架构师训练营3期第一周学习总结

简简单单

Redis面试受阻?阿里P8架构师整理出的核心笔记+实战+面试题+脑图送你

比伯

Java 编程 程序员 面试 计算机

深入浅出Spark

大数志

大数据 spark 数据科学

Monoliths的分类-InfoQ