算不能靠本地計(jì)數(shù)器:預(yù)占、核銷和并發(fā)超額怎么處理)
如果兩個(gè)網(wǎng)關(guān)各自看到“今天還剩 100 元”同時(shí)放出一筆 80 元請求本地計(jì)數(shù)器都沒有錯(cuò)全站預(yù)算卻已經(jīng)失守。Token 計(jì)數(shù)能幫助估算貨幣預(yù)算還需要一份跨請求的賬。三個(gè)賬戶一筆請求把預(yù)算拆成可用、預(yù)占和已結(jié)算。發(fā)出請求前按允許的最大輸出和適用費(fèi)率預(yù)占拿到可信 usage 后核銷響應(yīng)丟失時(shí)保留待對(duì)賬狀態(tài)。不能把超時(shí)直接解釋成“沒收費(fèi)”也不能用輸出 token 上限證明總費(fèi)用上限搜索、緩存寫入等費(fèi)用可能另計(jì)。DeepSeek 價(jià)格頁及Search 文檔需按幣種、模型和生效時(shí)間核對(duì)。十月的新搜索能力讓這件事更具體調(diào)用次數(shù)也可能成為預(yù)算維度。本文不把未來生效費(fèi)率寫成已經(jīng)發(fā)生的賬單。先驗(yàn)證最小記賬不變量這個(gè)整數(shù)單位示例沒有并發(fā)和數(shù)據(jù)庫僅用來檢查重復(fù)核銷、剩余額度和超額實(shí)際費(fèi)用。金額單位由業(yè)務(wù)約定這里不是人民幣報(bào)價(jià)。class Ledger: def __init__(self, budget): self.free, self.spent, self.pending, self.done budget, 0, {}, set() def reserve(self, rid, cap): if rid in self.pending or rid in self.done or cap 0 or cap self.free: return False self.free - cap; self.pending[rid] cap return True def settle(self, rid, actual): if rid in self.done: return False cap self.pending[rid] if actual 0 or actual cap: raise ValueError(reconcile overrun) self.free cap - actual; self.spent actual del self.pending[rid]; self.done.add(rid) return True l Ledger(100) assert l.reserve(a, 80) and not l.reserve(b, 80) assert l.settle(a, 50) and not l.settle(a, 50) assert (l.free, l.spent) (50, 50) assert l.reserve(unknown, 30) assert l.free l.spent sum(l.pending.values()) 100 print(reservation, duplicate settlement, unknown hold: passed)本地 Python 3 斷言通過。實(shí)際費(fèi)用超過預(yù)占時(shí)程序要求對(duì)賬不假裝硬預(yù)算仍成立。生產(chǎn)實(shí)現(xiàn)需在同一事務(wù)里檢查余額、建立唯一請求記錄和扣減并對(duì)結(jié)算冪等Redis 事務(wù)只保護(hù) Redis 內(nèi)操作PostgreSQL 隔離說明也提醒并發(fā)快照需要正確條件約束跨供應(yīng)商執(zhí)行不在本地事務(wù)里。如果計(jì)費(fèi)無法給出可信上界承諾應(yīng)該是“限制風(fēng)險(xiǎn)敞口并持續(xù)對(duì)賬”而非“絕不超額”。依賴故障時(shí)可拒絕新請求或使用事先分配、總量受控的離線額度默認(rèn)放行再談?dòng)采舷捱壿嬌险静蛔 ]有實(shí)測外部賬單發(fā)布前需復(fù)核費(fèi)率與 usage 字段。