深入微服务核心:从架构设计到规模化

图片

图片

👉目录

1 微服务

2 演化式架构师

3 如何建模服务

4 集成

5 分解单块系统

6 康威定律和系统设计

7 规模化微服务

8 总结

《Building Microservices》这本书是吃透微服务的大部头,本文基于全书内容,系统性地阐述了微服务架构的设计原则、实施策略与挑战,从微服务的核心概念出发,延伸到架构设计、服务拆分、集成技术及规模化实践,为开发者提供了构建稳健微服务体系的指导框架。

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

01

微服务

什么是微服务?

微服务就是一些协同工作的小而自治的服务。我们在一个单体系统中,通常会采用一些抽象层或者模块来保证代码的内聚性,直白点就是,把因相同原因产生变化的一类东西聚合在一块儿。

什么时候需要考虑微服务?

当我们的代码库异常庞大,以致于可能会出现“牵一发动全身”的情况,那么根据业务的边界来确定服务的边界,服务专注于某个业务边界之内,那么应该就能很好的解决这个问题了。例如,一个大型的商城系统,通常会划分用户,订单,支付等微服务。

微服务需要满足自治性

微服务应该可以彼此间进行独立修改,某个微服务的部署不应该引起该服务的消费方的变动。

微服务的好处

技术异构性

假如一个庞大的业务,不同的模块所需要的存储不一样,适合的语言也不同,那么微服务可以很好的屏蔽技术细节,打破技术栈所带来的壁垒。而且当你需要引进某些新技术的时候,使用微服务也可以降低系统风险,即便出现问题也很好处理。

弹性

单体应用如果出现异常,整个服务可能都无法使用,但是假如拆分成微服务,并且进行多机部署,那么就能降低系统完全不可用的风险,同时也可以采用功能降级来保证核心功能不受影响。

扩展

单体应用中,如果某个模块出现性能问题,我们必须对整个服务进行扩展,但是拆分成微服务,则可以对某个服务进行扩展,把那些性能要求低的服务,部署到相对较差的硬件上,这样可以充分利用资源来提供系统的性能。

简化部署

单体应用如果需要发布,会影响整个系统,微服务架构中,只需要对某个服务独立发布部署,即时出现问题,也只会影响这一个服务,可以快速回滚。

与组织结构相匹配

微服务架构可以很好地实现小团队+小代码库这种模式,提高团队生产力。

可组合性

微服务架构中,已有的功能可以重用,甚至通过组合几个微服务,就可以为某个应用程序提供完整的后台支撑。

对可替代性的优化

单体应用中,某些模块可能已经淘汰了,但是删除他们可能会带来不可预估的问题,但是微服务架构中,某些小模块可以轻松地进行移除或者重写。

小结

业界也存在共享库、模块这些分解技术,但是可能会导致它成为系统的耦合点;同时我们也要记住,没有银弹,不可能存在一条通用的准则。使用微服务甚至要面对单体应用没有的部署、测试和监控等一些列复杂的工作,还要处理分布式事务,CAP 相关的问题。

02

演化式架构师

模糊的定位

架构师的一个重要职责是,保证团队有共同的技术愿景,能够保证项目的交付质量。但是我们这个行业很年轻,以至于有时候我们自己都不清楚自己要干什么,人们把程序员叫做XX开发工程师,但是和传统行业相比,比如建筑师,假如我们的工程也根据一些图表和文档进行设计,那么可能会忽略一些基础性的因素,实现起来将会非常困难。不同于建筑行业必须遵循自然规律,物理规则,软件需要足够灵活,能够根据用户的需求不断演化。

城市规划师

相对于“架构师”,“城市规划师”可能更加贴合这个角色,城市规划师的职责是优化城镇的布局,进行合适的分区,使其更易于现有的居民生活,同时也会考虑一切未来的因素,与我们架构师的职责如出一辙。

分区

城市规划师要对城镇进行合理分区,那么架构师这边的区域概念对应的是什么?就是服务边界。架构师要多关注服务间的交互,而忽略服务内的细节,如果每个服务对外暴露的协议五花八门,那么对于消费者来说是个噩梦。虽然说不用关心每个服务内部的具体实现,但是假如一个团队,10种技术栈,我相信会增加管理成本和招聘难度。另外,架构师最好和团队共同 Coding,才能指导并且了解你的团队。

