【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

停止盲目使用微服务

  • 2022-02-17
  • 本文字数:1634 字

    阅读完需:约 5 分钟

停止盲目使用微服务

为什么大多数公司最好要避免使用微服务呢?微服务看起来是一种很好的解决方案。从理论上讲,微服务可以加快开发速度,同时允许你独立扩展应用程序的不同部分。但在现实中,微服务是有隐藏成本的。也就是说,我认为,在没有亲自构建微服务之前,你不可能理解它们有多复杂。


下面是我在构建微服务(有时是失败的)时所学到的经验心得。

管理数据是一场噩梦


保持微服务间的数据同步可能是一项挑战。


每个微服务都有一个数据库,这是推荐的模式。它允许松散的耦合,并且可以让特定服务团队在无需放慢速度协作共享代码的情况下,独立地工作。但如果本应同步启动的微服务中的一个出现故障时,会发生什么呢?比如,其中一个微服务更新了其数据库,而另外一个却没有。这种情形会导致数据不一致。


根据个人的经验,调查跨服务的数据不一致会非常痛苦。错误的跨服务性质需要一个人在不同的服务中工作来修正错误。遗憾的是,这就导致了微服务的优势,即专门针对团队的服务,无法发挥作用。


在一个单体应用中,只要把两个数据库调用合并到一个原子事务中,就能很容易地避免这种情况,因此,所有的插入都会成功,或者都不会成功。非常的简单。但是,松散的藕合会使微服务变得更为难以实现。

设置时间更长


构建一个微服务架构所花费的时间要比将相同的特性整合到一个单体应用中要多得多。尽管单个服务是非常简单的,但是交互的服务集合要远比单一的单体更加复杂。在一个单体中,一个函数可以调用任何其他公共函数。但是,微服务中的函数仅限于调用同一个微服务中的函数。这就需要服务之间的通信。构建 API 或者消息传递来促进这一点并不容易。而且,跨微服务的代码重复也是不可避免的。当一个单体应用可以一次定义一个模块并多次导入,而微服务是它自己的应用:在每一个模块都必须定义模块和库。

微服务最适合大型团队


将微服务分派到各个团队的奢侈做法是留给大型工程部门。尽管这对这个架构来说是一个很大的优势,但是如果你拥有足够的工程师来为每一项服务指定一些工程师,那么这才是可行的。减少代码范围,可以让开发人员对代码有更好的理解,加快开发的速度。但是,大部分的初创公司都没有这样的奢侈。在一个创业早期的公司,由于缺乏足够的资源,有些工程师必须在所有的服务之间工作。遗憾的是,这样做会降低工作效率,因为在不同的应用中跳跃,可能会导致环境的变化。我发现,在我已经很久没有关注的微服务中调查 Bug,是一件非常令人筋疲力尽的事情。

DevOps 更复杂


选择微服务最有说服力的一个原因就是可以在不同类型的服务器上运行不同的服务。这是为什么呢?React 前端的内存、CPU 和启动时间的需求与训练机器学习模型的服务大相径庭。为每一项服务选择适当的基础架构类型,可以极大地减少费用。但是,这也给自己带来了一个挑战。


举个例子,在我的职业生涯初期,由于忘记重启一个更新过代码的服务,导致我丢失了大量的生产数据。过期的代码会通过 API 来接收数据,却没有把数据存入数据库,反而消无声息地失败。这样的数据就会永远丢失了。


我之所以提出这一点,是想要表明,配置、维护和监控多个微服务,要比单一的单体应用要复杂得多。拥有多个应用程序,还为骇客增加了多个攻击面。


从理论上讲,“松散耦合”的服务允许每个服务在其他服务失败时继续工作。但这只是一厢情愿的想法:对于有客户的复杂业务来说,很难实现真正的松散耦合。


最终,你的应用程序架构的可靠程度取决于最薄弱的部分。移动的碎片越多,出错的可能性就越大。

总结


许多公司使用微服务并不是真正需要它们,而且尽管微服务现在很流行,但它们并不适合初学者。大多数公司最好的做法是构建一个单体,然后在绝对必要的时候将单体的部分拆分到微服务中。


把从头开始的微服务架构的机会留给那些财力雄厚的大型科技公司。


你的早期阶段的创业公司也许还没有准备好。我的公司就没有准备好,结果,让我们付出了大量的时间和精力。


作者介绍:


GreekDataGuy,开发者。


原文链接:


https://betterprogramming.pub/stop-using-microservices-build-monoliths-instead-9eac180ac908

