开发者工具箱|编程·开发工具·资源
780 subscribers
1.43K photos
765 links
面向开发者的实用工具、库与效率技巧,写代码更快更爽。投稿 @BDHT1
#开发者 #编程工具 #效率 #程序员 · 开源总站 @GitHubTrendingHub
Download Telegram
2026年五大热门MCP网关汇总

MCP标准化了模型和代理连接外部系统的方式,当组织内有大量AI应用、工具和多团队协作时,连接MCP服务不难,难在管理。

MCP网关就是用于解决这类管理问题,核心关注能力包括:MCP连接性、身份验证与访问控制、可观测性、路由、治理和部署灵活性。
本次整理的五个热门方案分别是:Bifrost、OpenRouter、Cloudflare AI Gateway、Kong AI Gateway、LiteLLM。

Bifrost适合企业级AI和MCP治理,支持集中访问控制、工具管理和可观测性,面向大规模AI基础设施团队。
OpenRouter适合多模型和提供商的统一访问,具备路由和降级能力。
Cloudflare AI Gateway适合AI流量管理,支持分析、缓存、限流、重试和提供商路由。
Kong AI Gateway适合企业将API管理和治理扩展到LLM、MCP服务和AI代理。
LiteLLM适合需要开源多LLM提供商网关的团队,内置身份验证、日志和成本追踪。

选择哪款网关,主要看你的需求重点是MCP治理、模型路由、API基础设施还是部署灵活性。
DMAIC 框架如何优化技术交付

技术项目通常能清晰描述交付内容,但常常缺失对改善目标、问题证据、根因、成功基准和持续改进机制的梳理。DMAIC 是定义、测量、分析、改进、控制的缩写,它不是现有项目管理框架的替代,而是补充交付方法之外的问题。

交付方法负责组织变更如何推进,DMAIC 则负责维护原始问题到运营结果之间的证据链。它可以嵌入现有技术交付全流程,避免项目按时按预算交付后,依然没有解决当初立项时要解决的问题。
DMAIC 五个阶段各有侧重:

定义阶段要求先明确问题,再提出解决方案,避免把解决方案直接当成问题描述;测量阶段要求在改进前建立当前状态基准,避免优化错流程环节;分析阶段要求先找到根因再实施改进,避免从症状直接跳到解决方案;改进阶段就是现有交付方法发挥作用的环节,DMAIC 不干涉具体开发管理方式,只要求改进措施对应找到的根因;控制阶段要求项目结束后建立持续监控机制,避免问题慢慢回到原始状态。
该方法不必变成繁琐流程,小项目可以只记录几页内容,大项目再增加复杂度。除单个项目外,DMAIC 也可以扩展应用到战略制定、路线规划、投资组合管理、大型项目群管理等场景。
云原生架构下的依赖模拟工具问题

当前主流依赖模拟工具并非针对云原生架构设计。这些工具诞生于服务有固定发布周期、上游依赖变更缓慢且明确、测试团队可清晰掌握依赖行为的时代,而云原生架构已经完全不同。
在云原生架构中,数十个服务通过独立流水线按各自计划部署,不需要下游团队协调就可以变更行为。这种设计和实际需求的差异,是大部分集成测试准确性问题的根源。每个服务独立部署后,旧有的依赖模拟不会自动更新,随着未同步跟踪的上游部署越来越多,模拟和实际行为的偏差会不断变大。传统依赖模拟工具本身没有解决这个问题的机制,WireMock不知道虚拟服务什么时候部署了新版本,手写模拟不会自动更新,基于规范的虚拟服务也只能反映规范而非当前实际部署的行为,最终测试面板显示一切正常,背后却不断积累行为偏差。
针对云原生环境,依赖模拟工具需要四个核心能力:首先是能感知部署事件,对接CI/CD流水线事件流,收到部署通知后自动触发模拟刷新流程,不需要人工介入。其次是能从真实服务交互中捕获行为,基于记录的真实交互而非文档规范生成模拟,保证模拟和实际行为一致。第三是自动处理非确定字段,比如请求ID、时间戳这类每次调用都会变化的内容,不需要开发人员手动标注。最后是提供跨服务差异可见性,明确告知上游服务行为变更的具体细节,帮助下游团队判断是否需要同步修改代码。

