单体架构比微服务架构更落后吗?

a40a8bcccd3c62513fc8909120e42563.png

d00526abbcd31aeffd9624771d2cd800.gif

👉目录

1 架构的发展历程

2 单体还是微服务

3 尾巴

单体和微服务谁是毒瘤?单体、分布式、微服务、SOA 到底是什么关系?我的系统该用什么架构?最近终于下定决心研究这个问题并且有所收获,欢迎一起讨论。

关注腾讯云开发者,一手技术干货提前解锁👇

01

架构的发展历程

我坚定地认为要深刻地理解一项技术光靠网上一两张按照各项维度对比的表格是不够的,而是要了解这些技术出现的历史背景:他们的出现到底是解决了什么问题,又带来了什么新的问题,最后又因何而被淘汰。下面这部分内容参考《凤凰架构》以及 Martin Fowler 等人一些文章进行整理,一起来看下历史的浪潮是如何推动架构的演进。

   1.1 原始分布式时代

首先介绍的是竟然是“分布式”而不是“单体”这有些反常识,然而事实上分布式确实出现得比单体早,“单体”这个名称是在微服务开始流行之后“事后追认”所形成的概念,在单体出现之前分布式早已流行,并且成果斐然。

1971年 Intel 公司设计了世界上第一台微型计算机 MCS-4,开创了微型计算机的新时代,计算机逐步从专业的科研设备转变为企业的生产设备。但是微型计算机用于商业生产面临一个非常大的问题:计算机硬件有限的运算处理能力,直接限制在单台计算机上信息系统软件能够达到的最大规模。如果你生在这个时代,相信也能自然而然想到这一问题的解决思路:“人多力量大”、”众人拾柴火焰高“,朴素的真理适用于任何地方,当时高校、研究机构、企等不约而同的开始探索“使用多台计算机共同协作来支撑同一套软件系统”的方案,并取得了一系的成果。谈分布式必然绕不开远程调用,所以下面以远程调用为例谈一下这一时期的探索成果有什么局限性,又产生了哪些深渊的影响。

9bd416c21fad67b4ac7998953ae586d2.png

通过多台计算机分布式协同支撑提升系统规模

大家应该了解“UNIX 系统的版本战争”这一故事,为了避免相同的“战争”重演,负责制定 UNIX 系统技术标准的开放软件基金会与主流计算机厂商共同制订了 DCE/RPC 这一影响深远的远程服务调用规范,它也是公认的现代 RPC 鼻祖之一。因为开放软件基金会本身就负责 UNIX 系统技术标准的制定,在这个背景下,DCE/RPC 带着浓厚的 UNIX“简单优先原则”的设计哲学,预设分布式环境中的服务调用、资源访问等操作尽可能透明,使开发人员不必过于关注他们访问的方法或资源是位于本地还是远程。

然而这个过于理想化的目标在当时面临着太多的技术难题,“远程调用”与“本地调用”相比复杂程度完全不可同日而语:服务发现、负载均衡、熔断、隔离、降级、认证、授权等一系列的问题亟待解决。令人敬佩的是面对重重困难,DCE 从无到有构建了大量的协议来解决这些问题,真的做到了相对“透明”,但是分布式还有一个致命的问题——网络所带来的性能问题。

我们来推演一下:硬件性能不足——>采用分布式服务——>分布式的远程调用导致性能降低(与解决硬件性能不足的初心相悖)——>通过合并多个请求等方式刻意(开发人员需要意识到自己在写分布式程序,与 DCE 透明简单相悖)降低网络性能损耗——>人的能力成为软件规模的约束。这时候分布式从结果来看并不成功,设计向性能妥协让简单透明成为一句空话。

当我们玩游戏打 BOSS 时,喊人解决不了问题还有另外个方法——氪金,20世纪80年代摩尔定律稳定发挥,微型计算机的性能以每两年即增长一倍的惊人速度提升,既然分布式充满了矛盾与妥协,那就加钱换更好的机器,单体时代到来。

98bfc63991a7be4f6a96b6ebcc2aa46c.png

通过提升单台计算机性能提升系统规模

   1.2 单体架构时代

在微服务出现之前“单体”都不认为是架构,因为他太“简单”、太“自然”了,以至于我想找到一本关于单体最佳实践的书籍都没有找到。现在很多书籍把单体当做“毒瘤”,甚至会出现微服务比单体先进的观点,然而事实上真的如此吗?

首先,我们先要明确单体是什么:“单体”只是表明系统中主要的过程调用都是进程内通信,不会发生进程间通信,仅此而已。那么进程内调用是罪恶吗?是毒瘤吗?那肯定不是的。现实中不会有一个人对你说:你这个"Hello, World!"程序不能用单体,因为单体架构是毒瘤。

有个“单体不便于扩展“的论调非常流行,我们着重讨论下这个观点是否准确。我们从性能扩展和功能扩展两个方便说。先说性能扩展:这太简单了,把一个服务部署多个副本,前面加一个负载均衡服务器来均分流量,这是不是就实现了扩展?再说功能扩展:纵向上我从来没见到哪个大型系统代码是不分层的,用过 Spring 都知道写一个服务基本上默认按照 MVC 模式分层以便于扩展;而横向上我们也可以从功能等维度拆分为不同模块(模块之间不进行通信或者进行少量的通信,注意:拆分模块不代表不是单体服务,单体服务也不表示系统只有一个模块),各模块完全可以独立迭代。从这个角度来看单体服务在“可扩展”这一点上也不输与微服务,甚至在开发、调试等方面更优。当前单体服务也有其局限性,比如有个 C++ 实现的系统要实现部分 AI 功能,明显 Python 更有优势,C++ 中执行 Python 虽然可以实现,但是显然不如微服务独立一个 Python 模块来的优雅。现在回来看“单体服务不便于扩展”这个观点并不完全正确。

2d4b24e8c3a7740000d6a9c0dfef9ba9.png

单体也有良好的扩展性

“罪恶的单体”是“大型的单体系统”,而“大单体服务”的主要罪恶在于隔离性。举一个例子,不小心写了一个BUG会导致程序崩溃,如果是微服务只会导致一个模块崩溃,影响的范围也仅仅是依赖这个模块的功能,可是如果是单体服务,所有代码都共享着同一个进程空间,某一处崩溃直接导致整个进程崩溃,那影响的范围就大了。到这里我们可以简单的说:单体服务在同一进程更简单、高效,其代价是损失了隔离能力以及技术扩展性。至于这两点谁轻谁重不可一概而论,要看你的系统到底是一个小卖店还是一个大超市了。