2022-02-17 17:175272

评论 3 条评论

发布
用户头像
不敢苟同,事实上是,单体一旦形成很难转型到微服,微服也不会像作者说的很难配置和监控,举个我自己的例子,微服部署在Azure AKS,所有的微服通过Gateway以Client的形式进行交流, 至于监控有太多的实时监控软件比如我用的是kubernetic
2022-03-19 14:26
回复
用户头像
笔者应该是传统架构往微服务架构转型的践行者,很大可能性是刚刚开始尝试使用微服务。微服务架构很多时候和云平台配合可能更容易成功一些。微服务架构已经屏蔽了底层的数据操作,用微服务架构再考虑数据的同步,应该是建设思路和微服务架构理念不适配。
2022-02-22 18:13
回复
用户头像
我们是需要提供很多各种各样的API接口,因此按照业务分类、性能要求拆分了10+个小的微服务,可以提高接口性能和服务稳定性
2022-02-20 18:49
回复
没有更多了
发现更多内容

张文歆:思维需碰撞,才有更大的“火花”|对话 Doris

SelectDB

开源 职场 成长 学习路线 开源治理

单实例并发超1个亿!阿里云飞天洛神云网络NLB网络型负载均衡性能重大突破

云布道师

负载均衡 阿里云 云网络

关于HTTPDNS,你知道多少?

移动研发平台EMAS

阿里云 网络 HTTP #EMAS

node.js的path路径模块和http模块

急需上岸的小谢

11月月更

HUAWEI DevEco Studio 3.1版本发布,配套ArkTS声明式开发全面升级

HarmonyOS开发者

HarmonyOS

分布式锁

急需上岸的小谢

11月月更

特种设备如何管理?不同岗位视角职责解析

PreMaint

设备管理 特种设备

视频清晰度优化指南

得物技术

深度学习 算法 H.265 视频质量 图像超分

洞见科技姚明:隐私计算行业将会发展为多层级多领域的数据智能流通网络

洞见科技

IM通讯协议专题学习(二):快速理解Protobuf的背景、原理、使用、优缺点

JackJiang

加密算法是什么?有哪几种类型?有什么用?

行云管家

加密算法

DTSE Tech Talk | 第11期:深入浅出畅谈华为云低时延直播技术

华为云开发者联盟

云计算 后端 华为云

旺链科技创始人刘涛荣登“中国区块链60人”榜单

旺链科技

区块链 数字经济 产业区块链 企业号十月PK榜

初步探索GraalVM--云原生时代JVM黑科技

京东科技开发者

Java lua jdk 云原生 GraalVM

kubernetes下jenkins实战maven项目编译构建

程序员欣宸

DevOps jenkins 11月月更

探知数字化研发4 - 底座篇

薛飞

数字化研发 数字化底座

软件测试 | 接口自动化你不懂?听HttpRunner的作者怎么说

测试人

软件测试 自动化测试 接口测试 接口自动化 HttpRunner

有奖报名|StarRocks 获开源热力值增速第一,有你的贡献

StarRocks

数据库

node.js的模块化与npm

急需上岸的小谢

11月月更

EventBridge 生态实践:融合 SLS 构建一体化日志服务

阿里巴巴云原生

阿里云 云原生 EventBridge

房产|2022年10月房价数据出炉!房价上涨的城市仅有…

前嗅大数据

【C语言】goto 关键字

謓泽

11月月更

解析 RocketMQ 多样消费功能-消息过滤

阿里巴巴云原生

阿里云 RocketMQ 云原生

打开时空隧道,重演云栖72小时云世界

阿里云视频云

阿里云 云栖大会

房产|1-10月全国房地产开发投资数据解读

前嗅大数据

Awesome MegEngineer 英雄招募帖,开源社区专属权益等你来领

MegEngineBot

深度学习 开源 MegEngine 开发者福利

一文带你回顾操作系统的内存知识点

华为云开发者联盟

操作系统 开发 内存 华为云

Ernie-SimCSE对比学习在内容反作弊上应用

百度Geek说

人工智能 AI技术 企业号十月 PK 榜

千万级学生管理系统设计试卷存储方案

Geek_92ba6f

HMS Core手语服务荣获2022中国互联网大会“特别推荐案例”:助力建设数字社会

HMS Core

手语 HMS Core

软件测试校招面试题 | 实习生和应届生有什么区别?

测试人

面试 软件测试 自动化测试 测试开发 实习

停止盲目使用微服务_架构_GreekDataGuy_InfoQ精选文章