Keploy基于eBPF在内核层完成流量捕获,和基于规范的工具形成差异。它通过记录重放功能拦截服务间真实HTTP交互,生成的模拟可以直接反映观测到的服务行为。内核级捕获不限制语言和框架,适合多语言共存的云原生架构。同时Keploy可以集成到CI/CD流程中,在依赖服务变更时重新记录交互、刷新模拟。

评估云原生架构的依赖模拟工具,核心关注点不在于部署难度或文档质量,而是能否处理部署后变更:感知部署发生、捕获真实服务当前行为、明确展示行为变更、在服务依赖网格中自动扩展,不需要逐个服务手动处理。符合这些要求才能解决云原生下的依赖模拟问题,否则只能让团队自行补充能力,或是接受集成测试准确度随上游开发频率不断下降。
RPI 实战:用 Claude Code 子代理拆分研发流程

一个约十几个产品的小团队(helpdesk、MES、邮件托管、高校 AI 助手)在 monorepo 里日常使用 Claude Code 子代理,把任务拆成研究、计划、实现三个阶段,并保持每个阶段的上下文干净。作者强调这不是基准测试,踩过的坑才是重点。
研究阶段放在子代理里跑,绝不进主对话。读日志、grep 代码库、拉 Search Console 导出、翻邮箱,这些输出大多只看一次,留在主对话里会持续占用上下文,把模型推入「变笨区」。子代理有独立上下文窗口,只回传摘要。实践中研究子代理会把发现写成文件并返回约 200 字摘要,后续写作者读文件而不是摘要;指令里明确写「只研究,不发布,不开浏览器」。一个例子:Search Console 标记站内 79 个页面为「alternate page with proper canonical tag」,先查示例 URL 发现这些页面根本不在自己站点上,而属于一个指向已停用服务器的被遗忘子域名,最终只需删掉一条 DNS 记录。
计划阶段留在主对话里,因为判断力要放在看得见的地方。计划写得短而具体:改哪些文件、什么算完成、什么明确不在范围内、结果怎么验证。最有用的习惯是把每个子代理的指令写得像给刚进门的能干同事:做什么、别碰什么、报告什么、多少字以内。并行实现阶段最省时间,也最容易出事,由此总结出三条规则:每个共享资源只由一个代理独占,浏览器、邮箱、数据库迁移、部署都适用;小步提交并立即推送,用显式路径 git add;把每个代理的范围缩到最小可验证单元,比如「只改这三个文档的 meta_title 和 meta_description,保留其他所有字段,然后 curl 线上页面确认新标题」。

验证要对着不会说谎的东西:磁盘上的文件、全新页面加载、长度校验,而不是代理自己复述做了什么。长会话中曾出现工具输出被静默丢词,两次差点得出错误结论。最严重的一次事故发生在 Telegram 网页版与真实业务联系人对话中:代理用 DOM 编辑命令把文字插入输入框,屏幕显示了但应用内部草稿状态没更新,重试后向对方发出七条乱码片段。事后改为通过应用真正监听的输入事件写入,并在发送后从应用自己的数据存储读回消息比对。部署后要从外部检查线上 URL,而不是刚重启的容器。

给刚起步团队的建议:先把研究放进子代理,成本最低风险最小;计划留在主对话并写下来;只有在共享资源有归属规则后才上并行实现;让每个代理对着真实系统证明结果,信文件、全新页面加载和校验和,而不是摘要。
PostgreSQL 的 max_prepared_transactions 该不该开

prepared transaction 是脱离会话独立存在的两阶段提交事务。执行 PREPARE TRANSACTION 'some-gid' 后,原会话不再持有事务,但事务占用的锁和事务 ID 会写入 WAL、记录在共享内存中,崩溃恢复后依然存在,直到有人执行 COMMIT PREPARED 或 ROLLBACK PREPARED。max_prepared_transactions 控制服务器同时保留多少个这类事务,默认值为 0,上限 262143,属于 postmaster 级参数,开启和关闭都需要重启。

默认值并非一直是 0。8.3 及以前是 5,Tom Lane 在 8.4(2009)改为 0,原因是项目已多次遇到 prepared transaction 被遗忘、最终引发严重维护问题甚至 anti-wraparound 停机,而此前默认非零只是为了回归测试能覆盖该特性。同一提交还把 prepared transaction 写进了 wraparound 警告的 HINT,在 18 上依然保留。
在 18.6 上实测:准备一个更新了一行的事务后断开,新会话里 pg_stat_activity 看不到任何 backend,但 pg_locks 中仍有该表的 RowExclusiveLock、索引锁以及自身 XID 的 ExclusiveLock,pid 为空。对该表执行 ALTER TABLE ... ADD COLUMN 会一直等待直到 lock_timeout 取消;VACUUM (VERBOSE) 报告 500 个死元组不可回收,removable cutoff 等于该事务的 XID。它像普通 backend 一样占用 PGPROC 槽位,只是没有进程附着。
很多手段对它无效:idle_in_transaction_session_timeout 没有会话可超时;transaction_timeout(17 起)在 PREPARE 时停止计时;pg_terminate_backend() 没有对象可终止;以 -m immediate 重启后日志显示从共享内存恢复 prepared transaction 754;DROP DATABASE 和 pg_upgrade --check 都会拒绝。创建逻辑复制槽也会被它阻塞。唯一出口是 COMMIT PREPARED 或 ROLLBACK PREPARED,需连接同一数据库,且需超级用户或准备该事务的角色。

真正需要这个参数的只有三种场景:XA 事务管理器(如 JTA、Atomikos、Narayana)跨 PostgreSQL 与消息队列或第二个数据库协调提交;Citus 11 起对每个多分片写入在 worker 间做两阶段提交,官方建议在每个 worker 上调高;以及 two_phase = on(15 起)的逻辑复制订阅,订阅端需要准备发布端已准备的事务。除此之外,文档明确表示该命令是为事务管理器准备的,不写事务管理器就不该使用它。

若确需开启,建议设为 max_connections,理由是每个会话在管理器卡住时都可能有一个待决事务,而达到上限会在 prepare 阶段转为回滚,正是事务管理器要避免的失败。共享内存开销接近一个连接:18.6 上一千个槽位增加 47 MB,一千个连接增加 51 MB,一百个槽位约 4 MB。备库规则更关键:该参数与 max_connections、max_locks_per_transaction、max_wal_senders、max_worker_processes 同属备库不得小于主库的五个参数,否则备库无法启动或暂停恢复。调整顺序是先备库、后主库。开启前应把 pg_prepared_xacts 中 prepared 超过 5 分钟的记录纳入监控,真正的两阶段提交只停留毫秒级,超时未决的就是孤儿事务,正在占用锁和 vacuum 视野。
Xcode 27.2 改用 JSON 项目格式

Xcode 27.2 用基于 JSON 的 project.xcproj 取代了沿用多年的 project.pbxproj。新建项目默认使用新格式,已有项目不会自动转换,两种格式可以并存。Xcode 27.0 和 27.2 都能打开 JSON 项目,Xcode 26 不行。