既然单体和微服务各有优劣,为什么后来微服务潮流滚滚而来?互联网是不断发展的,随着微型计算机的普及,软件系统的功能越来越多,对应的开发团队规模也越来越大,我们逐步进入了“大兵团作战”时代,这时候“墨菲定律”+“黑天鹅事件”对系统可用性影响越来越大。

构建一个大规模但依然可靠的软件系统非常难。根据墨菲定律可能发生的事(BUG)就一定会发生,再叠加不可预测的“黑天鹅事件”,随着研发团队的规模不断扩大,系统不可用的概率会被无限放大,举个极端点的例子:假如一个公司有10万人,每个人写出系统的可用性都能达到99.999%,可是当他们共同协作写一个单体服务时,那么系统的可用性就是99.999%的10万次方,约等于36.8%,这个系统简直不可用,更何况人是不可靠的,这时候单体服务隔离性差的缺点凸显。微服务把构筑可靠系统观点从“追求尽量不出错”转变为“出错是必然”,通过拆分服务以减少异常的影响范围,关于微服务为什么可以提升系统的可用性可以用一个例子帮助理解:人体系统由一个个的不可靠的细胞(微服务)组成,大多数情况下一个或者一群微服务(细胞)的崩溃并不会影响我们的生命,我们的人体系统就是用不可靠部件构造的可靠的系统例子。

随着系统规模扩大单体拆分势不可挡,关于大单体如何拆分前辈们也进行了大量的探索,其中比较有代表性的有三种:

烟囱式架构:其实这里并没有什么高深的理论,无非就是随着系统的迭代,把一个系统拆分多个,拆分后的系统相互独立没有业务交互,因此使用这种架构系统又称为孤岛式信息系统,问题是这种情况真的存在吗,如果存在大概率一开始就设计为两个系统,既然是两个系统也就不会放在一个单体里面了,放在一起那必然是因为这两个系统共享了某些资源的,例如存储、权限、账号等等。

8555c61c46efaeba1b15fe5d72761c54.png

微内核架构:烟囱式架构实际很少存在,因为拆分后的系统与系统大概率是有资源共享的,既然如此就大方的把数据、资源、公共服务集中到一块成为一个被所有业务系统共同依赖的核心,具体的业务系统以插件模块(Plug-in Modules)的形式存在,注意微内核架构核心在于微,核心只负责通用业务逻辑,不包括针对特殊情况、特殊规则或复杂条件处理的自定义代码,不是插件化实现就一定是微内核架构,比如 MySQL 只是存储引擎做成了插件,而 MySQL 的 Server 层是核心功能,不能算微内核架构。这种架构至今仍然存在,Eclipse IDE 就是一个典型代表,下载基本的 Eclipse 产品只会提供一个简单的编辑器,一旦添加插件它就能变成一个高度可定制和实用的软件开发工具。当然微内核架构也有其局限性,由于无法预先知道有哪些插件,因此实现一个插件时并不能默认的可以与另一个插件交互,插件只能和内核交互。

目前保险行业也常用微内核架构,由于不同地区、时间、事件索赔规则非常复杂,理赔规则会发展成一个复杂的大泥球,更改一条规则会影响其他规则,开发测试极其麻烦。使用微内核架构模式可以解决其中许多问题:

17ffad3e68b32eb40c7a550ca0ae3367.png

事件驱动架构:事件驱动解决了微内核架构插件不能相互交互的问题,子系统之间建立一套事件队列管道,子系统可以发布消息到队列,也可以订阅队列中的消息。系统之间完全解耦,好的架构历久弥新,迄今为止电商系统依然有事件驱动架构的影子:下单、支付、发货、结算,完全是由事件驱动。

e8980a47f8114f9502d5dfe961fed250.png

   1.3 SOA 架构时代

在原始分布式时代就提到单体和分布式并行发展,单体架构在探索如何拆分、演化到事件驱动架构时,分布式也在曲折发展,SOA 即将登上架构的舞台。

刚接触到“SOA 治理”时我并不是很清楚是到底治理什么,SOA 看起来似乎和微服务是一样的,并没有感受到明显区别。SOA(Service-Oriented Architecture)是面向服务的架构……很遗憾定义实在太多了,我没有找到权威的、明确的解释,但是通过总结起码有两点我觉得是各方达成共识的。

  1. 面向服务的架构中的“服务”是指包含执行完整的、独立业务功能所需的代码和数据的,注意是“代码”和“数据”,也就是说服务是一个独立的功能单元,这里的服务和事件驱动架构中的子系统非常类似,要比今天我们所说的微服务中的“服务”粒度要粗的多。

  2. SOA 的目的是复用,并为此制定了一系列标准,服务之间使用公共接口标准和架构模式,因此可以快速整合到新应用中。这让应用开发人员无需像之前那样重新开发现有功能,因为有公共的接口标准开发人员也不必了解如何连接现有功能 。

这么看 SOA 并不是解决新的问题,依然是在解决分布式服务刚被提出时就预见的困难,但是 SOA 针对这些问题的解决方案更具体、操作性更强,并形成一揽子规范标准,相比前面的烟囱架构、微内核架构、事件驱动架构,SOA 就显得具体的多,举几个例子:SOA 明确了采用 SOAP 作为远程调用的协议、明确使用企业服务总线(ESB)来实现各个子系统之间的通信交互等等,从技术角度 SOA 成功地解决了分布式环境下出现的主要技术问题,那 SOA 为什么逐步被微服务替代呢?

0d6ef02a8be384acab36d12c7870e998.png

因为 SOA 太重了,过于严格的一揽子规范定义带来过度的复杂性,落地成本非常之高。我们以远程服务调用(Remote Procedure Call,RPC)为例:RPC 出现的最初目的是为了让调用远程方法和调用本地方法一样简单,直到今天还有人这么认为,实际上今天的大多数 RPC 技术已经不再追求这个目标,因为通信不是无成本的。Andrew Tanenbaum 教授曾在1987年发布一篇论文,核心论点是本地调用与远程调用当做一样处理,这是犯了方向性的错误,把系统间的调用做成透明,反而会增加程序员工作的复杂度,这个观点在后几年一直有争论,直到大名鼎鼎的 Sun 公司一众大佬总结“通过网络进行分布式运算的八宗罪”该观点才被广泛认可,明确 RPC 是语言层次的特征,而不是系统层次的特征。