原则性的方法

  1. 制定战略性目标-业务部门的愿景。

  2. 制定设计原则-最好不要超过10个。

  3. 实践-对原则的落地。

  4. 结合-原则要与实践相结合。

标准

  1. 监控-所有服务使用同样的方式上报健康状态和其他监控数据,最好标准化。

  2. 接口-对外暴露接口的类型最好固定那几种,HTTP/REST或者RPC。

  3. 架构安全性-所有服务都要能够应对下游的错误请求,避免系统逐渐脆弱。

代码治理

达成共识,大家才能做好事情。所以,提供范例和服务代码模板是比较有效的两种方式。有比较好的代码范例,供人们模仿,即使错了,也不会错得很离谱。模板也可以提高开发速度,提升服务质量。但是要注意不要落入DRY(Don't Repeat Yourself)的陷阱,因为过度依赖共享可能会导致系统过耦合。

技术债务

每个团队都可能由于排期等因素欠下技术债务,架构师需要提供一些温和的指导,让团队决定如何偿还,最好是列一个表格,定期回顾。

例外管理

原则有时候可能会被打破,但是不代表它不正确,可能它会演化成一个新的原则,架构师要有严谨但包容的心态,如果对开发人员的限制过多,可能微服务架构并不适合。

集中治理和领导

架构师需要了解新的技术,并且知道如何取舍,通常领导一个小组,整个小组都负责治理,并且能够得到高层的支持。架构师一个人的想法有时候可能会比较片面,通常小组比个人更聪明。

建设团队

帮助战友共同进步,使其能够独立负责某个服务,并且能够得到充分的锻炼。

小结

演化式架构师应该承担的责任:

  • 愿景-确保团队有共同的技术员警,能够满足客户和组织的需求。

  • 同理心-理解你所做的决定对客户和同事带来的影响。

  • 合作-尽量多和同事进行沟通,从而更好的对愿景进行定义、修改和执行。

  • 适应性-确保在你的客户和组织需要的时候调整技术愿景。

  • 自治性-在标准化和团队自治之间寻找一个正确的平衡点。

  • 治理-确保系统按照技术愿景的要求实现。

03

如何建模服务

什么样的服务是好服务

松耦合

修改一个服务而不需要修改另一个服务

高内聚

相关行为聚集在一起形成独立服务

限界上下文

每个限界上下文包含两个部份,一部分需要和外部通信,一部分则不需要。就像细胞膜一样,细胞之所以会存在是因为细胞膜定义了什么在细胞内,什么在细胞外,并且决定了什么东西可以通过细胞膜。在不同的限界上下文之间,存在共享模型,屏蔽了内部实现细节。

如果服务的边界和领域的限界上下文能保持一致,并且微服务可以很好地表示这些限界上下文,那么就走出了高内聚低耦合的微服务架构的第一步。当然,微服务不宜过早拆分,将大型单体拆成微服务比较容易,但是直接使用微服务架构会比较困难。

业务功能

不应该从共享数据的角度来考虑,而应该从这些上下文能够提供的功能出发,不应该成为基于CRUD的,贫血的服务。要思考这个上下文是做什么用的,然后考虑它需要什么样的数据。

逐步划分上下文

当考虑微服务的边界时,应该先考虑比较大的、粗粒度的,然后发现合适的缝隙之后,再进一步划分,就像劈柴一样,要先劈出来两条大缝隙,然后再逐步分解成比较细木片。

修改系统的目的是满足业务需求,基于业务的划分,在客户提需求的时候,就会更倾向于对一个服务的改动;按照技术接缝进行划分可能会导致洋葱式架构,服务被分成很多层,改动起来可能会很痛苦,所以一般来说这种方式不是首选方式。

04

集成

理想的集成技术

集成可能是微服务相关技术中最重要的一个,理想的集成技术要能够做到以下几点:

  1. 避免破坏性修改:在对一个微服务的响应中添加了一个字段,不应该影响消费方。

  2. API要保证技术无关性:不应该选择那种对微服务的具体实现有限制的集成方式。

  3. 使服务易于消费方使用:如果消费方使用我们的微服务比登天还难,那么设计得再好也没用。

  4. 隐藏内部细节:微服务应该屏蔽内部实现细节,否则可能会提高和消费方耦合的风险。

共享数据库

这是业界常见的集成方式,它简单且快捷,但是他的问题很多。外部系统能看到内部细节,消费与特定的技术绑定,对逻辑修改可能要同时修改相关的系统,这样做的话,可以说和松耦合高内聚毫不相干了,它会给开发人员带来无穷无尽的痛苦。

同步与异步

服务之间到底是使用同步还是异步进行通信?同步=阻塞,调用方会阻塞自己直到整个操作完成,异步的话,调用方则不需要等待,甚至都不关心这个操作有没有成功。

同步可以知道事情执行到底成功与否,异步对于运行时间较长的任务比较有效。那么异步通信如何知道执行结果呢?可以采用注册回调的方式,服务端调用完成后,可以调用改回调来进行通知。

也可以基于事件进行协作,客户端发起的不是请求,而是一个事件,所有的订阅者可以收到这个事件,并决定是否需要处理。这种方式的耦合性很低。

编排与协同

使用编排的方式,我们会把某个服务当成中心大脑来指导并驱动整个流程。

使用协同的方式,仅会告知系统中的每个部分各自的职责,至于具体的实现,由他们自己决定。

使用编排的方式,可能会导致某个服务成为整个流程的中心枢纽,其他服务沦为贫血的、基于 CURD 的服务,但使用协同的方式,则需要额外对整个流程做跨服务的监控,以保证其正常运行。所以我们可以根据不同的场景,进行选择,或者混用。

RPC

远程过程调用,允许你调用一个方法,但事实上整个方法的结果是由某个远程服务产生的。RPC 帮程序员生成桩代码,从而能够快速使用,理论上,只调用方法,忽略细节确实是给程序员带来极大的便利。

但是要注意远程调用和本地调用其实是有区别的,因为网络并不可靠!

REST

表述性状态转移,它是一种风格,举个例子,我要对某个资源进行增删,我会使用 CreateCustomer和DeleteCustomer,但是使用 REST 风格就会变成:

POST : www.test.com/customerDELETE : www.test.com/customer

是不是要简洁很多?

为避免把存储数据暴露给消费者,我们可以先设计外部接口,等稳定后,再实现微服务内部的数据持久化。

但是,使用 REST 就无法帮助你生成桩代码,而且性能上可能遇到问题,对于低延迟场景来说,使用 HTTP 可能不是一个很好的主意。

基于事件的异步协作

主要关注两件事:微服务发布事件机制和消费者接受事件机制。

我们可以使用像RabbitMQ这样的消息代理来解决,但是这么做系统虽然有较好的弹性和可伸缩性,但是也会增加开发流程的复复杂度,但是一旦做好了,它会成为实现一个松耦合系统的重要手段。

还有一个原则:中间件一定要足够简洁,不要掺杂业务逻辑。

事件驱动的系统虽然看起来有较好的弹性和可伸缩性,但是开发难度高,带来的一些一致性问题比较复杂,而且对程序员的要求也很高,要进行思维上的转换,这有时候真的很困难。当我们要追踪某个问题的时候,我们一定要要引入监控机制,并且对时间有关联 ID,方便我们追踪这种跨服务的请求。

DRY

在微服务架构中,如果一味追求 DRY 是很危险的,比如很多微服务使用了同一个共享库。

所以,建议微服务内不要违反 DRY,微服务间可以适当违背 DRY。

按引用访问

如果我们确定了一个领域实体,那么任何和该领域相关的改动,都应该由这个领域完成。

比如我有一个客户服务,任何对客户的改动,都应该调用客户服务来完成改动,即客户服务是客户信息唯一可靠的来源。

举一个例子,如果我要发一封邮件,邮件里面有用户的姓名,地址,订单信息等,但是请求邮件服务是异步的,但是在这个时间差中,用户信息可能发生改变,如何解决?我们可以仅把客户资源和订单资源的 URI,等真正要发送的时候,再去查询最新的信息即可。

版本管理

  1. 减小破坏性修改影响的最好办法是尽量不要这样修改。

  2. 要尽早发现破坏性修改。

  3. 使用语义化管理版本,见文知意。

  4. 新老接口可以共存,来保证灰度或者随时回退。

  5. 同时存在新老服务(建议不要这样做,成本很高)。

小结

无论如何都要避免数据库集成,在 RPC 和 REST 之间做取舍,协同优先于编排,避免破坏性修改。

05

分解单块系统

我们上面讨论了什么是好的服务,一些规范和建议,以及系统如何向好的方向进行演化,那么一个大型的单体应用应该如何拆分成微服务呢?

关键是接缝,这部分代码进行修改不会影响系统的其他部分,这些被识别出来的接缝就会成为服务的边界。

前面讨论过的限界上下文就是一个很好的接缝,它定义的就是组织内高内聚,低耦合的边界,很多代码会使用包或者命名空间来定义这个概念,例如:golang的package。

好,现在假如我们有一个巨大的单体服务,它是一个在线音乐系统。我们把它划分为以下几个上下文:

  1. 产品目录。

  2. 财务。

  3. 仓库。

  4. 推荐。

从哪个部分入手?

最好考虑一下那部分抽离出去的效益最大,而不是为了抽离而抽离。

我们考虑以下几个因素:

  1. 改变速度:某个功能抽离且可以自治,可以加快后期的开发速度

  2. 团队结构:根据团队结构来抽离,比如存在异地协作,可以拆分出去。

  3. 安全:某部分业务是做数据安全,抽离出去可以对所有服务做监控、数据保护等。

  4. 技术:推荐系统出了一种新的算法,独立部署后,能提高我们系统的速度。

在我们分析系统为什么会有各种杂乱的依赖的时候,通常来说数据库大概率是源头。

找到源头后,我们抽象出一个独立的存储层,把数据库相关操作聚类到一起。

几个例子

打破外键关系

我们要生成一份财务报表,8月份销售《青藏高原》2000份,获利10000元。就需要从产品表和账单表获取数据,甚至存在外键关联,所以最好是产品服务暴露API给财务服务,而不是直接访问数据库,这个API会成为微服务化的第一步。

有时候让系统的一部分变慢会带来更大的好处,而且这个慢事实上也能控制在一定范围。

打破的前提是知道系统期望的行为是什么,想清楚再做决定!

共享静态资源

把城市编号放到数据库,各个服务共享,那么就形成了数据库集中,这显然不是我们想要的。

应该怎么做?

  1. 每个服务一个库。

  2. 这部分资源放到各自的服务代码中。

  3. 这部分资源行程一个单独的服务(太极端了)。

建议采用第二种,但是以配置文件的形式,各个服务自己保存一份,并支持热更新。

共享数据

仓库服务和财务服务都需要用户记录,他们都会向客户记录写数据和读数据,形成了数据共享,那么我们可以把客户的概念抽象出来,形成服务,对外暴露API。

共享表

我们的产品目录服务和仓库服务都会用到产品的信息,他们共享一张表,这个时候,可以把这个表分离成两个表,产品目录项表和库存表。

实施分离

事实上,先分离数据库结构,暂时不对服务进行分离会更好一些,我们可以随时回退,不影响消费者,一旦稳定下来,在考虑对整个应用程序进行分离。

事务

事务的好处是,可以使一系列操作要么全部执行,要么全都不执行。

那么微服务架构中如何实现?

  1. 再试一次-通过日志或者放入队列,之后再次尝试。

  2. 终止整个操作-通过补偿事务来抵消之前的操作,如删除某行记录,失败怎么办?可以重试或者给个界面操作,也可以自动化解决。

  3. 分布式事务-借助其他工具,如事务管理器,常见的算法是两阶段提交(本文不做介绍)。

我们到底应该怎么做?

这些方案都会带来复杂性,而且分布式事务很容易出错,且不易扩展。我们是否可以讲各种操作放到本地事务,然后依赖最终一致性方案解决?我认为可以,而且不要仅仅从技术上去解决,因为可能它真的不好解决,我们可以从业务上解决,设立一个间态,例如这类问题订单统一归类为“处理中的异常工单”?然后通过其他方式进行管理和修复?

数据导出

当我们要导出数据或者生成报表,可以通过提供API,定时同步数据库,使用事件订阅等等,但是千万不要暴露数据库!

小结

我们要理解,服务一定会越来越大,但是我们需要在拆分太过昂贵这件事发生之前,意识到我们需要拆分,这非常关键。

06

康威定律和系统设计

康威定律说的是,任何组织在设计一套系统时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。

Amazon 认为,小团队比大团队的工作更有效,于是产生了著名的“两个披萨团队”,即没有一个团队应该大到两个披萨不够吃。

07

规模化微服务

微服务形成一定规模后,系统变得异常复杂,我们应该怎么办?

首先故障一定会有,而且无处不在,我们要允许错误发生,控制在一定范围,当一个系统变得不是很可用的时候,要有安全降级方案,保证核心功能。

要从架构设计原则上,保证一个服务不会导致整个系统崩溃。

规模化微服务这种分布式架构下,我们要准备好应对系统故障的方案:

  1. 超时-跨进程调用要设置超时时间来保护下游。

  2. 断路器-当下游资源请求失败或超时达到一定数量,断路器打开后续不再请求下游。

  3. 舱壁-为每个下游服务设置一个连接池,形成舱壁,保证不会互相影响。

  4. 隔离-服务之间依赖越低越安全。

  5. 幂等- 允许重复调用,且每次调用造成的相同,不必担心多次调用会有不利的影响。

  6. 扩展:

    1. 强大的硬件可以提升系统性能。

    2. 拆分服务提高负载。

    3. 把服务进行分散部署。

    4. 做好负载均衡,避免单点故障。

    5. 基于worker的模式,按需分配数量。

    6. 系统架构完全无法应对当前负载,考虑重新设计。

  7. 扩展数据库:

    1. 使用副本数据库,并且可以在必要的时候切换为主数据库。

    2. 读取扩展:很多服务已读取为主,可以选择读副本。

    3. 写操作扩展:使用分片机制,如对某个关键字取hash,写入不同实例。

  8. 缓存。

  9. 自动伸缩:根据负载主动扩缩容。

  10. CAP定理:一致性、可用性、分区容忍性不可能同时满足,我们最多只能保证其中的两个。

  11. 服务发现:告诉人们微服务在哪里。

08

总结

微服务的原则

围绕业务概念建模

通常围绕业务的限界上下文定义的接口要比围绕技术概念定义的接口更加稳定。

接受自动化文化

大量的微服务涌现,我们必须要借助自动化工具,开发维护我们的服务。

隐藏内部实现细节

为了实现服务自治,隐藏细节至关重要,服务还应该隐藏他的数据库,避免产生数据库集成。

让一切都去中心化

确保团队对服务的所有权,同时要做到内部开源,人们可以修改其他团队的代码。

可独立部署

服务可以独立部署,当你修改发布的时候,不需要通知其他团队进行改动。

隔离失败

防止系统遭受灾难级的级联故障,要了解舱壁和断路器,保证你的系统没有那么脆弱。

高度可观察

系统整体一个清晰的观测平台,通过关联标识,跟踪调用链路。

什么时候不应该使用微服务

当你不了解它的时候,因为这时候出错的概率会很大。

写到最后

微服务架构会给你带来很多选择,需要你做很多决策,虽然有时候的决策可能是错误的,但是我们应该保证错误的影响范围要足够的小,遵从“演化式架构”,不断地前进探索。我们不应该进行爆炸式的重写,应该随着时间的推移,温和地对我们的系统进行修改,持续地进行改变!

-End-

原创作者|张印

感谢你读到这里,不如关注一下?👇

图片

📢📢搜索腾讯云会员小程序来领开发者专属福利


图片

如何减少微服务架构带来的决策错误?欢迎评论留言补充。我们将选取1则优质的评论,送出腾讯云定制文件袋套装1个(见下图)。4月30日中午12点开奖。

图片

图片

图片

图片

图片

图片

相关推荐

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

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

QcloudCommunity的博客 403

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

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

QcloudCommunity的博客 1162

平平无奇的源码,竟藏着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的博客 710

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

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

QcloudCommunity的博客 707

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

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

QcloudCommunity的博客 905

AI Infra 其实没有多少新东西

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

QcloudCommunity的博客 821

程序员越早想通这些越好

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

QcloudCommunity的博客 464

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的博客 1161

全方位对比: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的博客 607

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的博客 873

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的博客 889

一文讲透如何构建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的博客 418

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

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

QcloudCommunity的博客 711

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

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

QcloudCommunity的博客 673
上一篇: 氛围式编程什么鬼!?
下一篇: 具身智能全解读,从实验室到产业化 | TVP技术夜未眠
腾讯云开发者
腾讯云开发者 企业官方账号 企业官方账号
博客等级 码龄10年 6291粉丝 1962原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值