旧格式基于 NeXTSTEP 时代的 plist 语法,把项目存成一张扁平的对象表,对象之间靠随机十六进制 ID 互相引用。新增一个 Swift 文件,Xcode 要同时写 PBXFileReference、PBXBuildFile、PBXGroup 和 PBXSourcesBuildPhase 四处,ID 每次重新生成,多人分支上改同一批位置就会撞出经典的合并冲突。构建配置也是每个 configuration 各存一份完整副本,改一次部署目标要动两处。
新格式按 Xcode 界面里的结构组织,拆成 files、targets、build-settings 等区块,diff 看起来就是你在界面上做的事。最关键的改动是文件自己声明归属的 target,写成 "target-membership": ["Weather/compile-sources"],不再涉及 UUID,加文件变成一处一行。构建配置相同的只写一次,Debug 和 Release 不同时用 [config=...] 条件区分,和 .xcconfig 的写法一致。一次真实迁移中,161 行 XCBuildConfiguration 缩成一个 build-settings 块,整个文件从 300 行 property list 变成 123 行 JSON。ID 只在 target 和构建产物上保留,其余按名称或路径引用。
需要注意这个格式允许尾随逗号,普通 JSON.parse 读不了,Apple 的开源库用 JSON5 编码处理,写脚本时要用能容忍 JSON5 的解析器,别用 jq。切换方式有两种:在 Xcode 里选中项目,打开 File inspector(Option-Command-1),把 Project Document 下的 Project Format 设为 JSON;命令行可以用 xcodebuild -project MyApp.xcodeproj -convert-project "Xcode Project",适合 CI 或批量转换。转换会删除 project.pbxproj,建议单独提交、不带其他改动,方便审查和回滚。

Xcode 27.2 还在 /usr/bin 里带了 xcprojformatter,用于校验和重排已使用 xcproj 的文件,它不是 pbxproj 转换器,可以理解为项目文件版的 swift-format,适合加进 CI 防止手工或 AI 编辑破坏规范格式。Apple 同时开源了 Swift 库 xcode-project-format,供生成器、linter、校验器直接读写该格式。

直接解析 project.pbxproj 的工具都需要更新,包括通过 xcodeproj gem 的 CocoaPods、改版本号或设置的 fastlane action、项目生成器和自定义脚本。Swift XcodeProj 库已有实验性支持,9.17.0 版本于 2026 年 9 月 17 日加入,维护者提示细节仍会变化,提交前先检查转换结果。Capacitor 尚未支持,cap sync ios 目前只解析 .pbxproj。Tuist、XcodeGen、Bazel、SwiftPM 和基于 xcconfig 的工作流不受影响,可按自己的节奏迁移。

Apple 把这次公告归在 Coding Intelligence 下,明确表示新格式让编码 agent 更容易处理 Xcode 项目:改一个设置只需编辑一行可读文本,而不是更新多处 ID 交叉引用,出错的可能性大幅减少。
用 SLO 给 AI Agent 的行为定个预算

Grafana Labs 提出把可靠性工程里的错误预算(error budget)思路用到 AI Agent 上。延迟、token 数、错误率、工具调用链路这些常规信号都齐全,也回答不了最关键的问题:这个 Agent 到底好不好。一次响应可以 800 毫秒返回、几乎零成本、零报错,但内容自信流畅地全错。
做法是用评估(evaluation)直接量化行为:让一个裁判(通常是另一个语言模型)读一段对话、单条消息或一次工具调用并打分,判断是否有依据、是否完成用户请求、是否有毒、是否泄露个人信息、是否被提示注入攻破。有些检查甚至不需要模型,一条正则就能判断响应是否泄露了 API key。在 Grafana Cloud 的 Agent Observability 中,廉价的确定性检查和基于模型的裁判可以并存。
质量不是一个单一数字。有依据、完成度、毒性、延迟、成本是彼此独立失败的行为,应各给一个测量值,而不是追求一个混合准确率。裁判可按需校准:有时通过/失败就够,有时用 1 到 5 分制更合适,比如 4 分及以上算通过,最终得到一个可对标目标的比率。

光有数字不够。仪表盘上孤立的分数会让人对每次小波动过度反应,最后没人再看图。SLO 补上的正是决策:比如把「裁判判定为已完成的对话比例」设为 30 天内 95%。剩下的 5% 不是失败,而是预算——预算充足就放心试新提示词、换模型;预算见底就收一收新功能,先修质量。