既然是 RPC 是语言层次的特征,编程语言那么多,最理想的是有一套统一的规范来解决 RPC 中如何表示数据、传递数据、确定方法三个基本问题(事实上直到现在 RPC 协议都是混乱的,数一数现在流行的 RPC 协议有多少个)。这个规范的发展很曲折,我们重点关注一个历史性的时刻:W3C 在1998年发布 SOAP 1.0 来实现 Web Service。SOAP 当时风头一时无两,虽然现在来看他在性能上和易用性上并不完美,但是这并不是他没落的原因,而是因为过于“理想主义”的期望解决解决分布式计算中可能遇到的所有问题,为此定义庞大 Web Service 协议家族,学习、使用成本非常高,脱离人民群众的做法导致 SOAP 必然逐渐淹没在历史的长河中。SOAP 作为 SOA 登上架构舞台的重要条件,他的没落也意味着 SOA 架构的没落。

回顾“原始分布式时代”这一讲中:Unix DCE 提出的分布式服务的主旨是“让开发人员不必关心服务是远程还是本地,都能够透明地调用服务或者访问资源”。但是现在 SOA 已经背离了这一初心,于是微服务时代到来。

   1.4 微服务架构时代

微服务真正崛起始于2014年,这时候的微服务已经和9年前刚刚被提出时有了明显的区别。最开始微服务是 SOA 的轻量版,既然 SOA 过于繁重,那么微服务就尽可能的抛弃 SOA 里可以抛弃的所有约束和规范,回归透明简单的初心;当然现在微服务已经脱离 SOA 成为一整独立的架构风格,Martin Fowler 在《Microservices: A Definition of This New Architectural Term》一文中对微服务解释已经足够详细,这里不再赘述。

那么微服务和 SOA 到底有什么不同?讨论这个问题实在意义不大,因为他们之间的关系实在太微妙了,有人说 ESB 是 SOA 的特点,这其实是过于武断了,微服务抛弃了 SOA 中所有可以抛弃的标准并不代表微服务一定不用,别忘了微服务是自由的。我们只需要知道:微服务提倡以“实践标准”代替“规范标准”,针对 SOA 解决的那些分布式服务的问题在微服务中不再会有统一的解决方案,开发者可以结合实际情况自由选择。微服务是普通开发者的狂欢,可以随心所欲;微服务是架构者的噩梦,对架构师的能力要求提升到史无前例。微服务并不是什么银弹,没有必要过分地神话他,分布式架构中出现的问题如注册发现、跟踪治理、负载均衡、传输通信等微服务一个都没有避免,该需要解决还是需要解决。但是在云时代下,微服务迎来新的契机:云技术让微服务从软件层面独力应对分布式问题发展到软、硬协同应对,也称为“后微服务时代”。

当问题不局限于采用软件方式那很多问题都简单了。例如软件可以通过命令伸缩扩容服务,硬件难道就不可以通过敲键盘就变出相应的应用服务器、负载均衡器等基础设施吗?氪金买云服务一样可以解决问题,虚拟化技术让软件、硬件的边界开始模糊,一旦虚拟化硬件变得足够灵活,那么和业务无关的技术性问题都可以解决于基础设施内,让研发专注于业务开发。后面也催生出了云原生等许多新的概念,但是从本质上讲他们所追求的目标和微服务没有什么区别。微服务时代所取得的成就离不开以虚拟化技术的巨大贡献。

微服务+云让普通程序员也同样能写出可用于生产的软件产品,但是对于架构师提出更高的技术要求,这会导致开发者的分层,形成大部分普通程序员加上小部分软件设计专家的金字塔结构。

   1.5 无服务时代

回想分布式架构之所以存在,最开始就是因为单台机器的性能无法满足复杂系统的需要。那么如果单台机器如果性能无限所有问题都解决了。以前不敢做这样的假设,但是现在云计算技术的发展实际已经让这个畅想接近现实,而所谓无服务实际主要涉及两点:后端基础设施和函数。后端基础设施提供了日志、存储等等这一类用于支撑业务逻辑运行,而函数负责实现业务逻辑。我们不用考虑容量和算力问题,函数就是服务。现在云计算提供的能力已经让无服务初见端倪。

到这里架构演变的历史我们已经理清,相信你也理解了每种架构出现的意义与淘汰的原因,接下来我们一起讨论该如何选择架构来解决今天我们所面临的现实问题。

02

单体还是微服务

我们花了大量的篇幅去讲架构演进是为了在历史的浪潮中,理解每种架构出现的意义和淘汰原因,解决今天我们所面对的现实问题。直到现在关于架构好坏之争依然存在,最激烈的讨论就是的单体还是微服务。先说结论,假如一个业务发展良好,当系统复杂度增加到一定程度必然是从单体迁移到微服务的,但在这之前,我推荐单体。下面我们来看下是什么驱动复杂系统从单体向微服务迁移。

   2.1 为什么要使用微服务

天下熙熙,皆为利来;天下攘攘,皆为利往。有收益才有付出,上文已经介绍既然单体是如此简单、自然为什么还要迁移到微服务呢?为了更好的性能?微服务可以扩缩容自如,很好的应对业务发展所带来的性能压力,问题是随着云计算的发展,单体服务同样可以集群化部署、同样可以很方便的扩缩容,而且硬件的价格越来越便宜,甚至单体服务还减少了 RPC 所带来的性能损耗,这个理由看似正确,实际上是站不住脚的。仅仅为了性能而选择分布式的话,那应该是 40 年前“原始分布式时代”所追求的目标。需求是不这样不行,而不是这样也行,同理复杂系统迁移微服务必然也有着非迁不可的理由。

   2.1.1 当团队内个人能力因素成为系统发展的明显制约

这个问题很好解释,前面我已经举了一个极端例子:有10万人写一个单体服务,假如每个人写出系统的可用性都能达到99.999%,那么这个单体服务的可用性只能达到36.8%。更何况没有人能保证招到的人全部都专业、靠谱,即使可以人也具有不稳定性,受到情绪、健康状况、人际关系影响也可能干出各种不靠谱的事,难以做出整体可靠的大型系统。由于在单体架构下系统中“整体”与“部分”的关系没有物理的划分,一旦发生错误缺乏有效的阻断手段,而少量的专家也没有办法控制某个人研发在某行不起眼的代码生成一个 BUG 并造成全局影响。

这种情况下,团队人员水平参差不齐,或者团队已经发展的非常大,微服务都是一个更好的选择。在单体架构下,系统质量只能靠研发与项目管理措施来尽可能地保障,而微服务已经假定系统一定会出错,架构本身就追求独立、自治,让高水平专家来开发和维护关键的基础设置和业务服务,至于其他非核心功能发生错误可以依靠基础设置的自愈能力恢复,退一万步来讲即使不能恢复影响也控制在一个小的范围,而系统整体依然是高可用的。

   2.1.2 当语言或者技术框架成为系统发展的明显制约

语言没有好坏,但有适不适合,举一个非常简单的例子:近几年人工智能开展的如火如荼,所有的软件都在考虑怎么结合人工智能提供能优秀的服务,让业务进入第二增长曲线。但是稍微一调研就会发现 Python 对于 AI 训练的支持是其他所有语言所无法比拟的,如果原来的系统使用 C++ 实现,这时候对不同技术栈、不同框架实现的功能进行分布式部署并不是你想或者不想的问题,而是没有选择、无可避免的。当然非要在 C++ 里执行 Python 也可以,可是使用这些奇技淫巧所带来的维护成本是无法估量的。

   2.1.3 当组织的人员架构成为系统发展的明显制约

康威定律大家应该都了解,这里不做额外的赘述。变化是永恒的,随着业务规模的不断扩大,开发该系统的团队也必然不断扩大,组织架构随之调整是自然而然的事。我们对抗不了康威定律,随着组织架构的调整系统架构必然随之调整。举个简单的例子:我要对某个模块进行发布,该找谁审批,必然是自己的领导?但是如果是单体服务很可能涉及到多个团队,让每个团队的领导都来审批会导致发布效率低下,这是很难容忍的。

那如何识别组织架构已经成为制约了呢:当所有的决策都要依赖某个人或者某个会议,对某个服务或者功能没有人愿意承担责任,或者愿意承担责任的人成为决策单点时,这时候就该意识到该拆分服务了。

   2.1.4 小结

我们要认识到微服务是有成本的,这里如果用一张表格来从各个纬度对比来说微服务需要解决哪些哪些问题可能并不会让你有直接的感受,下面是网上一张著名的图:Netflix 公司在2014年公开的微服务调用关系图。我相信 Netflix 中没有一个人可以理清楚该系统的服务间调用关系,这是一个黑洞,如果某个微服务需要修改协议,很难理清楚到底需要周知哪些依赖方进行兼容修改。

8de548f241ade969ab251ebe3adecef5.png

Netflix 公司在2014年公开的微服务调用关系图

微服务核心价值是拆分之后的系统能够让局部的单个服务敏捷开发,最主要的目的是对系统进行有效的拆分以进行物理隔离,通过一系列的自制手段用不可靠的微服务构造可靠的系统,然而微服务在解决单体问题的同时又会带来额外的很多问题,这里如果权衡不好反而会导致生产力下降,而系统进行任何改造的根本动力都是“这样做收益大于成本”,因此“对于中小型系统单体架构就是最好的架构”,只有在业务已经发展到一定的程度,单体架构与微服务架构的生产力曲线已经到达交叉点,此时开始进行微服务化才是有收益的。至于这个是否出现了这个交叉点如何判断,可以审查一下是否出现了以上三点。

8b0f2afa5eaaa06d535f5fcdb840a852.png

图源《凤凰架构》

   2.2 使用微服务的必备条件

即使我们有了充分的理由要迁移微服务也不能立刻迁移,还要看当前团队是否具备迁移微服务的条件,贸然迁移很可能会适得其反。

   2.2.1 组织中具备对微服务有充分理解的专家

讲微服务时代时候就提到,微服务给予编码人员充分的自由,但对于架构师却提出了史无前例的高要求。在实际研发团队中并不是每个人都是架构师,也不是每个人都会去探究扩展、认证、隔离等和具体业务无关的问题,大多人普通程序员还是更聚焦于业务代码的编写。可是使用微服务却不关注这些问题那带来的灾难将是巨大的。举几个例子:微服务之间如何路由?微服务之间如何进行权限认证?微服务超时间如何配置才能规避重试带来的雪崩?流量变化以怎样的策略进行扩缩容?而这些问题不解决很可能影响整个系统的可用性。使用微服务架构的团队经常会遇到这中情况:微服务划分不合理导致高扇入、高扇出,加一个字段要修改 N 个模块、测试 N 个接口,极其低效。因此要想享受微服务带来的好处,首先就需要有专家认识到其中的风险,设计靠谱的架构。如果整个团队中缺乏能够在微服务架构中撑起系统主干的专家,强行迁移微服务带来的收益不足以抵消复杂性增加而导致的成本。

   2.2.2 系统应具有以自治为目标的自动化与监控度量能力

我们期望团队具备这样一个资产管理系统,可以清晰的看到所有的资产、服务运行情况以及系统还有多少风险项没有消除。微服务是由大量松耦合服务互相协作构成的系统,一旦切换为微服务意味着资产成倍增长。我们再来回顾下:微服务是正视问题,认为“错误一定会发生”,因此要有一系列的手段来用不可靠的微服务构造可靠的系统。这个前提系统能够监控自身的健康状态以实现自动恢复,也就是我们需要奔着自动化运维目标前进。

在团队缺少基础设施的情况下使用微服务是冒着极大风险的,想象一下系统故障,原来使用单体服务只需要查看少数模块就可以定位问题发生点,假如拆分为数百个模块,如果没有有效的监控系统,该需要多少时间才能定位到异常原因。

   2.3 如何实践微服务

如何实践微服务这个话题太大了,远远不是一篇文章所能够承载的,光介绍微服务的书就有《微服务设计》、《微服务架构设计模式》、《微服务分布式构架开发实战》 等等很多,这里我只是简单提几个点与大家一起讨论:

如果团队规模较小,在开始一个新的系统的时我认为应该坚定不移的选择单体服务。这时候希望团队对于做出使用的单体的架构师有充分的信任。现实中往往在立项之初就会给业务定下长远的目标,但是从技术角度还是应该立足当下,然后随着业务不断发展对架构进行及时调整。切不可当业务发展到一定规模时需要拆分微服务时再来指责架构师:“当初我就说应该使用微服务,而不应该使用单体这种落后的架构”。客观的想一下,与一开始就用微服务比,前期使用单体所节约的工作量,比起迁移所带来工作是划算的。我们也应该有这样的意识:我们没有办法设计出一个永远不变的完美的架构,架构一定是随着业务发展而不断变化的。

如果团队规模较大,在一开始就由多个更小的团队共同完成一个系统,那么我们不要试图对抗康威定律。应该围绕业务能力将系统划分为相对独立的服务由不同的小团队负责,这些服务之间的交互使用统一的规范。而且推荐这些服务是去中心化的,也就是每个团队开发服务都可以有自己的选择。推荐每个服务管理自己的数据库,即使这些数据在不同的服务中的出现,但是每个服务所需要的属性多少有差异,还是推荐自己维护以便于团队独立迭代。实际上就是每个小团队维护了一个小的子系统,那么参考第一点“如果团队规模较小”时的结论,各个小的团队构建服务也从单体服务架构开始,没有必要从一开始就再拆分多个更小的服务。我所在团队也一直在探索和实践微服务,某业务的核心功能到现在依然是单体服务,该业务已经发展三年,到现在为止尚没有因为使用单体而在某一点上明显拖慢效率。

0a7ae419a35a90e63952a5781947bd23.png

03

尾巴

回到导语中的问题,单体和微服务谁是毒瘤,都不是,他们只是在某个历史阶段下适应潮流而生的一种普通的架构,并没有高低贵贱、先进落后之分;而现在,也只是我们结合业务和团队实际情况进行利益取舍后,供我们选择的方案之一罢了。

   参考资料

  1. 《凤凰架构:构建可靠的大型分布式系统》周志明

  2. 《Microservices: A Definition of This New Architectural Term》 Martin Fowler、James Lewis

-End-

原创作者|邬俊杰

cd032e6ae1b974d0738c9f66fd7d1319.png

你做过哪些有关单体和微服务的项目吗?为什么会选择单体/微服务?欢迎评论分享。我们将选取点赞本文并且留言评论的一位读者,送出腾讯云开发者定制发财按键1个(见下图)。11月7日中午12点开奖。

0f00089cdc26fdf1e8e49424e3a31895.png

📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~

d19802ca4a444142eaeb954805712773.jpeg

(长按图片立即扫码)

6c92d55dc22cc94e3b4c75e4c8e43e02.png

8e07b119c791fd26b6d88305ae6e7c96.png

1b51860ce86bc7dc90296fc0026c38da.png

17a75414db7ee78b0a282adb7225aef3.png

2a03fc9421d03faafbdf8dd18ef03a06.png

相关推荐

大模型的Agent Skill功能,在LLM HTTP底层交互流中是怎么承载的?

网络文章文本的 skill,昨天我实现了之后也就开始好奇起 Skills 的底层原理了——相比起各种花里胡哨的 agrnt 应用,我一直以来都很对大模型在纯粹的 HTTP 交互层面是如何交互的更感兴趣。Skill 的全部"魔法"都发生在 system prompt 的措辞和 SKILL.md 文件的编写质量上——本质上是一种 prompt engineering + 文件系统的组合。但是各种天花乱坠的 skills,是如何在底层的 HTTP 中,与大模型——这个只会嘴遁的工具交互的呢?

QcloudCommunity的博客 405

万字入门AI Infra:深入理解大模型中的数学与Infra优化

关注腾讯云开发者,一手技术干货提前解锁👇AI Infra科普、入门或者进阶 ~~ 不到 5 万字,带你融会贯通理解大模型的数学、算法、硬件到系统工程。任何问题欢迎沟通交流。可怕,我竟然有点认同这句话。当然大概率是因为姚顺宇太懂AI了,而我则是因为无知者无畏。不过仔细想想,大模型推理中的数学逻辑确实不复杂,很多原理只需要高中数学知识就能看懂。但是为什么像 vLLM 这种推理系统这么复杂呢?本文将拆解大模型中几个核心操作(RMSNorm、Softmax、Causal Mask、Sampling)背后的数学与

QcloudCommunity的博客 1163

平平无奇的源码,竟藏着Agent的核心秘密?

System Prompt 是剧本,Skill 是剧本的扩展包,Agent Loop 是演员按剧本行动。欢迎留言,我们将邀请作者针对性回复你的评论,我们将选取1则优质的评论,送出腾讯云定制文件袋套装。,让 Agent 能主动"巡逻",而不只是被动等待用户消息。OpenClaw 的 System Prompt 分层结构。的"行为底线",任何 Skill 或用户命令都无法覆盖它。精华 2:Skill 的"按需加载"避免 token 浪费。精华 1:System Prompt 是"分层乐高积木"

QcloudCommunity的博客 424

QQ音乐Harness Engineering实践

一个看似简单的需求,背后可能牵动服务调用链、配置、灰度、埋点、错误码、接口契约和历史兼容性。当 AI 开始快速生成大量代码,真正的瓶颈就不再是"写不出来",而是"看不完、想不清、管不住"。在对话式编码阶段,一种典型的工作模式逐渐流行:开发者把需求丢给 AI,扫一眼输出"看起来对"就直接采纳,不审 diff、不追问逻辑、不验证边界。以音乐商业化业务为例,一个需求可能从 TAPD 单开始,经过需求评审、技术方案、服务影响面分析、IDL 契约变更、业务代码实现、测试验证、CR、灰度上线,最后才进入稳定运行。

QcloudCommunity的博客 713

从Prompt、Context到Harness,工程的三次进化与终局之战

