【架构实战】多活架构:异地多活与单元化部署
一、那场机房断电事故2022年7月某天下午3点我们主机房所在的城市突发大规模停电。虽然机房有UPS和柴油发电机但运营商骨干网也受到了影响。结果主机房服务完全不可用备用机房冷备状态切换需要4小时4小时内业务完全中断直接经济损失超过500万品牌损失不可估量CEO紧急会议上的灵魂拷问“为什么备用机房没有自动切换”“为什么我们的业务不能在其他城市运行”“如果再发生一次我们还要中断4小时吗”我们没办法回答。痛定思痛我们启动了异地多活项目历时18个月完成了异地多活单元化的架构升级。今天就分享这个项目的实战经验——异地多活不是简单的事是系统性的架构革命。二、多活架构的本质不止是容灾2.1 传统容灾 vs 多活传统容灾同城灾备/异地灾备【主备模式】 主机房Active── 服务用户 │ │冷备/温备 ↓ 备机房Standby── 不服务用户 特点 - 平时备机房不工作 - 故障时切换分钟级~小时级 - 备机房资源浪费 - 数据单向同步异地多活【多活模式】 机房A华东──┐ ├── 同时服务用户 机房B华南──┤ ├── 流量分担 机房C华北──┘ 特点 - 多个机房同时服务 - 故障时自动切换秒级 - 资源充分利用 - 数据双向同步核心区别灾备备用平时不工作多活多份同时工作2.2 多活的四种模式模式特点RTO成本复杂度同城双活同一城市两个机房秒级低中同城多活同一城市多个机房秒级中中异地多活读写分离不同城市按业务分分钟级高高异地多活双向同步不同城市任意写入秒级极高极高我们的选择异地多活读写分离—— 平衡成本和可用性。2.3 多活的核心挑战多活不是简单部署多份挑战1数据一致性 └── 多机房数据如何同步延迟冲突 挑战2流量调度 └── 请求路由到哪个机房灰度切量 挑战3业务复杂度 └── 跨机房调用ID生成数据归属 挑战4运维复杂度 └── 监控部署容灾 挑战5成本 └── 资源翻倍网络成本我们用了18个月不是因为技术难而是因为要确保业务在多活下不出问题。三、单元化多活的最佳实践3.1 什么是单元化核心思想以用户为单位把用户绑定到特定机房。【传统多活】 用户A ── 机房1 ── 写入数据 ── 数据同步 ── 机房2 用户B ── 机房2 ── 写入数据 ── 数据同步 ── 机房1 问题双向同步数据冲突可能 【单元化】 用户Aunit1 ── 机房1 ── 写入 ── 数据留在机房1 用户Bunit2 ── 机房2 ── 写入 ── 数据留在机房2 用户Cunit3 ── 机房3 ── 写入 ── 数据留在机房3 特点 - 用户绑定机房 - 数据不跨机房流动 - 机房故障只影响本单元用户单元化的核心用户ID决定机房归属同一用户的数据只在一个机房跨单元数据通过同步或消息3.2 单元化 vs 普通多活维度普通多活单元化数据写入任意机房归属机房数据同步双向同步单向同步冲突解决复杂无冲突扩容受限容易增加单元成本高更高复杂度高极高3.3 单元划分策略按用户ID分片/** * 单元划分算法 */publicclassUnitRouter{// 假设我们有10个单元privatestaticfinalintUNIT_COUNT10;/** * 根据userId计算单元 */publicintgetUnitId(StringuserId){// 取userId的hash模10inthashMath.abs(userId.hashCode());returnhash%UNIT_COUNT;}/** * 根据unitId获取机房 */publicStringgetDataCenter(intunitId){// 单元0-3 → 华东机房// 单元4-6 → 华南机房// 单元7-9 → 华北机房if(unitId3)returndc-east;if(unitId6)returndc-south;returndc-north;}}按业务分片/** * 业务单元划分 */publicclassBusinessUnitRouter{publicStringgetDataCenter(StringbusinessType){switch(businessType){caseALIPAY:returndc-east;// 支付宝业务在华东caseWECHAT_PAY:returndc-south;// 微信支付在华南caseUNION_PAY:returndc-north;// 银联在华北default:returndc-east;}}}四、多活架构设计4.1 总体架构【异地多活 单元化 架构】 用户 │ ↓ ┌──────────────┐ │ DNS/GSLB │ ← 全局负载均衡 │ (流量调度) │ └──────┬───────┘ │ ┌────────────┼────────────┐ ↓ ↓ ↓ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 华东机房 │ │ 华南机房 │ │ 华北机房 │ │ (主) │ │ (备1) │ │ (备2) │ │ 单元0-3 │ │ 单元4-6 │ │ 单元7-9 │ │ │ │ │ │ │ │ ┌──────┐ │ │ ┌──────┐ │ │ ┌──────┐ │ │ │网关 │ │ │ │网关 │ │ │ │网关 │ │ ← 单元化路由 │ └──────┘ │ │ └──────┘ │ │ └──────┘ │ │ ┌──────┐ │ │ ┌──────┐ │ │ ┌──────┐ │ │ │业务 │ │ │ │业务 │ │ │ │业务 │ │ │ └──────┘ │ │ └──────┘ │ │ └──────┘ │ │ ┌──────┐ │ │ ┌──────┐ │ │ ┌──────┐ │ │ │数据 │ │ │ │数据 │ │ │ │数据 │ │ │ └──────┘ │ │ └──────┘ │ │ └──────┘ │ └─────┬────┘ └─────┬────┘ └─────┬────┘ │ │ │ └────────────┴────────────┘ ↑ 数据同步层 (单向同步 消息队列)4.2 流量调度GSLB全局负载均衡/** * GSLB流量调度 */ComponentpublicclassGSLBRouter{AutowiredprivateHealthCheckerhealthChecker;/** * 根据用户ID选择机房 */publicStringroute(StringuserId,Stringurl){// 1. 单元化路由同一用户始终到同一机房intunitIdgetUnitId(userId);StringtargetDCgetDataCenter(unitId);// 2. 健康检查目标机房不可用路由到备机房if(!healthChecker.isHealthy(targetDC)){targetDCgetBackupDataCenter(targetDC);log.warn(机房{}不可用用户{}路由到备机房{},getDataCenter(unitId),userId,targetDC);}returntargetDC;}/** * 健康检查 */publicbooleanisHealthy(StringdataCenter){// 检查机房健康状态returnhealthChecker.check(dataCenter);}}GSLB的几种实现DNS级别通过DNS解析返回不同IP延迟高HTTP级别通过302/重定向用户感知IP级别直接路由性能最好4.3 数据同步单元化多活的关键同步策略/** * 基于Binlog的数据同步 */ComponentpublicclassDataSyncManager{AutowiredprivateCanalClientcanalClient;// 监听MySQL Binlog/** * 数据同步从华东同步到华南 */CanalEventListenerpublicvoidonChange(CanalEntryentry){// 1. 解析BinlogStringtableNameentry.getHeader().getTableName();RowChangerowChangeentry.getRowChange();for(RowDatarowData:rowChange.getRowDatasList()){// 2. 检查是否需要同步按单元ID过滤StringuserIdgetUserIdFromRow(rowData);intunitIdgetUnitId(userId);intsourceUnitgetCurrentUnit();if(unitIdsourceUnit){// 3. 同步到其他机房syncToOtherDCs(tableName,rowData);}}}/** * 异步消息同步 */publicvoidsyncToOtherDCs(StringtableName,RowDatarowData){// 通过消息队列异步同步rocketMQTemplate.asyncSend(data-sync-topic,newDataSyncMessage(tableName,rowData),newSendCallback(){OverridepublicvoidonSuccess(SendResultsendResult){log.info(数据同步成功: table{}, row{},tableName,rowData);}OverridepublicvoidonException(Exceptione){log.error(数据同步失败,e);// 重试或人工处理}});}}同步策略对比策略延迟一致性适用同步双写低强关键数据异步同步中最终一般数据消息队列中最终事件型数据定时同步高最终非实时数据我们用的组合关键数据订单、支付同步双写 异步校验一般数据用户信息异步同步日志型数据消息队列4.4 唯一ID生成分布式ID的挑战/** * 单元化ID生成基于Snowflake */ComponentpublicclassUnitizedIdGenerator{/** * Snowflake ID结构 * 0 | 00000000 00000000 00000000 00000000 00000000 0 | 00000 | 00000 | 000000000000 * 1 | 时间戳(41位) | 数据中心(5位) | 机器(5位) | 序列(12位) */privatefinallongtwepoch1288834974657L;privatefinallongdatacenterIdBits5L;privatefinallongworkerIdBits5L;privatefinallongsequenceBits12L;privatelongdatacenterId;// 数据中心IDprivatelongworkerId;// 机器IDprivatelongsequence0L;publicsynchronizedlongnextId(){longtimestamptimeGen();if(timestamplastTimestamp){thrownewRuntimeException(时钟回拨);}if(timestamplastTimestamp){sequence(sequence1)((1sequenceBits)-1);if(sequence0){timestamptilNextMillis(lastTimestamp);}}else{sequence0L;}lastTimestamptimestamp;return((timestamp-twepoch)(datacenterIdBitsworkerIdBitssequenceBits))|(datacenterId(workerIdBitssequenceBits))|(workerIdsequenceBits)|sequence;}}关键点ID中嵌入机房标识即使各机房独立生成全局也不会冲突可以从ID中反解机房五、单元化部署实践5.1 单元化路由/** * 单元化网关路由请求到正确的机房 */RestControllerpublicclassUnitizedGateway{AutowiredprivateUnitRouterunitRouter;RequestMapping(/api/{service}/**)publicResponseEntity?route(PathVariableStringservice,RequestHeader(User-Id)StringuserId,HttpServletRequestrequest){// 1. 计算用户所属单元intunitIdunitRouter.getUnitId(userId);StringtargetDCunitRouter.getDataCenter(unitId);// 2. 转发到目标机房StringtargetUrlbuildTargetUrl(targetDC,service,request);// 3. 转发HTTP请求returnforward(targetUrl,request);}}5.2 单元化数据库每个单元有独立的数据库【数据库分片】 数据库0dc-eastunit 0, 1 数据库1dc-eastunit 2, 3 数据库2dc-southunit 4, 5 数据库3dc-southunit 6 数据库4dc-northunit 7, 8 数据库5dc-northunit 9ShardingSphere配置# sharding-rule.yamlrules:-!SHARDINGtables:t_order:actualDataNodes:ds_${0..5}.t_order_${0..7}databaseStrategy:standard:shardingColumn:user_idshardingAlgorithmName:db-inlinetableStrategy:standard:shardingColumn:user_idshardingAlgorithmName:t-order-inlineshardingAlgorithms:db-inline:type:INLINEprops:algorithm-expression:ds_${(user_id.hashCode() % 10 / 2).intValue()}t-order-inline:type:INLINEprops:algorithm-expression:t_order_${user_id.hashCode() % 8}5.3 跨单元查询业务上避免跨单元查询。必须跨单元查询时/** * 跨单元查询服务 */ServicepublicclassCrossUnitQueryService{AutowiredprivateUnitRouterunitRouter;/** * 查询用户的所有订单用户的所有订单都在本单元 */publicListOrdergetUserOrders(StringuserId){// 同单元查询returnorderRepository.findByUserId(userId);}/** * 查询商品的所有订单跨单元 */publicListOrdergetProductOrders(StringproductId){// 跨单元查询ListOrderallOrdersnewArrayList();for(intunitId0;unitId10;unitId){StringdcunitRouter.getDataCenter(unitId);ListOrderordersqueryUnitOrders(dc,productId);allOrders.addAll(orders);}returnallOrders;}}优化数据冗余把商品信息冗余到各单元搜索引擎用ES做全局索引数据仓库T1同步到数仓六、多活运维6.1 多活监控多活的特殊监控# 多活专用监控指标-机房健康度-CPU使用率-内存使用率-磁盘空间-网络连通性-数据同步状态-同步延迟秒-同步积压条数-同步错误率-流量分配-各机房QPS-单元分布-异常流量-业务可用性-各机房业务成功率-跨机房调用成功率-用户体验指标6.2 多活演练演练场景【演练场景设计】 场景1单机房故障 操作停止华东机房 验证 - 流量自动切到华南、华北 - 单元0-3的用户自动路由到备机房 - 业务成功率保持99% 场景2数据库主从切换 操作手动切换数据库主从 验证 - 业务不中断 - 同步无积压 场景3网络抖动 操作注入网络延迟 验证 - 跨机房调用有超时和重试 - 用户体验无明显下降 场景4数据不一致 操作人为制造数据冲突 验证 - 监控告警触发 - 修复机制有效6.3 多活容灾切换切换流程【多活切换流程】 1. 故障发现0-2分钟 └── 监控告警 2. 故障确认2-5分钟 └── 运维确认 3. 切换决策5-10分钟 └── 值班SRE、技术总监 4. 流量切换10-15分钟 └── GSLB调整权重 └── DNS切换 └── 单元重新分配 5. 业务验证15-30分钟 └── 核心业务验证 └── 监控持续观察 6. 故障恢复30分钟后 └── 故障机房修复 └── 数据同步补偿 └── 流量回切灰度切流/** * 灰度切流 */ComponentpublicclassGrayscaleRouter{privatevolatileintgrayPercentage0;// 灰度比例publicStringroute(StringuserId){intunitIdunitRouter.getUnitId(userId);StringprimaryDCunitRouter.getDataCenter(unitId);StringbackupDCgetBackupDataCenter(primaryDC);// 灰度用户走备机房if(isGrayUser(userId)grayPercentage0){returnbackupDC;}returnprimaryDC;}}七、踩坑总结7.1 坑1数据双向同步导致冲突症状两个机房同时写同一条数据冲突。解决单元化用户绑定机房不双向写明确写入策略每个用户只在固定机房写入冲突检测监控和告警7.2 坑2流量切换不均匀症状切流量时部分用户请求失败。解决灰度切流先切1% → 10% → 50% → 100%健康检查备机房健康才切回滚预案出问题立即回切7.3 坑3跨机房调用延迟症状跨机房调用一次增加50ms延迟。解决业务上避免跨机房调用数据冗余把数据冗余到本机房缓存热点数据全机房缓存7.4 坑4时钟不同步症状多机房时间不一致分布式锁失效。解决NTP时间同步逻辑时钟使用Sequence代替时间戳时钟监控监控机房时间差7.5 坑5多活改造不彻底症状核心服务多活了但依赖服务没有。解决全链路多活所有依赖都支持多活降级方案依赖未多活时有兜底分阶段改造先核心后边缘八、多活成本与收益8.1 成本分析多活的成本项目成本说明服务器翻倍至少2倍资源网络3-5倍跨机房专线流量存储翻倍多份数据运维翻倍复杂度增加改造成本一次性1-2年研发投入我们项目的成本服务器增加120%网络成本增加300%研发投入18人月运维增加50%8.2 收益分析直接收益避免业务中断每年节省潜在损失1000万资源利用率提升从30%提升到70%弹性伸缩应对流量波峰波谷间接收益用户体验提升品牌信任度提升业务连续性保障8.3 ROI评估投入18个月研发 50%资源增加 收益避免一次机房级故障即可收回成本 结论对于核心业务多活是值得的但不是所有业务都需要核心业务订单、支付必须多活重要业务用户、商品应该多活边缘业务评论、日志可以多活内部系统不必多活九、实战经验总结9.1 多活的核心原则1. 业务优先先想清楚业务怎么用再设计架构2. 单元化是核心通过用户ID绑定机房避免数据冲突3. 渐进式实施先核心后边缘先双活后多活4. 灰度切流流量切换要可灰度、可回滚5. 全链路多活所有依赖都要支持多活6. 演练验证不演练等于没做多活9.2 多活的实施步骤Step 1业务梳理1-2个月哪些业务支持多活哪些需要单元化数据归属分析Step 2基础设施准备2-3个月机房建设/租用网络专线GSLB配置Step 3核心服务多活6-8个月订单、支付等核心服务数据库分片数据同步Step 4业务系统迁移3-4个月业务系统适配多活单元化路由跨单元查询Step 5演练验证2-3个月各种故障演练性能压测优化调优总周期18个月9.3 多活的组织保障需要专门的多活团队SRE工程师数据库DBA网络工程师业务开发代表需要高层支持多活是长期项目投入大、周期长需要持续推动十、总结多活不是简单的技术升级是系统性的架构革命。关键要点多活 ≠ 多机房真正的多活是流量分配 数据同步 业务适配单元化是多活的关键通过用户ID绑定机房避免数据冲突数据同步是难点同步策略、同步延迟、数据一致性流量调度是核心GSLB、灰度切换、健康检查运维复杂监控、告警、演练、故障恢复成本翻倍资源、研发、运维成本都大幅增加多活的哲学多活不是为了让系统永不故障而是让系统在故障时还能服务大部分用户。核心原则单元化是基础用户绑定机房数据是难点同步策略和一致性流量调度是核心GSLB和灰度演练是保障不演练等于没做最后的话多活不是想不想做的问题而是业务需不需要的问题。如果你的业务有以下特征多活是必须的7×24小时服务单机房故障影响巨大用户分布广业务连续性要求高否则可能灾备就够了。多活是高成本的奢侈品——但对于核心业务这奢侈品值得拥有。今日思考你们的业务需要多活吗机房级故障的影响有多大欢迎分享你的多活经验或思考作者架构实战团队日期2026-07-23标签#多活架构 #异地多活 #单元化 #容灾 #高可用 #GSLB

相关新闻

LLM Wiki:AI自主管理的动态知识库实践

LLM Wiki:AI自主管理的动态知识库实践

1. 项目概述:LLM Wiki与传统知识库的本质差异上周在调试RAG系统时,偶然发现Andrej Karpathy在内部文档中提到的"LLM Wiki"概念。这个用Markdown文件构建的动态知识库,与我们熟知的Confluence、Notion等传统知识管理系统有着本质区别…

2026/10/20 19:29:55 阅读更多 →
AI可视化技术如何革新科研图表制作

AI可视化技术如何革新科研图表制作

1. 项目概述:当科研表达遇上AI可视化革命实验室里熬了三个通宵做出的数据图表被期刊编辑打回重审,这种经历每个科研人都懂。传统图表工具从Excel到Origin再到Python的Matplotlib,我们总在数据精确性和视觉表现力之间艰难平衡——直到遇见AI驱…

2026/10/20 5:52:01 阅读更多 →
【重磅发布】Claude Code v2.1.211 :解除多云 Prompt Cache 暴涨 Bug、解锁双向控制符攻击防御、子智能体文本全量输出!

【重磅发布】Claude Code v2.1.211 :解除多云 Prompt Cache 暴涨 Bug、解锁双向控制符攻击防御、子智能体文本全量输出!

Anthropic 团队于 2026 年 7 月 15 日正式推送了 Claude Code 的 v2.1.211 版本!本次更新包含了一个针对多云平台(Bedrock, Vertex AI, Mantle, Foundry)用户的重大计费漏洞修复;同时在系统安全(对抗双向控制符与零宽字…

2026/10/20 18:52:28 阅读更多 →

最新新闻

PaddleDetection环境搭建全流程:版本选型、安装步骤与常见报错排查

PaddleDetection环境搭建全流程:版本选型、安装步骤与常见报错排查

1. 为什么选择PaddleDetection作为目标检测入门框架目标检测这个方向,很多人第一次接触时都会卡在环境搭建上。不是缺这个库,就是版本对不上,再不然就是CUDA和显卡驱动打架。我自己在带新人和做项目交付的过程中,见过太多人还没开…

2026/10/21 4:36:50 阅读更多 →
电池PACK自动化产线构建与运行逻辑:从节拍计算到智能追溯

电池PACK自动化产线构建与运行逻辑:从节拍计算到智能追溯

电池组PACK自动化产线这两年几乎成了新能源工厂的标配,但真正跑得顺、跑出效益的线并不多。我参与过某新能源制造基地从规划、调试到量产爬坡的全过程,在PACK自动化生产线的构建与运行逻辑上踩了不少坑,也攒下一些一手经验。这篇文章不罗列设…

2026/10/21 4:36:50 阅读更多 →
lingbot-map:机器人空间数据到地图可视化的轻量级实践

lingbot-map:机器人空间数据到地图可视化的轻量级实践

1. 从“lingbot-map”这个名字说起:它到底想解决什么问题第一次看到“lingbot-map”这个项目名,我脑子里冒出来的第一个念头是:这大概率是一个把“机器人(bot)”和“地图(map)”绑在一起的东西。…

2026/10/21 4:36:50 阅读更多 →
太阳能船远程监控系统:从CAN总线到Grafana仪表板

太阳能船远程监控系统:从CAN总线到Grafana仪表板

1. 项目背景与整体思路太阳能船远程信息处理听起来是个挺唬人的词,说白了就干三件事:把船上的电池、光伏、电机这些设备的数据通过CAN数据记录下来,通过网络拉回岸上,最后在Grafana仪表板上画成一眼能看懂的曲线和仪表盘。这个项目…

2026/10/21 4:36:50 阅读更多 →
ping不通怎么排查?接口、ARP、路由、ACL全解析

ping不通怎么排查?接口、ARP、路由、ACL全解析

直接开门见山说结论:ping不通这个事儿,几乎每个网络方向的人都遇到过,但最怕的就是“病急乱投医”——先改IP,再换线,最后连设备都重启一遍,折腾半天还是不通。我这次在思科模拟环境里搭了一套模拟项目X的拓…

2026/10/21 4:36:50 阅读更多 →
Spark Streaming vs Flink:流处理选型核心差异与实战决策指南

Spark Streaming vs Flink:流处理选型核心差异与实战决策指南

1. 流处理选型这件事,为什么值得花时间掰扯清楚做实时数据处理的人,迟早会撞上同一个岔路口:Spark Streaming 和 Flink 到底选哪个。这个问题在技术社区里被反复讨论,但大多数对比文章停留在"Flink 是纯流、Spark 是微批&quo…

2026/10/21 4:35:50 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →