:云端智能體基礎(chǔ)設(shè)施擴(kuò)展實(shí)踐)
云端智能體這個詞過去一年我聽到的頻率越來越高但很多團(tuán)隊(duì)的討論還停留在“怎么把模型能力調(diào)出來”“怎么讓工具調(diào)用更穩(wěn)定”這一層。真正從幾十個并發(fā)智能體往幾百、幾千個并發(fā)推的時候你會發(fā)現(xiàn)瓶頸根本不在模型本身而在承載這些智能體的基礎(chǔ)設(shè)施。這不是換個更強(qiáng)的推理引擎或者加幾張顯卡就能解決的問題而是從架構(gòu)設(shè)計到運(yùn)行時調(diào)度、從狀態(tài)管理到成本模型的一整套重新思考。這篇文章我會結(jié)合我過去大半年在云端智能體基礎(chǔ)設(shè)施上的實(shí)操和踩坑經(jīng)歷把擴(kuò)展過程中真正卡住我的那些問題攤開講。也會給出我認(rèn)為更合理的設(shè)計思路和可落地的改進(jìn)方案適合正在做智能體產(chǎn)品、或者團(tuán)隊(duì)規(guī)模到一定階段開始頭疼并發(fā)和穩(wěn)定性問題的同學(xué)參考。1. 云端智能體的負(fù)載到底和傳統(tǒng)服務(wù)差在哪1.1 智能體不是“一個請求一個響應(yīng)”傳統(tǒng)Web后端或者微服務(wù)負(fù)載模型很好理解客戶端發(fā)請求服務(wù)端處理返回響應(yīng)。一個請求的生命周期通常從幾十毫秒到幾秒最多分鐘級。處理完就釋放線程和內(nèi)存服務(wù)是無狀態(tài)的隨便橫向擴(kuò)展。但云端智能體完全是另一套節(jié)奏。一個智能體任務(wù)可能是“幫我調(diào)研一個行業(yè)”它需要拆解目標(biāo)、規(guī)劃任務(wù)、逐個調(diào)用搜索工具、閱讀多篇文章、對比數(shù)據(jù)、生成報告。這一串動作下來可能要持續(xù)幾分鐘甚至幾十分鐘。期間智能體不是閑著等外部輸入就是在模型推理、工具調(diào)用、結(jié)果處理之間反復(fù)切換。這就意味著一個智能體任務(wù)對應(yīng)的是一個“長期運(yùn)行的邏輯進(jìn)程”而不是一次REST調(diào)用。如果按照傳統(tǒng)Web服務(wù)的思維去設(shè)計——來一個請求起一個線程、處理完就銷毀——那幾百個并發(fā)智能體就能把你的資源池打穿因?yàn)槊總€“進(jìn)程”要存活的時間太長了。我見過一個團(tuán)隊(duì)把智能體請求當(dāng)普通API處理每個任務(wù)起一個進(jìn)程用內(nèi)存保存任務(wù)狀態(tài)。30個并發(fā)任務(wù)跑起來服務(wù)直接OOM好幾次。這不是他們的代碼寫得差是負(fù)載模型從一開始就套錯了。1.2 三個被低估的負(fù)載特征智能體工作負(fù)載有三個特征決定了它和普通服務(wù)有本質(zhì)區(qū)別第一高可變性。每個任務(wù)消耗的資源差異巨大。有的任務(wù)可能只需要一次模型調(diào)用另一些任務(wù)要來回跑幾十輪推理和工具調(diào)用。你不能按平均值來規(guī)劃容量因?yàn)槲膊康拈L任務(wù)會瞬間吃光資源。第二強(qiáng)狀態(tài)性。智能體在運(yùn)行過程中依賴大量狀態(tài)——當(dāng)前任務(wù)目標(biāo)、已完成步驟、已獲取的中間結(jié)果、對話歷史、上下文窗口內(nèi)容。狀態(tài)丟了任務(wù)就廢了。而且這個狀態(tài)是持續(xù)增長的用戶上下文越長單任務(wù)占用的內(nèi)存就越大。第三任務(wù)生命周期與外部依賴耦合。智能體在運(yùn)行中要調(diào)外部API、等搜索結(jié)果、調(diào)內(nèi)部系統(tǒng)接口。外部服務(wù)的延遲直接影響了智能體任務(wù)的資源占用時間。一個外部接口超時10秒可能就有成百上千個智能體任務(wù)在那里干等著資源卻一點(diǎn)沒釋放。這三個特征疊加在一起構(gòu)成了一種傳統(tǒng)基礎(chǔ)設(shè)施領(lǐng)域里很少見的負(fù)載模式——既有I/O密集型的等待特征又有計算密集型的推理消耗還帶著有狀態(tài)服務(wù)的持久性需求。想用一套傳統(tǒng)的云原生方案去硬扛必然會在某個規(guī)模上撞墻。1.3 從延遲曲線看智能體擴(kuò)展的真實(shí)壓力我習(xí)慣用一個簡單的觀察方法來判斷系統(tǒng)快不行了把智能體任務(wù)耗時畫成分布圖。傳統(tǒng)API的延遲分布通常是單峰集中在平均值附近。智能體任務(wù)的延遲分布則是典型的長尾——大部分任務(wù)在幾十秒內(nèi)完成但總有那么幾個任務(wù)要跑上十幾分鐘甚至更久。長尾任務(wù)的占比一旦超過某一個閾值系統(tǒng)的整體吞吐就會斷裂式下滑。原因不復(fù)雜長任務(wù)占用了推理資源、占用了內(nèi)存、占用了連接池而它們產(chǎn)生的價值可能和短任務(wù)一樣多。系統(tǒng)被長尾任務(wù)拖住短任務(wù)開始排隊(duì)整體服務(wù)質(zhì)量快速惡化。所以在擴(kuò)展智能體基礎(chǔ)設(shè)施時第一件事不是加機(jī)器而是先畫出你的任務(wù)延遲分布找到長尾在哪個階段產(chǎn)生、消耗了什么資源。這部分我們后面在監(jiān)控指標(biāo)里細(xì)說。2. 擴(kuò)到一定程度卡住你的不是模型而是狀態(tài)2.1 會話狀態(tài)云原生里最難搞的“有狀態(tài)”做云原生應(yīng)用的人都知道一個原則服務(wù)盡量無狀態(tài)化狀態(tài)盡量外置到數(shù)據(jù)庫或緩存里。但智能體不一樣它的狀態(tài)粒度極細(xì)、訪問頻率極高。傳統(tǒng)業(yè)務(wù)的狀態(tài)是結(jié)構(gòu)化數(shù)據(jù)——訂單狀態(tài)、用戶余額、庫存數(shù)量。這些數(shù)據(jù)不常變存在數(shù)據(jù)庫里需要時查一下就行。智能體的狀態(tài)則是內(nèi)容密集型數(shù)據(jù)——對話歷史、搜索結(jié)果摘要、工具返回的JSON、用戶的臨時指令。這些數(shù)據(jù)在每輪推理中都要被讀取、拼接、送入模型。如果把這些狀態(tài)全部放Redis或者外部數(shù)據(jù)庫每輪推理都要多次往返存取延遲和帶寬都扛不住。但如果放在內(nèi)存里進(jìn)程重啟、實(shí)例擴(kuò)縮容、發(fā)布更新狀態(tài)就全沒了。我試過幾種方案后最終的感受是智能體的狀態(tài)管理需要分層不同活躍度的狀態(tài)放到不同層級的存儲里。運(yùn)行中的任務(wù)狀態(tài)放本地?zé)醿?nèi)存暫停的任務(wù)狀態(tài)序列化到分布式存儲完成的任務(wù)歸檔到對象存儲。分層之后內(nèi)存壓力可控狀態(tài)持久性也有保障。這個思路下面會展開講。2.2 上下文窗口與KV Cache的內(nèi)存膨脹很多人以為智能體的內(nèi)存消耗主要是存儲對話文本實(shí)測之后你會發(fā)現(xiàn)真正的內(nèi)存殺手是推理引擎的KV Cache。大模型推理時每個Token在生成過程中都要產(chǎn)生對應(yīng)的Key和Value向量這些向量緩存在顯存或內(nèi)存中供后續(xù)Token計算注意力。序列越長Cache越大。上下文窗口從4K擴(kuò)展到32K再到128KKV Cache的占用是線性甚至超線性增長的。我實(shí)測過一個7B量級的模型單個會話跑到32K上下文時KV Cache的占用量接近文本本身的好幾倍。如果宿主機(jī)顯存不夠這些Cache就要落回內(nèi)存推理速度立刻崩盤。這意味著大量長對話智能體并發(fā)時內(nèi)存/顯存消耗的增速遠(yuǎn)比任務(wù)數(shù)增長快。擴(kuò)展智能體數(shù)量不是“每多一個任務(wù)加一份內(nèi)存”這么簡單還要考慮每個任務(wù)的上下文長度。任務(wù)數(shù)與上下文長度共同作用在內(nèi)存消耗上形成一個乘法效應(yīng)。這種乘法效應(yīng)用傳統(tǒng)內(nèi)存規(guī)劃模型算很容易低估。第一次把并發(fā)數(shù)從50調(diào)到100我按線性增長估算的內(nèi)存完全不夠結(jié)果系統(tǒng)直接卡死排查了很久才發(fā)現(xiàn)是KV Cache把內(nèi)存吃光了。2.3 持久化與恢復(fù)斷電之后智能體還記得什么另一個被很多人忽略的問題是智能體任務(wù)被中斷后怎么恢復(fù)在有狀態(tài)的長期任務(wù)中故障恢復(fù)不是“重啟一下”那么簡單。智能體可能已經(jīng)完成了調(diào)研、寫好了初稿、正準(zhǔn)備調(diào)用發(fā)布接口。系統(tǒng)一崩如果狀態(tài)沒有持久化用戶得從頭再來一遍。這在To C場景用戶可能忍了在To B自動化場景任務(wù)重跑可能會引發(fā)重復(fù)操作——比如已經(jīng)扣過一次款、發(fā)過一次通知重啟后又執(zhí)行一遍。我見過一個真實(shí)事故一個自動化運(yùn)維智能體在執(zhí)行變更任務(wù)過程中進(jìn)程崩潰重啟后從初始狀態(tài)重新跑又執(zhí)行了一次變更結(jié)果生產(chǎn)環(huán)境配置被重復(fù)應(yīng)用造成短暫故障。這種問題靠加機(jī)器沒用必須從狀態(tài)管理設(shè)計上解決。具體的做法是把智能體任務(wù)的每一步關(guān)鍵動作記錄下來作為持久化事件流?;謴?fù)時不是從頭開始跑而是從最后一個已確認(rèn)的事件繼續(xù)。這有點(diǎn)像數(shù)據(jù)庫的WAL日志或者事件溯源對智能體這種“思考-行動-觀察”循環(huán)型任務(wù)尤其適用。后面我會給出更詳細(xì)的狀態(tài)快照與恢復(fù)策略。3. 智能體基礎(chǔ)設(shè)施的設(shè)計破局點(diǎn)3.1 無狀態(tài)的核心 有狀態(tài)的外設(shè)面對負(fù)載模型和狀態(tài)挑戰(zhàn)我最終采用的架構(gòu)思路可以概括為“無狀態(tài)的核心有狀態(tài)的外設(shè)”。核心推理調(diào)度器保持無狀態(tài)——它接收任務(wù)指令調(diào)用模型返回結(jié)果本身不保存任何用戶上下文。所有狀態(tài)全部外置到專門的狀態(tài)層。這樣核心推理層可以隨意擴(kuò)縮容發(fā)布更新也不影響正在運(yùn)行的任務(wù)。狀態(tài)層則是智能化的存儲按活躍度分層熱數(shù)據(jù)放在內(nèi)存級存儲溫數(shù)據(jù)放在SSD級存儲冷數(shù)據(jù)落到對象存儲。每個智能體任務(wù)有一個全局唯一的ID通過這個ID可以在任意時刻拉起狀態(tài)、掛起狀態(tài)、恢復(fù)運(yùn)行。這個設(shè)計最大的好處是把計算和狀態(tài)解耦。計算層可以做到秒級擴(kuò)縮容狀態(tài)層則按容量規(guī)劃。兩者獨(dú)立演進(jìn)不像以前那樣綁在一臺實(shí)例里互相拖累。我團(tuán)隊(duì)從單體架構(gòu)切到這個模式之后最明顯的變化是爆并發(fā)時不用再擔(dān)心重啟丟狀態(tài)新增推理節(jié)點(diǎn)也不需要遷移任何數(shù)據(jù)。整個系統(tǒng)的擴(kuò)展性打開了一個口子。3.2 掛起/恢復(fù)調(diào)度讓智能體像進(jìn)程一樣管理操作系統(tǒng)管理進(jìn)程有一種經(jīng)典機(jī)制叫掛起和恢復(fù)——進(jìn)程可以不占CPU把寄存器狀態(tài)保存下來等條件滿足再恢復(fù)執(zhí)行。智能體調(diào)度也應(yīng)該走這條路。智能體任務(wù)不是時刻都需要計算。它在等外部API返回時、在等用戶反饋時、在暫停等待定時觸發(fā)時完全可以掛起把占用的計算資源和內(nèi)存釋放掉。等觸發(fā)條件滿足再把任務(wù)狀態(tài)加載回來繼續(xù)運(yùn)行。我們做了個調(diào)度器支持三種任務(wù)狀態(tài)運(yùn)行中、掛起、終止。掛起的任務(wù)不占推理資源只占狀態(tài)層的存儲。實(shí)測下來同一個智能體服務(wù)開啟掛起機(jī)制后支持的最大并發(fā)任務(wù)數(shù)提升了好幾倍。因?yàn)榇蠖鄶?shù)任務(wù)在生命周期里真正處于推理狀態(tài)的時間通常不到20%其余時間都在等待或掛起。這項(xiàng)機(jī)制的關(guān)鍵是掛起點(diǎn)要選得準(zhǔn)。我們規(guī)定智能體只能在兩個節(jié)點(diǎn)之間掛起——在一次工具調(diào)用完成后、下一次模型推理前。這些節(jié)點(diǎn)狀態(tài)清晰、無副作用操作正在進(jìn)行恢復(fù)起來很安全。3.3 彈性計算層的選擇容器、Serverless 還是自定義編排計算層用哪種形態(tài)取決于你的任務(wù)特征。如果智能體任務(wù)以短任務(wù)為主單任務(wù)30秒內(nèi)完成用Serverless是最省成本的方案。請求來的時候拉起一個執(zhí)行環(huán)境任務(wù)結(jié)束就釋放。不跑任務(wù)時不產(chǎn)生費(fèi)用。如果任務(wù)經(jīng)常是長任務(wù)Serverless就不適合了。目前主流的Serverless平臺對單個實(shí)例的執(zhí)行時長有限制而且長任務(wù)掛起恢復(fù)的粒度支持不好。這時候容器編排是更穩(wěn)的選擇——用Kubernetes或者輕量級的Nomad跑推理工作負(fù)載配合HPA基于自定義指標(biāo)做彈性伸縮。我個人的建議是不要把智能體直接跑在K8s的裸Pod里非要包一層任務(wù)調(diào)度抽象。K8s管理的是實(shí)例生命周期任務(wù)調(diào)度管理的是智能體任務(wù)生命周期二者不是一回事。讓調(diào)度器在K8s之上申請計算資源把任務(wù)映射到計算實(shí)例解耦后兩邊的工程問題都簡單很多。如果團(tuán)隊(duì)規(guī)模不大、不想引入太重的基礎(chǔ)設(shè)施還有一個中間方案用Redis Streams或者NATS JetStream做任務(wù)隊(duì)列消費(fèi)端用容器跑一組工作節(jié)點(diǎn)任務(wù)掛起時將狀態(tài)寫回對象存儲。這套方案比K8s輕得多也能覆蓋大多數(shù)中等規(guī)模的智能體產(chǎn)品需求。4. 實(shí)操中真正決定擴(kuò)展上限的幾個指標(biāo)4.1 建五個監(jiān)控指標(biāo)而不是一堆常規(guī)指標(biāo)擴(kuò)展智能體系統(tǒng)常規(guī)的CPU使用率、內(nèi)存使用率、網(wǎng)絡(luò)IO這些指標(biāo)當(dāng)然要監(jiān)控但我發(fā)現(xiàn)真正能提前暴露問題的是以下五個不太常討論的指標(biāo)。任務(wù)隊(duì)列積壓數(shù)。智能體任務(wù)從創(chuàng)建到真正開始執(zhí)行之間會有隊(duì)列等待。隊(duì)列積壓數(shù)持續(xù)上漲說明計算供給跟不上任務(wù)產(chǎn)生速度這是最直接的擴(kuò)展信號。推理節(jié)點(diǎn)活躍任務(wù)數(shù)/并行度。單節(jié)點(diǎn)上同時運(yùn)行的任務(wù)數(shù)。這個指標(biāo)能反映節(jié)點(diǎn)的真實(shí)負(fù)載比CPU百分比準(zhǔn)得多。因?yàn)楹芏嗳蝿?wù)在等外部API返回CPU未必高但任務(wù)調(diào)度能力已經(jīng)接近上限了。KV Cache命中率與內(nèi)存占用。這個指標(biāo)在長上下文場景特別重要。如果KV Cache頻繁驅(qū)逐重建推理性能會急劇惡化用戶能感知到變慢。狀態(tài)層讀寫延遲。狀態(tài)加載和保存的速度直接決定了任務(wù)恢復(fù)的快慢。我們用P99延遲來觀察一旦P99超過閾值說明狀態(tài)層需要擴(kuò)容或者換更快的存儲。上下文窗口使用率。每個任務(wù)當(dāng)前占用上下文與上限的比值。這個指標(biāo)能提前預(yù)判內(nèi)存壓力也能及時發(fā)現(xiàn)上下文泄漏任務(wù)越跑越大沒有合理截斷和壓縮。我在監(jiān)控面板上只保留這五個指標(biāo)作為主視圖剩下的細(xì)節(jié)指標(biāo)折疊到診斷視圖。效果立竿見影很多問題能在影響用戶之前被發(fā)現(xiàn)和處理。4.2 成本規(guī)劃對每個 Token 的“性價比”要有數(shù)智能體基礎(chǔ)設(shè)施的成本結(jié)構(gòu)里推理成本通常占大頭。但推理成本不是單一維度——同一個模型長上下文的單次調(diào)用價格可能是短上下文的數(shù)倍不同的任務(wù)類型Token消耗模式也完全不同。我們的做法是給每個任務(wù)打上類型標(biāo)簽按類型統(tǒng)計平均Token消耗、平均調(diào)用次數(shù)、平均成本。這樣能看到哪些任務(wù)類型在燒錢但價值有限哪些任務(wù)復(fù)雜但成本可控。有了這個成本視圖做模型選型和Prompt優(yōu)化就有據(jù)可依。另一件重要的事是上下文預(yù)算控制。給智能體設(shè)置明確的上下文上限循環(huán)超限時自動壓縮或剪枝。不控制上下文成本會跟上下文長度呈指數(shù)級上漲等你從賬單上發(fā)現(xiàn)問題的時候可能已經(jīng)燒掉了不少預(yù)算。有個團(tuán)隊(duì)朋友跟我分享過他們的數(shù)據(jù)上線上下文預(yù)算控制之后單個任務(wù)的平均推理成本下降了40%用戶體驗(yàn)幾乎沒變化因?yàn)榇蠖沃貜?fù)的中間內(nèi)容被壓縮掉了真正有用的信息都保留著。4.3 發(fā)布與回滾智能體代碼更新比想象中危險傳統(tǒng)服務(wù)發(fā)布最多影響當(dāng)前請求的響應(yīng)用戶刷新一下就好了。智能體發(fā)布卻可能影響正在運(yùn)行的長任務(wù)——代碼更新后正在跑的智能體任務(wù)如果加載了新邏輯行為可能突然改變?nèi)绻虞d了舊邏輯又有可能因?yàn)閿?shù)據(jù)結(jié)構(gòu)不兼容而崩潰。我們吃了不少虧之后總結(jié)出一套安全發(fā)布策略第一任務(wù)級灰度。不要對所有任務(wù)一次性切換新版本代碼。按比例或者按指定用戶群體灰度觀察任務(wù)完成率和成功率后再擴(kuò)大范圍。第二帶版本號的狀態(tài)包。每個任務(wù)的狀態(tài)包里記錄創(chuàng)建它的代碼版本?;謴?fù)任務(wù)時檢查當(dāng)前代碼版本和狀態(tài)包版本是否兼容不兼容就走遷移邏輯。第三優(yōu)雅排空。發(fā)布新版本前等待正在運(yùn)行的任務(wù)運(yùn)行到安全掛起點(diǎn)再下線舊節(jié)點(diǎn)。寧可多等幾分鐘也不要強(qiáng)行殺死任務(wù)。有一次我們在發(fā)布時忘記做代碼版本兼容檢查導(dǎo)致一批正在跑的長任務(wù)在恢復(fù)時解析舊狀態(tài)包直接崩潰用戶那邊看到的是任務(wù)莫名失敗。從那之后版本兼容檢查被寫進(jìn)了CI流程成了硬性關(guān)卡。5. 常見問題與排查技巧5.1 高并發(fā)下的“心跳”問題智能體調(diào)度器和執(zhí)行節(jié)點(diǎn)之間通常有心跳機(jī)制節(jié)點(diǎn)定期上報存活狀態(tài)。高并發(fā)時最容易出問題的不是壓力本身而是心跳超時誤判。想象這樣一個場景節(jié)點(diǎn)正在處理一個很重的模型推理請求CPU和網(wǎng)絡(luò)都被占用心跳沒能及時發(fā)出調(diào)度器誤以為節(jié)點(diǎn)掛了把任務(wù)重新調(diào)度到別的節(jié)點(diǎn)。結(jié)果兩個節(jié)點(diǎn)同時處理同一個任務(wù)產(chǎn)生重復(fù)執(zhí)行。我的建議是心跳檢測不要只看應(yīng)用層要把“正在處理的請求數(shù)”和“最近活躍時間”一并上報。節(jié)點(diǎn)雖然心跳延遲但如果活躍請求數(shù)正常增長調(diào)度器就不應(yīng)該判定它失聯(lián)。另外任務(wù)級冪等標(biāo)記也非常有必要——同一個任務(wù)即使被調(diào)度兩次第二次執(zhí)行時發(fā)現(xiàn)已有執(zhí)行記錄自動放棄。5.2 狀態(tài)不一致的排查思路狀態(tài)不一致是最難排查的一類問題癥狀往往是任務(wù)恢復(fù)后表現(xiàn)詭異——有的步驟重復(fù)執(zhí)行有的步驟被跳過對外的結(jié)果和實(shí)際狀態(tài)對不上。這類問題90%出在并發(fā)控制和事件順序上。多個組件同時更新同一個任務(wù)狀態(tài)時如果沒有加鎖或者樂觀并發(fā)控制后寫覆蓋先寫狀態(tài)就亂了。排查時先看狀態(tài)更新的版本號或者時間戳確認(rèn)是否有覆蓋沖突再看事件日志的順序確認(rèn)是否有事件亂序。我們最終引入事件溯源模式之后狀態(tài)不一致問題基本絕跡——每次狀態(tài)變化都追加一條事件恢復(fù)時按序重放天然不存在覆蓋問題。5.3 智能體陷入循環(huán)的檢測智能體在一定條件下會陷入循環(huán)反復(fù)調(diào)用同一個工具、反復(fù)得到相同的結(jié)果、反復(fù)發(fā)出相同的決策卻始終無法推進(jìn)任務(wù)。這種循環(huán)在高并發(fā)時特別消耗資源而且很難從表面日志中看出來。我們的檢測方法是給每個任務(wù)記錄一個“行為指紋”——最近N輪調(diào)用的工具名、參數(shù)摘要和返回結(jié)果哈希。如果行為指紋出現(xiàn)重復(fù)模式就觸發(fā)循環(huán)告警交由人工介入或者讓智能體切換策略。我遇到過一個案例一個智能體在調(diào)某個內(nèi)部API時API返回了一個非標(biāo)準(zhǔn)錯誤格式智能體不理解這個錯誤反復(fù)重試同一個請求十幾分鐘消耗了巨額Token。行為指紋檢測上線后這種問題能在幾輪之內(nèi)被識別并處理。另外還有一個容易被忽略的排查點(diǎn)掛起恢復(fù)是否帶上了完整的外部請求上下文。有些外部API有冪等性要求比如支付接口、消息發(fā)送接口。智能體恢復(fù)后如果重新執(zhí)行了同樣的調(diào)用而調(diào)用方?jīng)]做冪等處理就可能導(dǎo)致重復(fù)扣款或重復(fù)發(fā)消息。在狀態(tài)包里保存好每個外部調(diào)用的請求跟蹤號和冪等鍵這件事值得從第一天就做對。我們在智能體基礎(chǔ)設(shè)施上踩過的坑大部分不是模型能力不夠而是基礎(chǔ)設(shè)施的底子撐不住智能體工作負(fù)載的擴(kuò)展。把狀態(tài)管理、任務(wù)調(diào)度、成本控制這幾件事想清楚并做好之后從百級并發(fā)推上千級并發(fā)就不再是一場災(zāi)難而是按部就班的擴(kuò)容過程。希望這篇文章能給你提供一些可以復(fù)用的思路少走幾個我走過的彎路。