同时,强制要求散落各处的决策记录(Slack、邮件、文档)全部迁移至代码仓库,确保 Agent 的唯一信息来源是可信的、版本受控的仓库。更坑爹的是,研究表明,当上下文过长时,模型会出现"中间遗忘(Lost in the Middle)"现象:它对开头和结尾的内容记忆较好,对中间大段内容的关注度大幅下降。这篇文章,我想带你完整走一遍这三次进化的逻辑:它们分别解决了什么问题,它们之间是什么关系,它们的边界在哪里,以及:当三者融合,AI 工程师的终极形态究竟是什么?大语言模型的本质,就是这位金鱼助理。

QcloudCommunity的博客 715

让Skill自己训练自己:8阶段Loop、3层评测、5维AND门控,从此实现自进化

所以每一轮改动都是有据可查的,不是「感觉这里可以优化」,而是「Case 41 挂了,因为 agent 把离职问题路由到了邮箱分类,但正确答案在通讯录,所以我改 root_index.md 加个易混淆提示」。但让我最后决定把它记录下来的,不是这的个「吸收」过程,而是它真的在替我探索我不想费脑力触达的边界,这看起来更像是一个机器智能应该有的样子。不准跨层,每轮只改一层的东西。但我经过这 19 轮之后觉得,更准确的描述是互补——你在明处看着,AI 在暗处替你试错,你看不见的那一半就是 AI 能贡献的地方。

QcloudCommunity的博客 1125

只加两行代码,为什么要两天?一文深度理解业务系统的复杂性

关注腾讯云开发者,一手技术干货提前解锁👇业务系统复杂性一直是令开发者头痛的问题。复杂的不是增加一个需求需要耗费多少时间,而是在增加一个需求后带来的蝴蝶效应:其它功能会不会受到影响、要如何去找到这些影响,最终如何实现系统正常运行......功能之间隐秘增加的耦合、不可避免的代码腐化在导致业务复杂性增加。大家都在说的软件开发提效到底在提什么?程序员日常工作中应该如何提升开发效率?敏捷开发、瀑布流式开发孰是孰非?欢迎阅读。业务背景与目标我依然非常清晰地记得某个时候,我所在团队 Leader 曾讲过一段话:“我担

QcloudCommunity的博客 711

从零设计生产级 Multi-Agent Harness:架构、评估、记忆、成本与 MCP 工具接入全拆解

在 AI Agent 领域,Multi-Agent Harness 指的是把多个 Agent 的能力、工具、状态、通信、编排、监控统一收束在一个运行时之内的框架。第三,Agent 路由。一个输入框,一个大模型,几个工具,一段写得很漂亮的 System Prompt,再配上一个炫酷的前端,看起来就像一个能干活的“数字员工”。Multi-Agent 完全不一样——它有计划、有中间步骤、有工具调用、有 Agent 协作、有重试、有反思、有最终合成。增加 Budget、权限、重试、压缩、轨迹评估、审计、回归测试。

QcloudCommunity的博客 709

拆完Hermes源码,我发现Agent的“自我进化“根本不需要训练模型

两个月 5.2 万 Star,Hermes Agent 用一个"LLM 审判官"机制实现了 Agent 的自我进化——不改模型权重,只改"怎么用模型"的策略。OpenClaw(社区昵称"龙虾"🦞)是 2025-2026 年最火的开源 Agent 框架,30 万+ Star,插件市场 ClawHub 里有数千个插件,能接入 Telegram、WhatsApp、Slack、飞书、企业微信——几乎是一个"个人 AI 操作系统"。Skill 是英语写的,Memory 是英语写的,审查 Prompt 也是英语写的。

QcloudCommunity的博客 907

AI Infra 其实没有多少新东西

传统 Infra 追求横向扩展,而 AI Infra 呈现 “AI 大型机”特性,是因为传统后台服务的可以容忍毫秒级延迟,但 AI 集群不行,GPU 的算力是 CPU 的数百倍,微秒级的延时等待也会造成很大的算力损耗,需要硬件的高度集成。在可预见的1-3年的未来,这样的专用硬件+网络的集中式架构很难发生比较大的改变。与之相似,模型推理的批处理就是将多个输入样本打包(batch),将原本串行的 N 次轻量的推理计算,合并为 1 次重量的计算,实现单位时间内处理更多的请求,提高了 GPU 利用率。

QcloudCommunity的博客 821

程序员越早想通这些越好

永远没有正确架构,你永远无法偿还完所有的技术债务,如同你永远不会设计出完美的界面,请避开完美主义的陷阱,永远没有完美的代码,能够满足当前需求,又为未来不管是自己还是他人留有扩展空间,就很好了。我们努力的方向就是将现实世界映射到有限的数据结构中,这就需要用户自定义类型,如果你的代码中包含类似 trader portfolio 这样的概念,你就可以使用他们的名称来建模,而不是使用基本数据类型复杂嵌套表述你的目的。从另一个角度看,代码里的注释都是补丁,是碎片化的,局部的注释很难推导模块整体的顺序及耦合关系。

QcloudCommunity的博客 465

RAG已死?不,是Grep回归了!

这样一来可以直接复用已有的计算缓存,只为新增的增量部分付全价,前面累积的大头按约 1/10 的缓存价计费。所以实际的工具组合方式是灵活的:Grep(默认模式)→ Read 是最常见的路径,但 Grep(content 模式)可以独立使用,LLM 也可以直接调 Read(如果已经知道文件路径),或者一次同时发起多个 Grep 并行搜索。它从零开始构建自己的对话历史,不继承主对话的消息,这意味着它搜索过程中产生的大量 grep 结果、代码片段都留在自己的 context 里,主对话只收到一段总结性的文本结论。

QcloudCommunity的博客 574

深入浅出Harness Engineerring之核心模式与理念

在智能体生命周期的关键节点(如会话开始、工具调用后)自动触发预设动作(如代码格式化),由系统确保关键流程被执行,不依赖可能被模型遗忘的指令。简单讲就是利用向量存储这个技术,来实现模糊检索,原理是:即使字面不同,但语义相近的文本,其向量在数学空间中的位置也很接近。根据命令类型、参数和影响,自动评估其风险等级(安全、有风险、危险),并采取自动执行、请求确认或直接拦截等不同策略。关键特性是可隔离、可重建、可扩展。不是一次判断就定终身,允许你改变、允许情况复杂,通过不断观察、思考、调整,越来越懂真实的你。

QcloudCommunity的博客 621