真正要盯的是缓慢的静默漂移:单次对话都不刺眼,但每天流失一点质量,可能是提示词过时、模型升级对场景更差、用户需求变了。Agent 的回答即使漂移也依然流畅可信,简单阈值抓不住,预算能,因为它衡量的是累积而非某一刻。目标值也不必凭空猜:评估跑够样本后,可让 Grafana Assistant 基于分数推荐 SLO 目标并创建 SLO,再自行上调或下调。
Xeno Core:TypeScript 后端架构框架

Node.js 复杂系统的架构选型往往决定代码的长期命运。开发者常在两条路之间纠结:要么依赖重度使用实验性装饰器和反射(如 reflect-metadata)的「魔法」单体框架,接受其全局规则;要么从零自建,冒着滑向面条代码和结构不一致的风险。Xeno.JS 的核心引擎 Xeno Core(@xeno-js/core)正是针对这一痛点而生。
它是一个运行时无关、严格类型化的 TypeScript 企业级架构框架,从底层实现 DDD、CQRS 和显式依赖注入。三大支柱:零魔法装饰器,IoC 容器 ServiceContainer 依赖显式函数工厂,编译期即可掌控依赖图;与传输层完全解耦,不绑定 HTTP 服务器,Fastify、Hono 或 AWS Lambda 无服务器架构下业务逻辑都保持隔离;异步上下文隔离,原生利用 AsyncLocalStorage 管理请求级生命周期,线程安全地追踪 correlationId、requestId 等元数据和多租户身份。
生态还包含 @xeno-js/shared(同构基础,统一契约、标准化 ResponseDto 与运行时校验)、@xeno-js/vue(把 DDD、CQRS 和依赖注入带入 Vue.js 应用,含响应式 composables 与 AbortSignal 协作取消)、@xeno-js/cli(企业级代码生成器,秒级脚手架项目、命令、查询与处理器)。核心入口是 AppBuilder,以流式引导方式编排模块、注册与执行优先级,可配置中间件、限流、CSRF、CQRS 管道(幂等与并发重试)、数据库、认证与日志。

官方称其优势在于可预测性、前后端架构模式对齐,以及生产就绪的熔断重试、双令牌 CSRF 和符合 GDPR 的日志脱敏。四个包均已开源并发布在 npm:@xeno-js/core、@xeno-js/vue、@xeno-js/shared,CLI 可通过 npx @xeno-js/cli 调用。
五仓库架构踩坑:Gitlink 与双 CI

Flude 团队复盘了多仓库架构的实践代价。项目从第一分钟起就选择拆分成独立仓库,Pipeline、engine、design-docs、user-docs 几乎同时创建,.gitmodules 出现在父仓库的首次提交里。为了代码整洁、CI 隔离、独立历史和权限分离,系统从第一天就建立在 Git Submodules 之上。
第一个代价是状态同步的隐蔽机制。在 engine/ 里改代码,需要两次 push:先在子模块目录 push,再回到 Pipeline 根目录提交指向新 commit 的 gitlink 并 push。第一次 push 极易被遗忘——本地 commit 真实存在,构建通过、测试全绿,直到 CI 全新 checkout 时才暴露:git submodule update --init 报错 fatal: remote error: upload-pack: not our ref。曾有三个子模块同时踩坑,原因一致:本地提交从未离开开发者的笔记本。第四个托管站点的子模块 ude_promotion 落后上游太多,普通 push 无法修复,必须先做交互式 rebase。
第二个代价来自 CI。engine 既是独立仓库、有自己的构建流程,又是 Pipeline 里的子模块、要在父项目上下文中测试,两种身份必然冲突。先是 test_integration_scripts.py 依赖只存在于父仓库的 verify_pages/check_links 模块,独立 checkout 时文件不在磁盘上,只能在 ci.yml 里加一行 pytest --ignore 临时忽略。随后用 Path(file).resolve().parents[2] 找父级产物的测试开始失败:嵌套运行时正好升到父仓库根目录,独立构建时却跳出仓库根、进入 CI runner 的系统文件系统,直接抛 AssertionError。

点状修补失效后,团队引入通用约定:测试在上升层级检查系统标记目录(.workspace_config)是否存在。存在说明处于嵌套上下文,测试照常运行;不存在则用 pytest.mark.skipif 安静跳过,不再报红。

结论是多仓库架构不会在第一天白送松耦合,它要求无懈可击的 push 同步纪律,并迫使代码同时适配多种执行上下文。
PostgreSQL 复制槽上限参数 max_replication_slots 解析

max_replication_slots 决定共享内存中复制槽数组的长度,仅此而已。它不决定谁能创建槽、槽能钉住多少 WAL、废弃槽何时清理。数组在启动时一次性分配,因此不改它就得重启。默认值 10,上下文为 postmaster,取值范围 0 到 262,143(即 MAX_BACKENDS)。任何类型的槽都要求 wal_level 为 replica 或更高。
9.4 到 9.6 默认值为 0;PostgreSQL 10 把默认值提到 10,目标是让全新安装无需重启即可备份并搭建备库。条目本身几乎不花钱:在 18.6 上,10,000 个条目多 3 MB,合法上限 262,143 个多 72 MB,约合每个 300 字节。条目便宜,槽不便宜:槽的真实成本是它钉住的 WAL 和压住的 xmin horizon,那是 max_slot_wal_keep_size 的职责,18 时代还有 idle_replication_slot_timeout 兜底。
凡是 pg_replication_slots 里有行的都占座,不论类型、状态或创建者:每个设置 primary_slot_name 的备库一个物理槽,每个被指定槽的 pg_receivewal 一个;发布端每个订阅一个逻辑槽,初始拷贝期间每个表同步 worker 再多一个,拷贝完成即删除,所以默认 max_sync_workers_per_subscription = 2 的订阅者在追赶期间可在发布端占三个条目。临时槽:pg_basebackup 自 10 起默认创建一个,wal_receiver_create_temp_slot 会为没有永久槽的备库创建一个,随会话消亡但会话存续期间占座。备库上 sync_replication_slots = on 时会复制主库上每个 failover 槽。第三方创建的每个槽同样占座。失效槽显示 wal_status = 'lost',不再保留任何东西,但在被删除前仍占座。截至 18,replication origins 不在列表内,18 把这项工作移交给 max_active_replication_origins。PostgreSQL 19 增加两个变化:订阅设置 retain_dead_tuples = on 时,launcher 会在订阅者上创建名为 pg_conflict_detection 的持久物理槽;REPACK ... CONCURRENTLY 则从新的 max_repack_replication_slots(默认 5)池中取用。

差一个等于没有。报错是 all replication slots are in use。把参数设为 0,pg_basebackup 会报同样的错。发布端 max_replication_slots = 1 时,订阅槽占掉唯一条目,之后每个 tablesync worker 创建槽失败、退出并被反复重启,表无限期停留在 srsubstate = 'd',而订阅本身看起来正常。备库情况更安静:18.6 上主库有三个 failover 槽、备库上限为 2 时,槽同步 worker 创建前两个后触限退出,且未持久化任何东西,备库一个槽都没同步成。反方向至少够响:把值降到磁盘上槽数以下,服务器拒绝启动,报 FATAL: too many replication slots active before shutdown。pg_upgrade 迁移逻辑槽时适用同样规则。

设置时,要数下一次故障切换后这台服务器上会有多少槽,而不是今天有多少。算完总数后放一边,在集群每个节点(含备库)上都设 50,因为它们终将成为主库,且槽同步现在就需要空间。五十个条目花 15 KB。如果已经用了三十个,就设 100。算术不是重点,重启才是。另外,max_wal_senders 至少应为该值加上物理备库数,它同样是 postmaster 上下文,应在同一次重启中一起提高。还要盯差距而非数量:当槽数接近上限时告警,任何失效数大于零都应视为待删除而非保留。