Harness Engineering实践心得:如何高效驾驭AI?

但如果这些经验被拆成一条条 Rule、一个个 Skill、一项项 Script 检查——"XAML 不能有中文"、"编译要用这个路径的 MSBuild"、"SVN 命令必须带认证参数"——AI 就能在秒级时间里"吸收"十年的踩坑经验。然后可以看到下方的图,我的PM会很顺利的调度其他agent分别负责不同的事项,遇到问题的时候也能准确的找到合适的agent。MCP 本质上是在扩展 AI 的"感知范围"——Rule 管"该怎么做",Skill 管"怎么操作",MCP 管"能看到什么、能碰到什么"。

QcloudCommunity的博客 838

从第一性原理思考 Agentic Engineering

需要注意的是,这一结论是有条件的:如果 AI 缺乏领域知识,过早介入反而可能引入 1.2 节所述的"似是而非"损耗——因此上下文供给(实践 1)是 AI 全链条参与的前提,而非结果。通过一个专门的自迭代 Skill 实现——当 AI 在协作过程中识别到自己被纠正(用户否定了 AI 的输出并给出了正确方向),它自动评估这个错误的根因,搜索现有的 Rules 和 Skills 中是否已有针对该类问题的处理规则。事实上,越是复杂的项目,工程师的认知负担越重(公理 3),AI 分担认知负担的潜在边际价值也越大。

QcloudCommunity的博客 756

万字干货!Harness Engineering如何工程化落地?

关注腾讯云开发者,一手技术干货提前解锁👇Harness Engineering 的概念已经火了有一阵了,全网很多文章基本都是在讲理念,讲为什么今天做 AI 开发,不能只靠一段提示词,也不能把模型当一个“更聪明的代码补全”。但与此同时,一个问题也在持续地发酵:这个问题特别重要。因为 Harness 这个词听上去很大,很像一个抽象的方法论,但它如果不能落到工程、目录、文档、脚本、工作流里,那它最后就只是一句漂亮的话。事实上,不同项目落地出来的 Harness,表面上可能完全不一样。有的项目是 CI 很强,有的

QcloudCommunity的博客 1165

全方位对比:Hermes VS OpenClaw

多账号矩阵运营 如果你的业务涉及同时管理多个社交媒体账号、多个平台的内容分发、多渠道的客户互动——OpenClaw是目前市场上的"无可替代的底座"。一个有专业背景的个人,现在可以快速构建一个垂直领域的AI助手:比如"财务分析Hermes"、"法律咨询Hermes"、"技术架构Hermes",直接通过微信提供服务,积累自己的专业IP。跨平台生态融合 如果你的工作流涉及飞书、Slack、Discord等多个平台的深度集成,需要这些平台之间的数据流转和联动——OpenClaw的生态支持是强大的。

QcloudCommunity的博客 1217

一文讲透:Harness Engineering即控制论!

而研发模式的升级我认为将会是一个飞跃的过程,之所以现在我们仍然需要需要参与编码,一个非常大的原因就是缺乏传感器和基建,仍然需要人来串流程,比如需要人来验证UI是否正确、需要人来告诉AI代码不符合代码规范,因此在有些场景我们仍然感觉 AI 完成的很吃力,但这不是 AI 能力不行,而是我们并没有为 AI 提供友好的环境……控制论中的突变理论介绍了矫枉过正和飞跃现象之间的矛盾,如果质变中经历的中间过渡态是不稳定的,那么他就是一个飞跃的过程,如果中间过渡态是稳定的,那么他就是一个渐变的过程。但是这些阶段要解决的。

QcloudCommunity的博客 1202

神级开源插件!一句话让QClaw变3D小镇,Agent工作可视化,赛博云监工

这个架构是翻了几次车才想通的—原有AI的实现机制是用 setTimeout 猜动画时长导致了幽灵 NPC、工位撞车、越改越崩,后面我停下来换了思路,推翻原有的架构,按照“意图+回传”的架构进行重构,之前的问题一次性全部解决。15 天,我和 AI 吵了 185 次架, 4.5 万行代码,开发了一款 QClaw / OpenClaw 的UGC游戏插件,这可能是人类跟 Agents 交互的新范式,插件已完全开源,有需要的欢迎自取~我天天用,用着用着我就在思考,Agent 产品现在的交互体验,基本都一个样。

QcloudCommunity的博客 1195

一文搞懂Hermes:新顶流Agent如何从经验中自我进化

Voyager 是一个能在 Minecraft 中自主探索、学习技能、无限积累能力的 AI Agent,它提出了 "Skill Library"(技能库)的概念——Agent 将成功的行为序列编码为可复用的技能函数,存储在一个持续增长的代码库中。如果 Skill 的名称和描述不够精准,或者用户的任务描述与 Skill 的触发条件有语义差距,Agent 可能会错过相关的 Skill。如果进程在写入过程中崩溃,目标文件要么是旧内容(还没被替换),要么是新内容(替换已完成),绝不会出现写了一半的损坏文件。

QcloudCommunity的博客 2631

自掏腰包一万元,拥抱AI这一年,我的工具、实践和思考

其实也很好理解,过往的每个领域(比如前端、后端、设计、测试等等)都主要是这个领域的从业者在为它添砖加瓦,但是大模型时代的 AI 应用领域却几乎是所有使用 AI 的人类一起在迭代,无分领域,无分文理,无分老少。因为每个时期的 AI 都有着不同的特点,很多时候当我费尽心思去钻研,自以为有点弄明白 AI 应该怎么玩的时候,基座模型和行业范式常常就会迎来颠覆式的变革,很多过往的经验都会倾覆,然后只能从头再来。过去一年多,被热议的 AI 范式大概是沿着四个阶段递进演化,每一个阶段其实都在解决前一个阶段的核心问题。

QcloudCommunity的博客 626

办公Agent的CI/CD时刻到来了

核心观点是:企业给员工配了一堆 AI 工具,试点跑了几百个,但真正拖慢 AI 转型速度的瓶颈不在模型能力,在"最后一公里":AI 输出和实际工作流之间的那道鸿沟。代码写完,打个 tar 包,开 FTP 传到服务器上,SSH 进去解压,改配置文件,重启服务,刷一下页面祈祷别 500。你复制,切窗口,粘贴到腾讯文档里,发现 Markdown 格式全乱了,手动调标题层级,代码块重新标记语言类型,表格散架了重排一遍。模型是越来越聪明了,但"生成"到"落地"之间那段路,还是你自己在走,一步一步,手动搬运。

QcloudCommunity的博客 608

4亿token买来5个教训:让6个AI Agent连写4天代码发生了什么?

Watchdog 检测到崩溃 → 启动诊断 Agent 分析原因 → 诊断 Agent 跑满 20 轮没搞定 → Watchdog 判定“已修复”,重启系统 → 重启的系统因为诊断 Agent 留下的环境变量被继承,连续 3 次拒绝启动 → 触发连续失败保护退出 → Watchdog 第 3 次巡检,发现进程和记录文件都没了,尝试手动重启,自己也停了。启动前我翻了论文、做了架构设计、写了监控+修复异常的脚本。这个发现让我的情绪从沮丧变成了兴奋——不是那种"终于修好了"的释然,是"我找到根因了"的快感。

QcloudCommunity的博客 584

赛博斗蛐蛐:9大模型决战三国志,天命在谁?

我猜是这样的,当Gemini面临决策的时候,一系列关键词比如 守城,劣势,粮草,三国等等,在语义层面的关联性中LLM发现了竖壁清野这个关键词概率非常高,所以以此为策略,然后再根据这个策略完美执行操作。MiMo 的外交是三方中最精明的。Kimi作为国产模型,也同样颠覆了我对他的看法,最后的比赛他甚至一度是优势者,存在很多夺冠的可能性,要知道他的对手可是claude和gemini,而他经常出兵慢,回过头来想想或许正是他的策略,毕竟中后期他的优势都来自于稳健的发展和较少的战斗频率(和claude比).

QcloudCommunity的博客 874

Claude Code是怎么知道你在骂他的?这 12 条发现值得关注

确实存在——5,500+ 行,集成了消息队列、工具装配、MCP 编排、会话状态、权限、分析、文件持久化和优雅关闭,基本上一个文件干了所有事。对抗虚假声明——"不要在输出显示失败时声称所有测试通过,不要压缩或简化失败的检查来制造绿色结果"。完整的 KAIROS 是一个持续驻留的守护进程,能感知你在不在电脑前、主动寻找有用的工作做,更像是住在终端里的全职同事。源码里藏着一个叫 "Buddy" 的电子宠物系统,完整度令人惊讶——这不是一个 TODO,而是一个从数值系统到 ASCII 动画都实现了的完整功能。

QcloudCommunity的博客 701

逆向深扒Claude Code源码,我发现了什么!?

Anthropic 内部用户获得更严格的质量控制 prompt、更好的验证机制(独立 Verification Agent)、以及针对 model 弱点的专门对策(如 Capybara v8 的 29-30% 错误声明率对策)。这不是代码混乱的标志——它是整个 Agent Loop 的心脏,所有的流式处理、工具调度、上下文压缩、子代理管理都在这个文件中协调。这种"胖核心"设计是刻意的:保持核心循环的原子性,避免分散到多个模块导致的协调复杂度。核心价值:Fork 代理的工具输出不会回到主代理的上下文窗口。

QcloudCommunity的博客 892

一文讲透如何构建Harness——六大组件全解析

本文将从"裸模型的四个硬伤"出发,逐一拆解 Harness 的六大组件——文件系统、Bash + 沙箱、记忆(AGENTS.md)、Web Search + MCP、上下文工程、编排 + Hooks——带你看清 AI Agent 真正的竞争壁垒,不在模型层,而在 Harness 层。如果你用过 Agent 做复杂任务,你一定有过这样的体验:一开始 Agent 的表现很好,但随着对话变长,它开始"变笨"——遗忘之前的约定,重复之前犯过的错误,甚至对同一个问题给出前后矛盾的回答。对于简单的问答场景,这无所谓。

QcloudCommunity的博客 760

Harness Engineering 来了,SDD 还有意义吗?

他们的解法是把「品味」编码进规则,然后用一个定期运行的「doc-gardening」Agent 自动扫描漂移、发起修复 PR——「技术债务就像一笔高息贷款,不断地以小额贷款的方式偿还,总比让债务不断累积要好」。代码仓库本地的、已版本化的工件,才是 Agent 所能看到的全部。在 Vibe Coding 模式下(即不做规划、随意向 AI 提需求的开发方式),大量设计决策、跨服务约定、「为什么不选另一个方案」的讨论,全部停留在一次性的 AI 对话里——下一个人,或者下一次 AI 会话,完全无从获取。

QcloudCommunity的博客 419

零废话!一文讲透从0构建AI Agent

每个工具都要写一套"定义→解析→执行"的胶水代码。上下文管理就是在"记住足够多"和"别超标"之间找平衡,常见策略包括滑动窗口、摘要压缩、RAG 检索增强。上下文窗口是 Agent 的"工作记忆",但它有硬性限制。LLM 负责"动脑"决策,代码负责"动手"执行。这是从"聊天机器人"进化到"Agent"的关键一步。每次调 API 都把完整对话历史发过去,LLM 本身是无状态的,"记忆"完全靠客户端的数组模拟。这样 Agent 一开始就知道自己"在哪里"、"手头有什么",不需要先花一轮工具调用去探索环境。

QcloudCommunity的博客 711

距离AI把小编我裁掉还有72小时

这是一个基于 OpenClaw 开源生态打造的本地化 AI Agent 助手,已于上周开启全量公测,无需复杂配置,三步即可上手,自带安全防护,支持微信直连绑定,内置多款优质国产大模型,现阶段也是完全免费使用,基本上前面提到过的痛点都可以靠它解决。对了,这里特别强调一点,上面的截图让产品同事汗流浃背,再三找我确认 QClaw 思考过程中优美的“草”字说法,不会是默认出现的吧?AI 好,AI 得学,但更重要的是,在你的工作和生活里,哪些东西是能结构化地被 AI 所接入的,不要死守着那些脏活累活不放。

QcloudCommunity的博客 673
上一篇: AIGC算法必读论文清单
下一篇: 情况说明:国产拿了数据库世界第一
腾讯云开发者
腾讯云开发者 企业官方账号 企业官方账号
博客等级 码龄10年 6291粉丝 1962原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值