image

最近这两年很多学校采购(也可能是合作)了 WPS 教育版,用学号登录就可以领取,大家可以看看自己的学校有没有这些权益。

建议不开启云同步,不知道管理员能不能看到文件,我没开启,本地用用高级功能和一些会员功能。

背景

海外支付系统面临监管差异、场景复杂、渠道质量不一等挑战。原有方案定制化程度高,导致接入慢、维护难,无法支持业务敏捷拓展。三方支付渠道的不稳定性也对支付体验及业务指标造成影响。需构建智能支付路由系统,实现支付路径优化与风险防控,为全球化业务提供稳定高效的支付支撑。

海内外差异

从金融信贷业务的视角审视。海内外市场在支付模式与信贷结构上存在系统性差异,这一差异直接传导至支付路由系统架构的设计逻辑与实现路径。由于资金合作模式的多样性以及支付行为范式的区域性特征,支撑不同业务线的支付系统在资金流转机制、风险控制框架、用户交互设计及合规适配层面均呈现显著差异,集中体现在以下四个关键维度:

资金流转模式

国内助贷采用机构直连放款,资金从持牌机构经银行存管直接划转至用户,链路短且封闭。海外则需平台介入中转,借助第三方支付从平台账户二次拨款至借款人,链路更长且支付机构在资金储备、入金及清算上差异显著,因此必须建立精细化的备付金管理体系,将其作为路由决策核心,以平衡效率与流动性风险。
image.png

用户还款交互模式的范式转变

国内还款主要采用用户授权代扣模式,通过已签约的支付协议自动扣款,流程简洁、确定性高。相比之下,海外普遍采用虚拟账户充值模式,用户需通过专属虚拟账户主动完成还款操作,这增加了前端交互的复杂度,且不同国家与业务线对还款方式和支付渠道的偏好差异明显。因此,还款系统需具备智能路由和个性化收银台配置能力,以根据不同地区和场景动态适配渠道、界面与交互,提供定制化的还款体验。
image.png

风险控制与失败归因机制

国内支付依托银行验证,风险集中于信用维度。而海外用户广泛使用电子钱包等工具,频繁受单笔限额、累计限额、账户等级等约束。因此系统需建立精细化的失败归因体系,将限额、身份验证等与通道无关的失败原因单独归类,避免其干扰通道性能评估,确保路由决策基于通道真实服务能力。
image.png

运维策略与容灾机制

国内支付基础设施成熟稳定,服务中断多源于计划内维护。相比之下,海外第三方支付常因技术、合规等原因发生非计划中断,且部分银行有固定交易黑暗期。系统需支持预设维护窗口与黑暗期规则,并在这些时段自动将交易降级至备用通道,以保障交易成功率与体验连续性。
image.png

名词解释

支付渠道

支付交易体系中面向终端用户的交互界面层,特指支付服务提供商向用户呈现的可选支付方式的完整集合。这一概念的本质在于用户可感知性——它代表了用户在完成交易时,在支付界面所面对的具体选择项。如国内的支付宝、微信支付、银行渠道。

供应商

支付交易体系中的基础设施提供方,指具备支付清算资质和技术能力,为商户或支付服务商提供支付处理服务的金融机构或支付机构。他们是支付交易链中的能力输出方,支撑着整个支付交易的运转,通常存在以下三种类别:

二方银行:商业银行作为直接的支付服务提供方,如ICBC, ABC, CCB等。

三方支付机构:获得支付业务许可的非银行金融机构,如支付宝、微信等。

聚合支付服务商:整合多方支付能力,提供一站式支付解决方案的技术平台,如云闪付、美团支付等。

支付通道

支付通道是金融支付领域中一个抽象的业务概念,特指将资金供应商、交易产品形态与清算银行三者有机结合形成的标准化资金流转路径。具体而言,它描述了资金从供应方经由特定产品模式,通过指定银行机构完成向最终收款账户转移的完整执行链路。

通俗来讲:当前用户绑定支付渠道是ICBC,系统通过聚合支付宝付给用户打了一笔款,那么宝付 -> ICBC就代表一条支付通道。

路由

基于支付通道的属性特点和业务需求的个性化需求,线上每一笔资金支付交易都需要筛选出符合业务需求的最优通道。简单来说,就是当业务系统需要收付款时,路由系统负责为其选择一条最佳的支付通道(时效、成本、成功率),路由的主要功能,即为线上的每一笔资金交易提供最终的决策支持。

路由主要分为两类:一类是收银台展示支付方式的路由,它根据不同的用户和业务线的个性化需求,展示不同的支付方式及其排序,即引导路由;另一类则是绑定的支付渠道提交支付请求的路由,它根据支付交易的属性匹配通道的属性,从而选择最适合该笔支付交易的通道来进行资金交易,即交易路由
image.png

海外支付路由系统建设

基于海内外支付系统在资金流转路径、用户交互模式及监管合规环境等方面存在的结构性差异,结合支付底层核心概念的抽象与重构,海外支付路由系统需构建一套具备高度适应性、智能性与可扩展性的技术架构。系统主要围绕以下六个核心功能模块展开设计,以支撑海外新业务线的高效接入、稳定与合规运营:

统一领域建模体系

对支付交易全链路进行高阶抽象与标准建模,建立统一支付域语言与核心聚合(渠道、通道、三方、路由策略)。通过解耦业务逻辑与技术实现,消除不同业务线(消费贷、现金贷、BNPL等)与多元支付供应商(银行、电子钱包、聚合支付三方)间的异构性。实现配置驱动的策略管理机制,确保支付规则、费率结构、限额控制等核心参数可实现全局配置、即时生效与跨域共享,大幅提升系统的灵活性与维护效率。

智能路由与容灾降级机制

构建实时、多维的通道健康度监控体系,通过动态采集成功率、响应时间、错误率等关键指标,实现对支付通道的持续性能评估。当特定通道成功率低于预设阈值时,系统自动触发熔断机制,实时将流量切换至备用通道,保障交易连续性。熔断通道进入隔离状态后,系统通过定期探测与渐进式恢复策略,自动验证通道可用性并实现平滑恢复,形成完整的“监控-熔断-恢复”闭环,显著提升系统整体可用性与韧性。

可视化运营管理平台

基于低代码与可视化设计理念,构建面向业务运营人员的自助式管理平台。支持对业务场景配置、资金调度计划、渠道额度分配等核心运营要素进行图形化编排与实时调整。运营人员可通过拖拽式界面完成策略配置,实现秒级发布与即时生效,大幅降低对技术资源的依赖,提升业务响应速度与运营自主权。

定制化场景路由策略

针对差异化业务场景提供专属路由策略配置能力。对于大额资金结算场景,系统支持配置专属高可靠通道与多级复核流程;针对机构客户或BNPL(先享后付)合作商户,提供定制化的结算周期、分级费率与专属通道路由策略。通过场景化策略引擎,实现在统一架构下对特殊业务需求的精准适配与高效支持。

智能成本优化引擎

构建多目标优化的智能决策模型,系统实时计算各支付通道的综合成本(交易费用)、健康状态评分及当前业务需求匹配度。基于动态权重算法,在支付成功率、交易成本、到账时效等多维度约束下,自动选择综合最优支付路径,实现成本效率与服务质量的最佳平衡,持续优化单位交易经济效益。

渠道动态维护与预防式管理

建立渠道全生命周期管理机制,支持运营后台对异常渠道进行实时标记与立即剔除,避免故障通道参与后续路由决策。通过预设维护时间窗口、黑暗期规则及版本迭代计划,实现预防式交易管理。系统自动在渠道维护期间将交易流量降级至备用通道,并在服务恢复后自动回切,最大限度减少计划外停机对业务的影响,保障支付服务的连续性与稳定性。

系统架构

image.png

路由核心模块

交易路由

交易路由是支付体系中的执行层路径选择范式, 专注于在支付请求提交阶段,根据交易的客观属性和通道的技术特性,动态选择最优执行路径。与展示层的引导路由不同,交易路由的核心特征在于路由核心计算逻辑,保证每一笔提交的交易请求可以实时决策出当前系统支持的最优支付通道,保证交易成功率。

交易路由核心流程

通道获取 → 层级筛选 → 三维评分 → 择优决策

层级筛选

① 通道状态 → ② 黑暗期 → ③ 维护期 → ④ 熔断状态 → ⑤ 金额区间 → ⑥ 备付金

路由计算

通道交易路由评分 =  通道成本值 * 成本值权重 + 通道健康值 * 健康值权重 + 通道业务值 * 业务值权重

给定通道  的成本值 、健康值 、业务值 ,其路由评分  计算公式为:

通道成本计算逻辑

通道成本值是一个归一化评分指标,它将不同通道的实际手续费转换为0-100的标准化评分体系。该算法的核心逻辑是:手续费越低的通道,成本值评分越高(最高100分)手续费越高的通道,成本值评分越低(最低0分)。

业务值计算

业务值计算采用策略驱动型二元判定模型,根据预设路由策略规则对用户请求进行匹配性评估。该模型将通道的业务适配度量化为二元评分,以反映通道在特定场景下对当前用户的策略符合程度。 路由策略由三个核心维度构成:

  • 场景维度:界定策略适用的业务场景
  • 用户维度:定义用户标识的匹配规则
  • 通道维度:指定策略关联的支付通道集合
健康值计算

通道  的健康值  由交易成功率  和交易时效评分  加权计算得出:

参数定义:

交易路由流程

image.png

引导路由

引导路由系统作为支付生态体系中的前端智能决策层,承担着连接用户支付意愿与可用支付能力的关键桥梁作用。该系统通过对用户特征、业务场景、交易属性等多维度信息的实时分析,为不同用户群体在不同业务场景下动态生成个性化支付方式展示方案,故引导路由的核心逻辑在于从用户视角出发,而非复杂的路由计算实现。系统将复杂的支付通道能力抽象为用户可理解的支付方式选项,通过智能排序、动态筛选、个性化推荐等机制,降低用户决策成本,提升支付转化效率。

路由核心流程

通道获取→ 策略获取 → 业务路由判断 →  降级计算 → 个性化参数组装

层级筛选

① 通道状态 → ② 黑暗期 → ③ 维护期 → ④ 熔断状态

路由计算

通道引导路由结果 =  通道活跃状态 + 用户可见性 + 业务配置匹配

引导路由流程

image.png

智能熔断

在复杂的支付体系中,通道的稳定性直接影响着每一笔交易的成败。当某个支付通道突然响应缓慢或频繁失败时,系统需要智能地识别、隔离并最终恢复这条"断联"的通道,故路由体系需要支付通道健康监控和熔断机制。

  • 数据采集

系统以分钟为单位,持续收集每条通道的交易表现数据,包括:成功交易数失败交易数待处理交易数平均响应时间等。

  • 熔断机制
触发条件

数据充分性:只有当通道在过去半小时内有至少n笔交易时,才具备被评估熔断的资格——避免因数据不足误伤健康通道。

失败率控制:失败交易占比超过S%?这是一个危险信号。系统会立即分析是偶发问题还是趋势性问题。

积压监控:Pending交易占比超过S%?说明通道处理能力已接近饱和,需要暂时减压。

响应时效:平均响应时间超过T秒?交易时效需要保证。

熔断执行

状态标记:数据记录,明确熔断起始点

通道拦截:设置通道冷却期,期间该通道不会出现在可选列表中

流量转移:所有交易请求自动路由至其他健康通道

恢复策略

状态标记:更新熔断通道状态,可进行交易尝试

康复验证:进入标记状态后,系统不会立即完全恢复通道,而是采用渐进式验证;观察到通道存在成功交易,系统确信通道已康复,标记移除,状态恢复。

未来规划

容灾收单与自动补款体系建设,为彻底解决因渠道瞬时全不可用导致的成交流失问题,规划构建“容灾收单-自动补款”的交易闭环体系,实现路由系统与交易系统的协同迭代。

交易侧容灾收单:当智能路由系统判断所有可用通道均因异常熔断、备付金不足或处于黑暗期而失效时,交易系统将自动启用兜底收单服务,优先保障用户体验与交易流程不中断,完成订单落单。

自动补款:对容灾收单产生的待处理订单,系统将其纳入自动补款队列。路由系统将根据预设策略(如时间间隔、渠道恢复状态)重新发起路由决策与支付尝试,完成资金闭环,最大化挽回交易损失。

作者介绍

导读:面对万亿级广告数据存量、日均 3 亿行增量及数千个复杂查询模板的挑战,快手广告数据平台如何突破性能瓶颈、实现架构统一与体验跃升?本文系统介绍了快手广告团队从 ClickHouse on ES 混合架构,全面迁移至 Apache Doris 的统一分析实践,最终实现查询性能提升 20~90%,写入吞吐提升 3 倍,存储效率提升 60%。

本文整理自快手高级计算引擎研发工程师 周思闽 在 Doris Summit 2025 中的演讲内容,并以演讲者第一视角进行叙述。

快手是国内日活过亿的短视频平台,其广告投放平台是商业化外部广告主与快手电商商家进行广告投放的主要阵地,支持客户在平台上进行广告物料搭建、物料管理、策略变更、数据查看等操作,这对底层数据系统的存储、计算与查询性能提出了极高要求。

要支撑如此大规模的广告投放与实时分析,底层数据架构面临巨大挑战。当前,快手的广告数据包括:由投放系统产生的物料数据以及用于数据分析的效果数据,这些数据呈现出三个显著特征:

  • 数据存量巨大:广告物料累计已达千亿级别,且随业务发展正向万亿规模迈进,存储体量位居公司前列,对架构扩展性提出极高要求。
  • 数据增长迅猛:仅 2025 年第一季度,日均新增广告物料数据同比激增 3.5 倍,要求底层引擎具备强大的实时写入与弹性扩展能力。
  • 数据模型复杂:整个数据体系涵盖约 700 个核心字段,涉及物料、投放、用户、效果等多个维度;同时,为应对多样化分析场景,沉淀的查询模板已超 4000 个,对查询引擎的兼容性与性能均是严峻考验。

架构演进:从分散存储到统一分析

01 早期架构及挑战

早期存储架构中,物料数据由 MySQL、Elasticsearch 协同存储;效果数据主要存储与 Clickhouse 中。

数据分析时,将分散在 MySQL、Elasticsearch 中的物料数据与 ClickHouse 中的效果数据进行高效关联查询,从而为广告主提供完整、及时的投放效果洞察。

01 早期架构及挑战.PNG

在如上所说的 ClickHouse on ES 架构中,用户提交的查询通常包含 Elasticsearch 外表(a)与 ClickHouse 内表(b)。ClickHouse 会解析查询中外表部分,将其转换为 Elasticsearch 查询语句,通过 HTTP 请求获取数据并封装为 Block,最后在引擎内部完成与内表的关联计算。

01 早期架构及挑战-1.PNG

然而,随着 Elasticsearch 中数据量持续增长,该架构逐渐暴露诸多问题:

  • 查询性能恶化:慢查询率上升至 35%,平均查询耗时达到 1.4 秒;
  • 存储瓶颈:Elasticsearch 单分片难以支撑 10 亿级以上数据量,扩容与数据重分布成本高;
  • 运维复杂度高:数据链路依赖组件多,运维与监控成本显著上升;
  • 问题定位困难:缺少 ClickHouse 与 Elasticsearch 之间的全链路可观测手段,出现查询延迟、数据不一致等问题时,需跨系统排查,耗时较长。

02 选型目标及调研

基于上述问题及挑战,我们为新架构设定了明确目标:

  • 慢查询率低于 5%;
  • 运维排查耗时降低至分钟级;
  • 支持单表万亿级别数据存储;
  • 保障数据实时性,延迟低于 5 分钟。

基于以上目标,我们对 Apache Doris、ClickHouse、Elasticsearch 等主流 OLAP 引擎进行了全面的调研与性能压测。测试涵盖了写入吞吐、查询延迟、存储压缩率、全文检索性能等关键维度。

02 选型目标及调研.png

在这过程中,ClickHouse 首先被排除,因其不支持唯一键模型,而广告物料数据存在大量更新场景,要求引擎具备主键更新能力。因此,重点在 Elasticsearch 与 Apache Doris 之间进行对比。

综合测试结果,Apache Doris 在写入性能、查询效率、存储成本及运维复杂度等方面均表现优异,不仅能够满足既定架构目标,还在多个场景下显著优于 Elasticsearch。因此,我们最终选定 Apache Doris 作为下一代广告数据分析引擎

03 基于 Apache Doris 的统一分析引擎

在实际应用中,我们引入 Apache Doris(计算引擎) 替换了原先架构中的 Elasticsearch、ClickHouse,设计了统一分析引擎 Bleem。通过在外部表模块中引入数据缓存层与元数据服务层,有效提升了跨源查询效率,使数据湖外表的查询性能接近内表水平,实现了关键的性能突破。

03 基于 Apache Doris 的统一分析引擎.png

具体来看,Bleem 架构自下而上分为 5 层

  • 存储层:数据湖中的 Hive/Hudi 数据存储于 HDFS;存算分离模式下的内表数据存放于对象存储 BlobStore;存算一体模式下的内表数据则存储于本地磁盘。
  • 缓存层:将 Hive/Hudi 外部表数据缓存至 Alluxio,保障 I/O 稳定性,提升数据读取效率。
  • 计算层:Apache Doris 为核心引擎。不同项目组对应不同的 Doris 集群,以实现计算资源物理隔离,用户可按需申请计算资源。依托于 Doris 湖仓查询能力,可直接对 Doris 内表与外部 Hive/Hudi 数据查询。同时,Doris 也支持存算一体与存算分离两种部署方式,可根据实际需求灵活选择。
  • 服务层:元数据缓存服务实时监听 Hive 元数据变更,并同步至缓存中,以提升湖仓外部表的查询效率。
  • 接入层:将 OneSQL 作为统一查询接入网关,提供集群路由、查询改写、物化改写、查询鉴权、限流与阻断等功能。

依托 Doris 强大的 OLAP 计算与湖仓一体能力,将此前分散的数据湖分析、实时 OLAP 查询、在线报表及全文检索等多种场景,统一整合至同一套引擎架构中,实现了技术栈的收敛与提效。该架构在实际落地中已带来显著收益:

  • 性能大幅提升:慢查询率低于 5%,整体查询性能提升了 20%~90%
  • 存储扩展高效:支持万亿级别数据存储,水平扩容效率较 Elasticsearch 提升 10 倍以上;
  • 运维大幅简化:一套引擎覆盖全部查询场景,系统依赖组件少,运维复杂度显著降低;
  • 可观测性全面加强:Doris 支持全链路追踪与全面监控,平均问题排查时间降低 80%

迁移实践及调优经验

整个迁移过程分为三个阶段,稳步推进以确保业务平稳过渡:

  • 第一阶段(试点验证):选取关键词推广场景进行试点,跑通全量与增量数据导入流程,搭建双链路并行验证数据一致性与查询正确性。
  • 第二阶段(主体迁移):迁移原 ClickHouse on ES 查询链路,将 Elasticsearch 中全量物料数据导入 Doris,完成业务切换后下线 Elasticsearch 集群。
  • 第三阶段(收尾统一):迁移剩余纯 ClickHouse 场景,将无需关联 Elasticsearch 的查询任务及其数据全部迁移至 Doris,完成整体架构统一。

在架构升级及迁移过程中,我们收获了许多实践及优化经验,在此逐一分享

01 解决极端场景下数据一致性问题

在数据导入层面,我们基于 SeaTunnel 实现流式数据同步,该方式支持批处理场景下的 Overwrite 语义,所有导入均采用两阶段提交机制,以确保数据同步的最终一致性。

而在基于 SeaTunnel 和 Spark 的数据同步过程中,我们遇到了极端场景下的数据重复问题。主要有两种情况:

  • Spark 推测执行时,两个 Task 同时写入同一份数据并均完成 Doris 两阶段提交,尽管 Driver 只认定一个 Task 成功,但数据已重复。
  • Spark Task 完成 Doris 提交后,在向 Driver 汇报前因抢占或异常退出,Driver 重启 Task 并重新写入数据。

为解决该问题,我们在 Doris 的两阶段事务提交环节引入了 ZooKeeper 分布式锁机制,通过记录并校验事务状态来保证批同步的一致性。具体流程如下:

  • 准备提交阶段,先获取 ZooKeeper 临时锁,确保同一时间只有一个事务进入提交流程;
  • 获取锁后,将 Prepare 状态写入 ZooKeeper 临时节点,并记录当前事务 ID;
  • 查询上一个事务的状态:

    • 若不存在,直接提交当前事务;
    • 若上一事务处于 Prepare 状态,则先回滚上一事务,再提交当前事务;
    • 若上一事务已 Commit,则直接回滚当前事务;
  • 最终将 Commit 状态写入 ZooKeeper 持久节点,完成本次提交。

01 解决极端场景下数据一致性问题.png

02 Stream Load 机制优化

为应对高并发数据导入,我们对 Apache Doris 的 Stream Load 机制进行了调优。通过合理配置任务优先级与合并(Compaction)参数,显著提升了写入吞吐与稳定性。Doris 内部通过 Load Channel 进行任务调度,以区分高优与普通优先级通道。

02 Stream Load 机制优化.png

调优的核心在于合理配置相关参数,例如当 Stream Load 任务指定的 timeout 时间小于 300 秒时,系统会将其判定为高优任务并分配至高优通道。参数优化如下

load_task_high_priority_threshold_second=300
compaction_task_num_per_fast_disk=16
max_base_compaction_threads=8
max_cumu_compaction_threads=8

03 差异化的建表策略

OLAP 引擎的查询性能很大程度上取决于表结构设计。因此,我们针对不同业务场景制定了差异化的建表策略:

物料表(高频更新与大规模检索):该表数据量极大且需支持实时更新。业务查询主要基于 account_id 进行过滤,而非原 MySQL 的自增 ID。为充分发挥 Doris 前缀索引与排序键的优势,在保证业务逻辑等价的前提下,我们将 account_idid 组合为联合主键,并将account_id 设为首个排序键及分桶字段,大幅提升查询过滤效率。同时配置倒排索引以支持多维检索,并选用 ZSTD 压缩算法平衡存储与 IO 性能。

-- 建表语句参考
CREATE TABLE ad_core_winfo
(account_id BIGINT NOT NULL,
id BIGINT NOT NULL, 
word STRING,
INDEX idx_word (`word`) USING INVERTED...) 
UNIQUE KEY(account_id,id) 
DISTRIBUTED BY HASH(account_id) BUCKETS 1000;

效果表(多维聚合分析): 相较于物料表,效果表侧重于数仓指标的累加与聚合。因此,我们直接采用聚合模型,并按照“天”或“小时”粒度设置分区。

-- 建表语句参考
CREATE TABLE ad_dsp_report
(__time DATETIME, 
account_id BIGINT, ...
`ad_dsp_cost` BIGINT SUM,
...) 
AGG KEY(__time,account_id,...) 
AUTO PARTITION BY RANGE(date_trunc(`__time`,'hour'))()
DISTRIBUTED BY HASH(account_id) BUCKETS 2;

04 大账户数据倾斜治理

在数据压测中,我们发现不同 Account ID 对应的数据量差异极大,小至个位数、大至百万级别,导致 BE 节点 CPU 负载严重不均。通过 SHOW DATA SKEW 命令进一步确认,Tablet 存储分布明显倾斜:大 Tablet 占用空间达 3–4 GB,小 Tablet 仅 100-200 MB,且大账户查询延迟较高。为此,我们实施了以下两点优化:

A:按账户范围进行分区

经分析,Account ID 为 5–8 位数字,且未来不会超过 10 位。因此使用 FROM_UNIXTIME 函数将 Account ID 转换为 Datetime 类型,按月对历史数据进行分区,共划分出 33 个历史分区。每个分区可容纳 2,592,000 个 Account ID,后续每新增约 200 多万个 Account ID 才会新增一个月份分区。同时,针对历史分区,根据数据存量进行手动分桶,新分区则默认设置为 256 个分桶。

该方案通过分区裁剪有效过滤了大量无关数据,同时为未来数据膨胀预留了扩展空间(物料表日均增量约 3 亿),显著降低分区增长对查询性能的影响。

B:对 Account ID 进行二次哈希

为缓解单个 Account ID 数据量差异过大导致的分布不均,我们选取与 Account ID 无关的 ID 字段,通过 ID MOD 7 计算得到一个取值在 0~6 之间的 mod 字段。将原本仅基于 account_id 的哈希分桶键调整为 (account_id, mod) 联合键,从而将同一 Account ID 的数据分散到 7 个 BE 节点上。

04 大账户数据倾斜治理.png

优化后,各 Tablet 大小基本均衡稳定在 1GB 左右,数据存储与查询负载得以在多个 BE 间均匀分布,有效解决了 此前 CPU 负载不均的问题。

05 万级分区下的查询优化

当分区数量达到万级别时,简单点查 SQL 的耗时达到 250 毫秒,远超 100 毫秒的预期。通过分析,耗时主要集中在 Plan 阶段,原因是 Doris(2.1 版本)在分区裁剪时,会遍历所有分区进行匹配,万级分区的顺序遍历开销巨大。

为此,我们将顺序遍历改为二分查找:对万级分区先进行排序,再利用二分查找快速定位目标分区,将时间复杂度从 O(n) 降至 O(log n)。优化后,该查询耗时从 250 毫秒降至 12 毫秒,性能提升超过 20 倍。目前,二分查找已在 Doris 3.1 版本中实现。

06 并发调优

在查询优化过程中,我们发现:多数查询经过条件过滤后,实际命中的数据量并不大,即便在大账户场景下,命中数据量也仅在百万级别。然而,Profile 显示这类查询的 Total Instance 数高达 800 个,其默认并发数为 32,存在明显的过度并发

为此,我们调整以下参数降低并发开销:

set global parallel_exchange_instance_num=5;
set global parallel_pipeline_task_num=2;

调整后,同一查询的 Total Instance 数量降至 17 个,查询耗时也显著缩短。这说明在小数据量点查场景下,适当降低并发可有效减少 RPC 开销,从而降低延迟(220ms 降至 147ms)。同时,这一优化也提升了系统的整体 QPS 承载能力。

收益及规划

经过上述架构迁移与深度优化,我们在三个核心维度取得了显著收益:

  • 查询性能大幅提升:关键词推广页平均查询延迟下降 64%,创意推广页延迟下降超过 90%,整体查询体验实现跨越式提升。
  • 写入能力显著增强:单节点写入承载能力提升 3 倍以上,单表实时导入峰值突破 300 万行/秒
  • 存储效率优化明显:通过分区策略与 ZSTD 压缩算法,存储效率较 Elasticsearch 提升约 60%,并可轻松支撑万亿级数据存储。

未来,我们将深度探索 Apache Doris ,重点围绕两方面展开:

  • 增强全文检索与分词能力:引入社区在 Doris 4.0 版本中推出的 BM25 打分功能,以及 IK 分词器等更多分词组件,实现按业务场景灵活选用最优分词方案。
  • 增强向量索引:基于 Doris 4.0 版本,在内表和数据湖外表场景下对向量检索的性能和边界能力做验证与优化。

本文完。您还可以阅读来自快手另一篇实践案以及中通快递、小米集团、顺丰科技用户故事来了解湖仓分析。

fnos 这两天爆出了一套 bug,可以在没有任何信息的情况下获取机器 rw 权限。不太理解的是,很多人在发现自己机器被干掉之后,不是第一时间备份资料重装系统,而是想着清理被感染的系统,真的以为能清理干净的么。。。

nas 这种机器的系统,应该使用 squashfs 的吧?一个是升级方便,另一个是 ro 的文件系统不容易被感染,就像 openwrt 那样。如果某天出了问题,直接还原 squashfs 即可,系统的二进制文件也不会被替换。

还有一点比较担心的是,恶意程序是否有污染用户数据?加密勒索倒是不太可能,但如果把恶意程序放用户目录下会不会在某天不知名的时候被触发?

当我们凝视一列列飞驰的列车,是否想过——这些庞然大物如何被精确识别、追踪与管理?答案就藏在小小的“铁路车号识别系统”中。随着智能铁路时代的全面到来,这一关键技术正成为行业竞争的焦点。
近日,备受关注的2026年铁路车号识别系统生产厂家综合实力排名正式发布,揭示了这一细分领域的新格局。

2026年铁路车号识别系统厂家TOP5

第一名:孚为智能科技
凭借自主研发的“光感灵眸”多模态识别引擎,以99.99%的复杂环境识别率首次登顶。其系统深度融合了高光谱成像、动态自适应学习与边缘计算,即便在雨雪、雾霾、强逆光等极端条件下,依然保持行业领先的稳定表现。目前已在全国超过30条主干货运线路及15个大型编组站规模化部署。
第二名:华明视讯科技
以视频智能分析见长,其“睿视”系列智慧铁路平台,将车号识别与车体状态智能巡检功能创新性合一。通过AI算法实时分析车体外观、装载状态、关键部件可视异常,变“识别”为“检测”,为铁路安全运营增添了一道智能防线,在地方铁路与工矿专用线市场中占据显著优势。
第三名:海康威视
将视频分析技术优势延伸到铁路领域,多光谱识别技术解决了夜间和低能见度环境下的识别难题。
第四名:华为智慧铁路
依托强大的云、AI及鸿蒙铁路操作系统生态,主攻“车-地-云”一体化系统,在新建智能化高铁线路中屡获标杆项目。
第五名:西门子中国铁路智能
引进欧洲先进技术并完成本土化适配,在国际联运线路的技术标准化方面具有独特优势。
技术分野:从“单一识别”到“场景智能”
本次排名反映出清晰的技术演进路径。头部企业已不再满足于提供孤立的识别硬件,而是纷纷推出基于具体场景的智能解决方案。
- 孚为智能科技专注于攻克恶劣自然环境下的识别难题,其技术有效保障了高寒、风沙、潮湿等特殊地理环境下的铁路运营。
- 华明视讯科技则瞄准了运维与安全场景,让系统在完成识别本职的同时,成为列车健康管理的“第一道哨兵”。
市场洞察:专业化与生态化并进
榜单变化背后,是市场需求的深度裂变。一方面,在货运增量、安全加压的背景下,对识别可靠性、鲁棒性的要求达到空前高度,催生了如孚为这样的技术专精型冠军。另一方面,铁路数字化建设走向系统整合,需要识别系统能与调度、运维、安全管理等平台无缝融合,生态构建能力成为关键。
未来展望:识别即服务,数据即价值
行业专家指出,车号识别系统的终点远非“认车”。未来的系统将是铁路数字孪生的核心数据入口,识别产生的海量时空数据,将与货运信息、设备状态、线路状况相结合,用于预测性维护、智能调度、货运物流全程可视化,最终实现从“感知物理身份”到“驱动业务智能”的跨越。

2026年的排名更迭,是一场技术深度与场景理解的双重竞赛。它标志着中国铁路智能化供应链正走向成熟、细分与高质量发展。每一次车号的精准识别,都是中国铁路庞大躯体中一次高效的数据脉搏跳动。而在脉搏源头引领创新的企业,正共同推动整个产业向更安全、更高效、更智慧的远方驶去。

你认为在智能铁路时代,铁路车号识别技术下一步最应该与哪些技术融合?是物联网、数字孪生,还是区块链?欢迎在评论区分享你的真知灼见!

在生成式 AI 的工程实践中,智能体(AI Agent)正被频繁提及,但一个被反复验证的结论是:并非所有问题都适合被智能体化。 在真实业务环境中,盲目引入智能体,往往带来更高的系统复杂度、不可控的执行路径,以及不成比例的算力与成本消耗。

因此,在“能不能做”之前,更重要的是回答:这个问题是否“必须”由智能体来解决?

一、什么样的问题,才属于“智能体级问题”

从工程角度看,智能体并不是“更聪明的模型”,而是一种具备目标驱动、自主规划、工具调用与反馈修正能力的执行范式

判断是否需要智能体,本质上是在判断一个问题是否同时具备以下两点:

  • 环境动态性:执行过程中,外部信息持续变化
  • 路径非确定性:任务步骤无法在执行前被完全穷举

只要其中一项不成立,智能体往往不是最优解。

二、三步判断法:是否真的需要智能体

1️⃣ 决策链路是否可被固化

核心判断

任务能否被拆解为固定 SOP,且路径在执行前完全可预期?
  • 需要智能体

    • 执行路径依赖中间结果
    • 不同中间状态会触发完全不同的下一步
    • 示例:企业尽调、复杂调研、跨领域分析
  • 不需要智能体

    • 输入 → 处理 → 输出为确定链路
    • 示例:翻译、格式转换、规则校验

2️⃣ 是否需要动态选择工具

核心判断

是否需要根据执行状态,在多个异构工具间做实时决策?
  • 需要智能体

    • 工具调用顺序不固定
    • 是否调用、调用哪个工具,取决于中间数据
    • 示例:数据分析 + 脚本计算 + 内容生成的组合任务
  • 不需要智能体

    • 单工具或单接口即可完成
    • 工具调用路径固定

3️⃣ 是否存在闭环反馈与自我修正

这是区分“高级 Chatbot”与智能体的分水岭

  • 需要智能体

    • 执行 → 失败 → 反思 → 重试
    • 示例:代码生成并自动运行,基于错误日志持续修正
  • 不需要智能体

    • 一次性生成即可
    • 或由人工完成最终纠错

三、行业实践中的“智能体准入信号”

在真实业务中,以下特征往往意味着传统自动化已接近极限

  • 目标模糊:只给出意图,而非步骤
  • 长程任务:跨多个时间节点,需要持续状态维护
  • 强实时依赖:必须不断引入新数据调整决策

在大量行业落地中,智能体来了并不是因为“模型更强”,而是因为问题形态发生了变化

四、成本与可靠性的现实约束

从 ROI 视角,智能体方案天然存在代价:

  • 可靠性:存在非确定性与幻觉风险
  • 响应时延:多轮推理与工具调用带来秒级延迟
  • 计算成本:Token 消耗不可预测,存在无效尝试

因此,“能用”与“该用”必须严格区分。

五、智能体使用决策矩阵(工程视角)

  • 低复杂 / 高频 / 固定路径 → 传统代码自动化
  • 高复杂 / 低频 / 创意为主 → Prompt Engineering + 人工
  • 中高复杂 / 高动态 / 多工具协作 → 智能体(AI Agent)的核心适用区
  • 高风险 / 零容错场景 → Human-in-the-loop,智能体仅做辅助规划

结论

是否引入智能体,并不取决于模型能力,而取决于问题是否必须具备

  1. 自主拆解目标
  2. 根据环境反馈修正行为

如果答案是否定的,智能体只会放大复杂度,而不是效率。

亚马逊云科技已在所有支持 EC2 Capacity Blocks 的区域,将面向机器学习的该服务价格统一上调,涨幅约 15%。此次价格调整影响的是为大规模机器学习工作负载预留专用 GPU 计算能力的组织,亚马逊云科技旗下最强的多款 ML 实例价格均同步上涨,包括基于 NVIDIA GPU 的P5en、P5e、P5 以及 P4d,以及使用AWS Trainium的 Trn2 和 Trn1 实例。

 

尽管亚马逊云科技自 2023 年推出 Capacity Blocks 以来一直强调其定价会根据供需关系动态调整,但云经济学家 Corey Quinn 在领英博文中指出,这次调整与常见的动态定价机制并不相同:

这是亚马逊云科技直接更新了官网公布的基础价格……每小时 34.608 美元统一变为 39.799 美元,所有区域一致。这是一次政策层面的决定,而不是供需波动。

 

EC2 Capacity Blocks for ML允许企业在亚马逊 EC2 UltraClusters 中预留 GPU 实例。而 UltraClusters 则是亚马逊云科技为需要数百甚至上千张 GPU 的分布式机器学习训练而优化的高性能计算基础设施。与标准预留实例或 Savings Plans 不同,Capacity Blocks 能在明确的时间窗口内(通常从一天到数周)保证客户获得指定实例类型的使用权。

 

这一变化的影响并不止于成本上升本身。Platform Fix 创始人Steve Wade在 Quinn 的同一条领英博文的讨论区中指出了更深层的意义:

先例已经被立下了,这才是关键。一旦这扇门被打开,就不会再关上。每个 FinOps 团队的风险清单里,都会多出一项。

 

Portainer 的产品负责人Nathan Peck则从更宏观的经济背景解读了这一变化:

要警惕通胀和美元贬值的速度,这二者正在超过摩尔定律带来的效率提升。这才是真正改变云计算模式的临界点。无法跟上通胀的“静态价格”,在技术上等同于持续降价。一旦云厂商无法继续维持这种状态,提前自购硬件反而会显得更有吸引力。

 

此次调价也反映了云基础设施市场真实存在的供应链压力。富国银行董事总经理兼技术高管David Lee表示:

我们正在经历另一轮类似疫情时期的供应紧张,尤其是在内存和网络交换设备方面。几乎所有东西都在涨价。

 

不过,真正的瓶颈可能并非很多人想象的那样。一位资深 DevSecOps 工程师James S.指出:

这里的“供给”其实是电力。微软 CEO 曾提到,他们有整仓库的 GPU 尚未安装,因为根本没有地方部署。

 

可替代方案的稀缺进一步放大了这次涨价的实际影响。一位 Reddit 的 r/aws 社区用户评论道:

Capacity Blocks 基本上是你唯一能用到这些实例类型的方式。几乎不可能按需启动它们。某种程度上,这等于对外宣传一个按需价格,但实际收费却更高。

 

这种稀缺性意味着企业几乎没有空间去消化这次成本上涨。更重要的是,即便是签署了企业折扣协议的客户也无法幸免,因为这些折扣通常是按百分比计算,而不是固定金额——公开价格上涨 15%,实际成本同样会上涨 15%。

 

目前尚不清楚这是亚马逊云科技的单独调整,还是整个行业趋势的一部分。Snowflake 的战略解决方案工程师Spencer T.指出,此次涨价似乎主要集中在使用 NVIDIA H200 GPU 的 P5e 实例上,这可能意味着:“英伟达对云服务商提高了价格,这更像是上游成本向下游转嫁,而不是一个全新的定价先例”。

 

至于谷歌云平台或微软 Azure 是否会对其 GPU 产品进行类似调整,目前仍无明确消息,但业内普遍认为,这些底层成本压力同样影响着所有的超大规模云厂商。

 

对于机器学习团队和 FinOps 从业者而言,这次涨价再次凸显了工作负载优化和成本治理的重要性。首席云架构师 Ivo Pinto总结道:

在当前 GPU 和内存价格背景下,这并不令人意外。真正重要的是,充分理解你正在使用的服务,以及它背后的定价机制。

 

目前,该价格调整已在所有支持 EC2 Capacity Blocks for ML 的亚马逊云科技区域正式生效。亚马逊云科技下一次计划中的定价评估时间为 2026 年 4 月。更详细的价格信息可在 AWS EC2 Capacity Blocks 官方定价页面中查看。

原文链接:

https://www.infoq.com/news/2026/01/ec2-ml-capacity-price-hike/

想买几件春节衣服
打开 CHROME, 搜索关键词, 打开某家店铺, 添加了 2 个还是 3 个购物车物品
然后就跳转到一个英文页面, 提示账户风险, 3 天后解除. 如果期间再犯 BLABLABLA

打开 IOS APP,点击 官方客服按钮, 好嘛, 也跳这个提示, 连客服都不给撩了

那只能打电话给客服,客服说具体原因是'不当获取信息'

我:所有信息都是你们和商家自愿展示给我的,怎么就不当了?

客服无法进一步解释,无法提供申诉通道,只让等解封

我:那 3 天后又封呢?

客服表示不会的,您到时候改密码,不要授权别人手机登录,不要频繁截图.

我:我就这一个手机一个电脑登陆过,不存在授权别人.过去一年截图都不要超过 10 张.密码更是和所谓不当获取信息没有半毛钱关系

客服:嗯,我了解你的心情,BLABLA,但是系统自动判断的,没有办法,BLABLA

我心想:算了,脑子正常都明白系统是人做的,规则是人给的,机器人暂时还没有统治世界,但你既然不愿意分享规则,甚至不给申诉渠道,多说也无益

我不能妄下论断封号原因,但我可以猜测是淘宝没有能力分辨正常用户和抓信息友商,只能一刀切地设置一个阈值,当你比如 1 秒开了 A 个网页, 1 分钟开了 B 个网页, 1 小时开了 C 个网页, 之类规则任意触发一个, 我不管你是谁我都给你封了

咱就说,你既然保留了 WEB,就好好让人用啊,有啥阈值是不能说的,难道人家专业抓信息的人还不能试出来?
要是在不想做就别做了,拼多多没 WEB 照样赶超你,是不

当然咱这吐槽的是有点权限的小领导们, 不针对听指挥办事的辛苦码农们

那么问题来了,在这里的淘宝员工,偷偷告诉我,你们阈值是啥,有什么技巧正常用 WEB 购物,我保证不告诉别人

互联网上无脑的人太多了,说小米指定被喷, 这个站点的人相对水平高,辨识能力强,大家一起讨论下,小米到底差在哪了。

我用小米很多年了,最近也准备弃了,还没想好换啥,但绝对不用小米了,总是遇到几个问题, 用的是 REDMI K80 ,当时冲首发买的,系统更好几个版本了,还是没解决。

1.打游戏的时候(原神 / 王者),在等待的时候小窗抖音刷视频,或者小窗微信回消息,时不时接卡死,卡到长按电源键都没用,得等一会它自己重启。

2.NFC 总是失灵, 换各个角度好多遍。

3.之前上线超级小爱吹得 AI 游戏助手,目前在原神上都是一片白(国际版原神)。

4.微信,抖音,高德,只要打开 3 个 App 以上,必然掉帧,卡到人崩溃。

其他的就不说了,总之小问题不少。

当时 Hyper OS 2 出来的时候就猜到了,哪怕到了 Hyper OS 3 也还是那个尿性,果然如此。

我这几个月算了算,真的用过不少小米的产品:
小爱音箱触屏版、智能风扇、电动牙刷、充电宝、小米 10 ,小米 11 ,小米 12S ,小米 12 X ,K40 ,K60 ,K80 ,小米 CIVI ,插线板,平板,触控笔、耳机、拓展坞、手环 6 NFC 、小米手表 Watch S3 、智能插座、摄像头...

不能说全不好,至少接下来手机 + 平板绝不考虑小米!!! 接下来可能继续用回一加,但现在一加已经是 Color OS 了 ...

在数字化转型浪潮中,CRM(客户关系管理)已成为中小企业提升销售效率、留存客户、实现精准增长的核心工具。然而,不同CRM产品的能力差异显著——有的聚焦销售流程自动化,有的侧重业财深度融合,有的擅长项目型协同。本文选取超兔一体云(深度业财一体)、Zendesk Sell(客服联动)、钉钉CRM(协同生态)、Insightly(项目型)、Nimble(轻量化)、Capsule CRM(基础管理)六大主流产品,围绕销售自动化、客户管理、销售预测、订单管理、财务集成、外勤管理六大核心领域展开横向对比,为企业选型提供决策依据。

一、先看全局:六品牌核心定位与能力矩阵

在深入对比前,先通过能力雷达图快速呈现各品牌的优势领域(评分基于能力覆盖度、自动化深度、场景适配性,10分为满分):

品牌销售自动化客户管理销售预测订单管理财务集成外勤管理总分
超兔一体云101091010958
Zendesk Sell99887950
钉钉CRM899871051
Insightly77665536
Nimble56555531
Capsule CRM66555532

二、分领域深度对比:从流程到场景的细节差异

1. 销售自动化:从“流程标准化”到“场景适配性”

销售自动化的核心是减少手动操作,让销售聚焦高价值环节。不同产品的差异体现在“线索处理精度”“跟单模型适配性”“行动记录自动化”三个维度:

(1)核心能力对比表

品牌线索自动处理跟单模型覆盖自动行动记录任务提醒机制
超兔一体云多渠道查重/归属地/分配(百度/抖音/微信)小单(三一客)/中长单(商机)/复杂项目(多方协同)外勤拜访/电话录音AI/日报自动生成精确时间 + 多方式提醒(下次沟通/任务节点)
Zendesk Sell线索分配 + 邮件序列模板标准销售漏斗(线索 - 商机 - 成交)原生拨号 + 通话内容自动记录任务触发器(自动分配/提醒)
钉钉CRM线索分配模板 + 自动提醒线索 - 商机 - 合同标准流程拜访日志自动生成(签到联动)自动化任务提醒(流程节点)
Insightly线索 - 商机全链路跟踪项目型流程(线索 - 报价 - 合同 - 交付)交往历史自动追踪工作流自动提醒
Nimble未明确轻量化流程未明确基础提醒
Capsule CRM未明确轻量化流程(批量邮件)未明确基础提醒

(2)场景拆解:超兔的“全场景适配” vs Zendesk的“客服联动”

  • 超兔一体云:针对中小企业常见的“小单快打、中长单跟进、复杂项目协同”三类场景,提供定制化跟单模型——

    • 小单快单用“三一客模型”(定性:客户需求强度;定级:购买能力;定量:成交概率),统一老板与销售的客户判断标准;
    • 中长单用“商机模型”(按阶段/预期成交日期评估进展);
    • 复杂项目用“多方项目模型”(团队协同 + 里程碑管理)。 同时,行动记录全自动化:外勤拜访自动定位、电话录音自动转文字并提取要点,彻底解放销售的“记录负担”。
  • Zendesk Sell:优势在于客服与销售数据联动——销售可直接查看客户的服务历史(如投诉记录、售后需求),调整跟进策略;邮件序列模板支持批量个性化发送,适合快消、电商等高频触客场景。

(3)超兔销售自动化流程Mermaid图

暂时无法在飞书文档外展示此内容

2. 客户管理:从“信息存储”到“价值挖掘”

客户管理的本质是将分散的客户数据转化为可行动的 insights,核心差异体现在“信息完整性”“价值分析深度”“权限管控精度”:

(1)核心能力对比表

品牌客户信息整合价值分析模型生命周期管理权限管控
超兔一体云多渠道新建 + 工商/天眼查补全三一客 + RFM(最近/频率/金额)客池分类(潜在/需求/签约/复购)全局自动权限(上级管下级/财务受限)
Zendesk Sell360°视图(销售 + 客服数据)客户位置 + 外部评价未明确基础角色权限
钉钉CRM集中档案 + 自定义字段智能标签 + 行为画像公海池(防流失)钉钉生态权限(部门/角色)
Insightly项目型客户跟踪(销售 - 交付)未明确未明确基础权限
Nimble联系人管理 + 社交聆听未明确未明确基础权限
Capsule CRM单一视图 + 互动跟踪未明确未明确基础权限

(2)场景拆解:超兔的“深度价值挖掘” vs 钉钉的“协同防流失”

  • 超兔一体云:解决了中小企业“客户信息分散、价值判断不统一”的痛点——

    • 信息整合:支持手机通讯录、拍名片、微信、批量导入等6种方式新建客户,自动补全工商信息、天眼查风险、微信头像昵称,避免“信息孤岛”;
    • 价值分析:通过“三一客”(老板与销售统一客户判断标准) + “RFM模型”(识别“重要价值客户”“重要发展客户”),精准定位高价值客户;
    • 权限管控:全局自动权限机制(上级管理下级、同级隔离、财务仅看财务数据),彻底解决“客户信息泄露”问题。
  • 钉钉CRM:优势在于协同生态——打通钉钉服务窗、客户群,实现销售与客服的沟通协同;公海池功能避免客户资源流失(某快消品牌用后客户流失率降低18%)。

(3)客户管理能力Mermaid脑图

暂时无法在飞书文档外展示此内容

3. 销售预测:从“经验判断”到“数据驱动”

销售预测的核心是用数据降低“拍脑袋”的风险,差异体现在“数据来源的丰富度”“预测模型的精准度”:

(1)核心能力对比表

品牌数据来源预测模型准确率
超兔一体云历史订单 + 机会阶段 + 客户行为机会阶段评估 + RFM + 市场活动未明确,但支持多维度交叉验证
Zendesk Sell销售漏斗 + 商机阶段智能列表 + 成交概率分析未明确
钉钉CRM历史数据 + 销售管道机器学习模型85%(官方案例)
Insightly报表数据基础分析未明确
Nimble未明确未明确未明确
Capsule CRM未明确未明确未明确

(2)场景拆解:超兔的“多维度交叉验证” vs 钉钉的“机器学习”

  • 超兔一体云:销售预测不是“单一数据的堆砌”,而是多维度数据的交叉验证——

    • 历史数据:分析过去12个月的订单量、客户复购率、产品热销周期;
    • 机会阶段:按商机的“初期沟通→立项评估→需求分析→商务谈判”阶段,评估成交概率;
    • 客户行为:跟踪客户的咨询频率、浏览记录、购买金额变化,预判需求。 例如,某商贸企业用超兔预测“Q4热销产品”,结合历史数据(去年Q4的批发订单) + 机会阶段(当前20个商机处于“商务谈判”) + 客户行为(最近30天有15个客户咨询该产品),预测准确率提升至80%。
  • 钉钉CRM:依托阿里的机器学习算法,结合“销售管道健康度”(如商机数量、阶段转化率) + “历史成交数据”,预测未来3个月的销售额,某制造业客户用后预测准确率达85%。

4. 订单管理:从“流程跟踪”到“风险管控”

订单管理的核心是实现“单 - 货 - 款 - 票”的全链路闭环,差异体现在“订单模型适配性”“执行过程管控”“财务风险防范”:

(1)核心能力对比表

品牌订单模型支持执行过程管控财务风险防范
超兔一体云标准/批发/非标/套餐/租赁等锁库→采购→直发→售后应收触发 + 信用控制 + 超发预警
Zendesk Sell自定义审批流程移动端状态同步需集成财务系统
钉钉CRM全流程追踪 + 批量处理ERP对接(部分版本)未明确
Insightly未明确未明确未明确
Nimble物流订单可视化未明确未明确
Capsule CRM未明确未明确未明确

(2)场景拆解:超兔的“全链路闭环” vs Zendesk的“自定义审批”

  • 超兔一体云:覆盖中小企业90%以上的订单场景——

    • 模型适配:支持标准订单、批发订单、非标定制(如设备改造)、套餐订单(如软件 + 服务)、租赁订单(如设备租赁)等10 + 种模型;
    • 执行管控:订单生成后自动锁库,根据库存情况生成采购计划,支持供应商直发(直接对接供应商系统,减少中间环节);
    • 风险防范:设置“应收触发规则”(如发货后自动触发应收),支持多期拆分(如分3期付款,自动计算每期金额),并根据客户信用度控制发货(如信用低于60分,禁止超发)。
  • Zendesk Sell:优势在于自定义审批流程——按订单金额(如超过10万需总经理审批)、客户等级(如新客户需财务审核)设置多级审批节点,适合需要严格内控的企业。

5. 财务集成:从“数据同步”到“业财一体”

财务集成的本质是解决“业务数据与财务数据割裂”的痛点,差异体现在“凭证生成自动化”“业财链路可回溯”:

(1)核心能力对比表

品牌凭证生成方式业财联动能力系统对接
超兔一体云一键读取业务数据 + 自动生成应收 - 开票 - 回款三角联动柠檬云财务(一键推送)
Zendesk Sell集成第三方工具(如QuickBooks)订单 - 回款同步Zendesk Marketplace
钉钉CRMAPI对接第三方财务系统未明确钉钉生态(如钉钉财务)
Insightly未明确未明确未明确
Nimble未明确未明确未明确
Capsule CRM未明确未明确未明确

(2)场景拆解:超兔的“业财全链路回溯” vs 传统业财一体的“痛点解决”

传统业财一体软件的痛点是“无法回溯整单的业务逻辑”——比如财务要查某笔凭证对应的订单、发货、回款记录,需要翻多个系统。超兔一体云解决了这一问题:

  • 凭证智能生成:一键读取CRM中的出库、入库、回款、开票数据,自动关联“货 - 款 - 票”信息,生成可视化凭证预览(支持修改会计科目与金额);
  • 业财联动:实现“应收 - 开票 - 回款”的三角联动——比如订单发货后自动触发应收,开票后关联应收,回款后自动冲减应收,且支持“一票对多单”“一笔对多单”,彻底解决“对账难”的问题;
  • 系统对接:与柠檬云财务平台深度集成,凭证经借贷平衡校验后一键推送,财务人员无需手动录入,记账效率提升60%。

6. 外勤管理:从“打卡记录”到“价值输出”

外勤管理的核心是让外勤动作“可跟踪、可分析” ,差异体现在“签到真实性”“记录完整性”“差旅全流程”:

(1)核心能力对比表

品牌考勤签到拜访记录任务跟踪差旅管理
超兔一体云500米内客户处签到语音 + 定位 + 照片/录像任务分配 + 进度跟踪申请→借支→报销全流程
Zendesk Sell移动端打卡实时上传拜访记录未明确未明确
钉钉CRM签到 + 日程联动自动生成拜访日志未明确未明确
Insightly未明确未明确未明确未明确
Nimble未明确未明确未明确未明确
Capsule CRM未明确未明确未明确未明确

(2)场景拆解:超兔的“深度外勤管理” vs 钉钉的“生态联动”

  • 超兔一体云:针对“外勤人员造假、记录不全”的痛点,设计了强约束 + 高便捷的外勤功能——

    • 签到真实性:要求外勤人员在“客户位置500米内”签到,避免“代签”或“虚假签到”;
    • 拜访记录:通过“快行动”功能,支持语音输入拜访内容(自动转文字)、添加定位、上传照片或录像,全面且真实地记录拜访情况,方便后续分析和总结。
    • 任务跟踪:管理者可通过系统向外勤人员分配任务,并实时跟踪任务执行进度,确保任务按时完成。例如,设置任务的截止时间后,系统在临近截止时间时自动提醒外勤人员。
    • 差旅管理:支持外勤人员进行差旅申请、借支和报销的全流程操作。系统自动关联差旅任务和费用报销,方便企业进行费用管理和控制。例如,外勤人员在出差过程中记录费用信息,回到公司后可通过系统提交报销申请,审批通过后即可完成报销流程。
  • 钉钉CRM:优势在于生态联动,集成钉钉签到、日程功能,实时记录外勤人员位置与客户拜访情况。
  • (注:文中功能相关描述均基于公开披露信息,具体功能服务与价格以厂商实际落地版本为准。)

公司考核 Wi-Fi 联网时间,但是看起来 Wi-Fi 自己会莫名奇妙的断。。。

有什么方式可以加个播报提醒?

我有尝试快捷指令,但是略微卡在设置生效时间上(以及语音播报的声音还是有些小)

之前一直发的公开帖子,不看好后市,虽然有蛮多人教我做人,不过目前也慢慢验证我的剧本了,六七万的大饼不远了,我的预期是 6.8W-7.1W 左右会继续入手一个 BTC ,如果再往下,极端情况腰斩到 5 万以下,会 DK (不建议任何人 DK )继续入手一个 BTC ,在不影响生活的情况下,三个 BTC 已经是极限了,死拿拿住到 17-20w 的大饼,这个帖子我也做好了被喷的打算,只能说到了自己的预期价位就入手,接受所有的污言秽语(反弹反弹反弹),这个帖子不会回复任何人,后续会在第三次考虑入手的时候再发帖,(有人也许认为是装逼,其实压根没买,这个你开心就好)其他情况都在记事本记录自己的猜想与心得,希望未来能给未来的女儿、儿子存一个 BTC 作为他们的成年礼。此贴只为记录,写的有点乱,让大家见笑了,最后祝大家春节快乐~ (无任何投资建议,请远离)

我家的 AI Agent (OpenClaw) 给我开发了个网站,从开发到上线全程 30 分钟左右。

网站链接: https://daily-design.pomodiary.com

## 这是什么?

一个设计日报网站。每天 5 分钟,看完设计圈今日热点。

内容来源:
- Hacker News 热榜
- Dribbble 热门作品
- Awwwards 获奖网站
- Product Hunt 新产品
- 设计 Twitter 精选

一页搞定,不用到处翻。

## 亮点

- 网站是 OpenClaw 自己写的代码
- 内容是他自己抓取和整理的
- 未来会每天自动更新一份日报

基本上我就跟他说了句给我做个设计日报网站,然后他就开始 Next.js + Tailwind 一顿操作,半小时后网站就上线了。

## 关于 OpenClaw

OpenClaw 是一个开源的 AI Agent 网关,可以让 Claude 等大模型连接到你的各种服务 (Telegram, WhatsApp, 浏览器, 文件系统等),变成一个真正能干活的 Agent 。

GitHub: https://github.com/nicepkg/openclaw

---

欢迎体验,有建议随时反馈~

2 友们 2025 年有发现什么宝藏音乐吗?值得单曲循环的宝藏音乐~

想象一下,你正在开发一个大型Web应用。营销团队想要用Astro构建他们的页面以获得最佳的SEO效果,而产品团队却坚持要用React来构建功能丰富的后台管理系统。更糟糕的是,每次发布新版本时,十几个团队的代码都需要一起打包、一起测试、一起上线——只要其中一个团队引入了一个bug,整个发布就要回滚。这种"一荣俱荣、一损俱损"的耦合方式,是不是让你感到无比头疼?

或者,你的公司刚刚收购了一个创业公司,他们的产品是用Vue写的,而你们的主站是用React写的。你想把他们的功能整合进来,但又不希望把两个完全不同的代码库强行混在一起。

这些都是现代Web开发中真实存在的难题。传统的微前端架构通常是"水平"的——同一个页面上的不同组件来自不同的服务。但如果有一种方式,能让每个团队完全独立地开发、部署和维护自己的功能模块,而用户却感觉在使用一个无缝的、统一的应用呢?

这就是垂直微前端(Vertical Microfrontends)要解决的问题。现在,Cloudflare推出了一款全新的Worker模板,让这种架构变得前所未有的简单。

什么是垂直微前端?

垂直微前端是一种架构模式,单个独立团队拥有应用程序功能的完整切片,从用户界面一直到底层的CI/CD流水线。这些切片通过域名上的路径来定义,你可以将各个独立的Worker与特定路径关联起来:

/      = 营销网站
/docs  = 文档
/blog  = 博客
/dash  = 仪表盘

我们还可以进一步细化,在更细粒度的子路径上关联不同的Worker。比如在仪表盘中,你可能通过各种功能或产品来划分URL路径的深度(例如 /dash/product-a),在两个产品之间导航可能意味着两个完全不同的代码库。

现在有了垂直微前端,我们还可以这样设计:

/dash/product-a  = WorkerA
/dash/product-b  = WorkerB

上面的每个路径都是独立的前端项目,它们之间没有任何共享代码。product-aproduct-b 路由映射到分别部署的前端应用,它们有自己的框架、库、CI/CD流水线,由各自的团队定义和拥有。

你可以端到端地拥有自己的代码。但现在我们需要找到一种方法将这些独立的项目缝合在一起,更重要的是,让它们感觉像是一个统一的体验。

Cloudflare自己也在经历这个痛点,因为仪表盘有许多独立的团队负责各自的产品。团队必须面对一个事实:在他们控制范围之外所做的更改会影响用户对其产品的体验。

在内部,我们现在对自己的仪表盘也采用了类似的策略。当用户从核心仪表盘导航到我们的ZeroTrust产品时,实际上它们是两个完全独立的项目,用户只是通过路径 /:accountId/one 被路由到那个项目。

视觉上的统一体验

将这些独立项目缝合在一起,让它们感觉像一个统一的体验,并没有你想象的那么困难:只需要几行CSS魔法。我们绝对不希望发生的事情是将我们的实现细节和内部决策泄露给用户。如果我们无法让这个用户体验感觉像一个统一的前端,那我们就对用户犯下了严重的错误。

要实现这种巧妙的手法,让我们先了解一下视图过渡和文档预加载是如何发挥作用的。

视图过渡

当我们想要在两个不同页面之间无缝导航,同时让最终用户感觉流畅时,视图过渡非常有用。在页面上定义特定的DOM元素,让它们一直保留到下一页可见,并定义任何变化的处理方式,这成为了多页应用的强大缝合工具。

然而,在某些情况下,让各个垂直微前端感觉不同也是完全可以接受的。比如我们的营销网站、文档和仪表盘,它们各自都有独特的定义。用户不会期望这三者在导航时都感觉统一。但是……如果你决定在单个体验中引入垂直切片(例如 /dash/product-a/dash/product-b),那么用户绝对不应该知道它们底层是两个不同的仓库/Worker/项目。

好了,说得够多了——让我们开始动手吧。我说过让两个独立的项目对用户来说感觉像是一个是低成本的,如果你还没有听说过CSS视图过渡,那么接下来我要让你大开眼界了。

如果我告诉你,你可以在单页应用(SPA)或多页应用(MPA)的不同视图之间创建动画过渡,让它们感觉像是一个整体?在添加任何视图过渡之前,如果我们导航属于两个不同Worker的页面,中间加载状态会是浏览器中的白色空白屏幕,持续几百毫秒,直到下一页开始渲染。页面不会感觉统一,当然也不会像单页应用。

如果希望元素保留,而不是看到白色空白页,我们可以通过定义CSS视图过渡来实现。通过下面的代码,我们告诉当前文档页面,当视图过渡事件即将发生时,将nav DOM元素保留在屏幕上,如果现有页面和目标页面之间存在任何外观差异,我们将使用ease-in-out过渡来动画展示。

突然之间,两个不同的Worker感觉就像一个了。

@supports (view-transition-name: none) {
  ::view-transition-old(root),
  ::view-transition-new(root) {
    animation-duration: 0.3s;
    animation-timing-function: ease-in-out;
  }
  nav { view-transition-name: navigation; }
}

预加载

在两个页面之间过渡让它"看起来"无缝——我们还希望它"感觉"像客户端SPA一样即时。虽然目前Firefox和Safari不支持Speculation Rules,但Chrome/Edge/Opera确实支持这个较新的API。Speculation Rules API旨在提高未来导航的性能,特别是对于文档URL,让多页应用感觉更像单页应用。

分解成代码,我们需要定义一个特定格式的脚本规则,告诉支持的浏览器如何预取与我们Web应用程序连接的其他垂直切片——可能通过某些共享导航链接。

<script type="speculationrules">
  {
    "prefetch": [
      {
        "urls": ["https://product-a.com", "https://product-b.com"],
        "requires": ["anonymous-client-ip-when-cross-origin"],
        "referrer_policy": "no-referrer"
      }
    ]
  }
</script>

有了这些,我们的应用程序会预取其他微前端并将它们保留在内存缓存中,所以如果我们导航到那些页面,会感觉几乎是即时的。

对于明显可区分的垂直切片(营销、文档、仪表盘),你可能不需要这样做,因为用户在它们之间导航时会预期有轻微的加载。然而,当垂直切片定义在特定可见体验内时(例如在仪表盘页面中),强烈建议使用。

通过视图过渡和推测规则,我们能够将完全不同的代码仓库联系在一起,感觉就像它们来自单页应用一样。如果你问我,这太神奇了。

零配置请求路由

现在我们需要一种机制来托管多个应用程序,以及一种在请求流入时将它们缝合在一起的方法。定义一个Cloudflare Worker作为"路由器",允许在边缘的单个逻辑点处理网络请求,然后将它们转发给负责该URL路径的垂直微前端。而且我们可以将单个域名映射到该路由器Worker,其余的就"正常工作"了。

服务绑定

如果你还没有探索过Cloudflare Worker服务绑定,那么值得花点时间了解一下。

服务绑定允许一个Worker调用另一个Worker,而无需经过公开可访问的URL。服务绑定允许Worker A调用Worker B上的方法,或将请求从Worker A转发到Worker。进一步分解,路由器Worker可以调用已定义的每个垂直微前端Worker(例如营销、文档、仪表盘),假设它们都是Cloudflare Workers。

这为什么重要?这正是将这些垂直切片"缝合"在一起的机制。我们将在下一节深入探讨请求路由如何处理流量分割。但要定义这些微前端中的每一个,我们需要更新路由器Worker的wrangler定义,这样它就知道允许调用哪些前端。

{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "name": "router",
  "main": "./src/router.js",
  "services": [
    {
      "binding": "HOME",
      "service": "worker_marketing"
    },
    {
      "binding": "DOCS",
      "service": "worker_docs"
    },
    {
      "binding": "DASH",
      "service": "worker_dash"
    }
  ]
}

上面的示例定义在我们的路由器Worker中,然后告诉我们被允许向三个独立的额外Worker(营销、文档和仪表盘)发出请求。授予权限就这么简单,但让我们深入研究一些更复杂的逻辑,包括请求路由和HTML重写网络响应。

请求路由

了解了在需要时可以调用的各种其他Worker之后,现在我们需要一些逻辑来确定何时将网络请求定向到哪里。由于路由器Worker被分配到我们的自定义域名,所有传入的请求首先在网络边缘到达它。然后它确定哪个Worker应该处理请求,并管理结果响应。

第一步是将URL路径映射到关联的Worker。当收到某个请求URL时,我们需要知道它需要被转发到哪里。我们通过定义规则来实现这一点。虽然我们支持通配符路由、动态路径和参数约束,但我们将专注于基础——字面路径前缀——因为它更清楚地说明了要点。

在这个例子中,我们有三个微前端:

/      = 营销
/docs  = 文档
/dash  = 仪表盘

上面的每个路径都需要映射到一个实际的Worker(参见上面章节中的wrangler服务定义)。对于我们的路由器Worker,我们定义一个额外的变量,包含以下数据,这样我们就知道哪些路径应该映射到哪些服务绑定。现在我们知道当请求进来时应该将用户路由到哪里!定义一个名为ROUTES的wrangler变量,内容如下:

{
  "routes": [
    {"binding": "HOME", "path": "/"},
    {"binding": "DOCS", "path": "/docs"},
    {"binding": "DASH", "path": "/dash"}
  ]
}

让我们设想一个用户访问我们网站的路径 /docs/installation。在底层,发生的情况是请求首先到达我们的路由器Worker,它负责了解什么URL路径映射到哪个独立的Worker。它理解 /docs 路径前缀映射到我们的 DOCS 服务绑定,参照我们的wrangler文件指向我们的 worker_docs 项目。我们的路由器Worker知道 /docs 被定义为垂直微前端路由,从路径中移除 /docs 前缀,将请求转发给我们的 worker_docs Worker来处理请求,然后最终返回我们得到的任何响应。

为什么要删除 /docs 路径呢?这是一个实现细节的选择,目的是当Worker通过路由器Worker访问时,它可以清理URL来处理请求,就像它是从路由器Worker外部调用的一样。像任何Cloudflare Worker一样,我们的 worker_docs 服务可能有自己的独立URL可以访问。我们决定希望该服务URL继续独立工作。当它附加到我们的新路由器Worker时,它会自动处理移除前缀,这样服务就可以从自己定义的URL或通过我们的路由器Worker访问……任何地方都可以,无所谓。

HTMLRewriter

用URL路径分割我们的各种前端服务(例如 /docs/dash)让我们很容易转发请求,但当我们的响应包含不知道它被通过路径组件反向代理的HTML时……嗯,这就会出问题。

假设我们的文档网站在响应中有一个图片标签 <img src="./logo.png" />。如果我们的用户正在访问页面 https://website.com/docs/,那么加载 logo.png 文件可能会失败,因为我们的 /docs 路径只是由我们的路由器Worker人为定义的。

只有当我们的服务通过路由器Worker访问时,我们才需要对一些绝对路径进行HTML重写,这样我们返回的浏览器响应才能引用有效的资源。实际上发生的是,当请求通过我们的路由器Worker时,我们将请求传递给正确的服务绑定,并从中接收响应。在将其传回客户端之前,我们有机会重写DOM——所以在看到绝对路径的地方,我们继续用代理路径预先填充它。以前我们的HTML返回的图片标签是 <img src="./logo.png" />,现在我们修改为在返回客户端浏览器之前 <img src="./docs/logo.png" />

让我们回到CSS视图过渡和文档预加载的魔法。我们当然可以把那段代码手动放到我们的项目中并让它工作,但这个路由器Worker也会使用HTMLRewriter自动为我们处理这些逻辑。

在你的路由器Worker ROUTES 变量中,如果你在根级别设置 smoothTransitionstrue,那么CSS过渡视图代码会自动添加。此外,如果你在路由中设置 preload 键为 true,那么该路由的推测规则脚本代码也会自动添加。

下面是两者结合使用的示例:

{
  "smoothTransitions": true,
  "routes": [
    {"binding": "APP1", "path": "/app1", "preload": true},
    {"binding": "APP2", "path": "/app2", "preload": true}
  ]
}

开始使用

你今天就可以开始使用垂直微前端模板构建了。

访问Cloudflare仪表盘的链接,或者进入"Workers & Pages"并点击"创建应用程序"按钮开始。从那里,点击"选择模板"然后"创建微前端",你就可以开始配置你的设置了。

更多使用指南,可以点击查看文档 ,如果您对各种云原生架构的内容感兴趣,也可以关注我的博客:程序猿DD,第一时间获得干货更新。

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

在线运行 TVM 学习教程

链接是:https://hyper.ai/notebooks/48919?utm_source=Distribute&utm_me...

本文档面向希望了解 TVM 框架如何与特定设备 API 进行交互的开发者,或希望为新的 API 或新硬件添加支持的开发者。

对于任何新的运行时环境,需要实现三个主要部分:

  • DeviceAPI <tvm-target-specific-device-api>{.interpreted-text role="ref"} 类提供对特定设备的句柄,以及用于与其交互的 API。它定义了一套通用接口,用于查询设备参数(例如:可用内存、线程数量等),以及执行简单操作(例如:从主机复制内存,或在设备缓冲区之间复制数据)。
  • Target <tvm-target-specific-target>{.interpreted-text role="ref"} 类包含将要运行函数的设备描述。它同时暴露给目标代码生成器和优化 Pass。
  • 目标代码生成器 <tvm-target-specific-codegen>{.interpreted-text role="ref"} 从 IRModule 构建一个由一个或多个 PackedFunc <tvm-runtime-system-packed-func>{.interpreted-text role="ref"} 组成的 Module <tvm-runtime-system-module>{.interpreted-text role="ref"}。

DeviceAPI

DeviceAPI(设备 API)表示对特定硬件设备 API 的访问句柄。(例如,CUDADeviceAPI 处理所有通过 CUDA 框架的交互。)大多数 DeviceAPI 方法都接受一个 device_id 参数,用于指定访问哪个设备。

在 Python 中,通常使用 tvm.runtime.device{.interpreted-text role="py:func"} 函数访问特定设备,该函数返回指定 API 所访问设备的句柄。(例如,tvm.runtime.device('cuda', 0) 表示访问通过 CUDA API 访问的物理设备 0。)

  • 属性查询 — GetAttr 用于查询不同的设备特定参数,例如设备名称、线程数量等。可查询的参数定义在 enum DeviceAttrKind,文件位置: device_api.h。 并非所有参数都适用于所有设备。如果某个参数无法查询(例如 Vulkan 上的 kMaxClockRate),或不适用(例如 CPU 上的 kWarpSize),应返回 nullptr
  • 设置活动设备 — SetDevice 应将某个设备设置为当前活动设备。如果目标代码生成器生成的 PackedFunc 需要在设备上执行,该执行应发生在当前活动设备上。
  • 内存管理 — 用于在设备上分配和释放内存的工具函数。
    • 分配数据空间 — AllocDataSpace 和 FreeDataSpace 用于在设备上分配和释放数据存储空间。这些空间可作为算子输入和输出,并构成算子图的主要数据流。必须支持主机与数据空间之间的数据传输。返回值为不透明指针 void*。某些实现返回真实地址,但这不是必须的,该指针也可能是仅可由设备后端解释的句柄。该 void* 将作为参数传递给其他后端函数(例如 CopyDataFromTo)。
    • 分配工作空间 — AllocWorkspace 和 FreeWorkspace 用于分配和释放工作区。这些区域用于算子内部中间值存储,不要求可与主机传输。如果子类未实现,则默认调用对应的数据空间分配函数。
    • 数据复制 — CopyDataFromTo 应在不同位置之间复制数据。复制类型由 dev_from 和 dev_to 决定。实现应该支持将内存从CPU复制到设备,从设备复制到CPU,以及在单个设备上从一个缓冲区复制到另一个缓冲区。如果源或目标位于 CPU,则指针为可直接用于 memcpy 的主机地址;如果位于设备,则指针必定由 AllocDataSpace 或 AllocWorkspace 生成。
      这些复制会排队在某个 TVMStreamHandle 流中执行。但是实现不应假设 CPU 缓冲区在函数返回后仍然有效或可访问。
  • 执行流管理 — 管理 TVMStreamHandle(执行命令的并行流)。
    • 创建流 — CreateStream / FreeStream 负责分配和释放执行流。如果设备只有单一指令队列,则 CreateStream 应返回 nullptr
    • 设置活动流 — SetStream 用于将某个流设置为当前活跃流。目标代码生成器生成的函数执行时应提交到该流。
    • 同步到 CPU — StreamSync 应同步流,使之在执行完成前阻塞返回。
    • 流间同步 — SyncStreamFromTo 应在两个流之间插入同步屏障,使目标流在源流执行完当前排队命令前无法继续执行。

为了使 TVM 能够使用新的 DeviceAPI,需要执行以下注册步骤:

  1. 创建一个实例化 DeviceAPI 并返回其指针的函数:
FooDeviceAPI* FooDeviceAPI::Global() {
  static FooDeviceAPI inst;
  return &inst;
}
  1. 在 TVM 注册表中注册:
TVM_FFI_STATIC_INIT_BLOCK() {
  namespace refl = tvm::ffi::reflection;
  refl::GlobalDef().def("device_api.foo", FooDeviceAPI::Global);
}
  1. 在 base.h 的 TVMDeviceExtType 枚举中为新的 DeviceAPI 添加条目。值需大于 DLDeviceType::kDLExtDev,且小于 DeviceAPIManager::kMaxDeviceAPI
  2. 在 device_api.h 的 DeviceName 中添加对应枚举 → 字符串映射,该字符串需与 GlobalDef().def 中一致。
  3. 在 tvm.runtime.Device的 _DEVICE_TYPE_TO_NAME 与 _DEVICE_NAME_TO_TYPE 字典中添加对应映射。

Target 定义

Target 对象是有关物理设备、其硬件/驱动限制和能力的属性查询表。Target 可在优化阶段和代码生成阶段使用。虽然所有运行时共享相同的 Target 类,但不同运行时可能需要额外的 target 特定属性。

在 target_kind.cc 中使用 TVM_REGISTER_TARGET_KIND 注册新的 target,需传入 target 名称,以及对应运行设备的 TVMDeviceExtType 或 DLDeviceType。通常情况下,target 名称和设备名称一致(如 "cuda" 运行于 kDLCUDA),但也有例外(例如 "llvm" 与 "c" 目标都运行于 kDLCPU)。

所有 target 选项通过 add_attr_option 添加,可带默认值。可以使用 set_target_parser 添加解析器,用于处理依赖其他参数或硬件属性的动态参数。

该参数解析器定义了如何从字符串格式构造 target。这由 Target::Target(const String&) 构造函数执行,该构造函数接受 JSON 格式字符串,通常通过 Python:

tvm.target.Target('{"kind": "cuda", "max_num_threads": 1024}')

在代码生成器中,可通过以下方式访问 target 属性:

  • C++:target->GetAttr<T>(param_name)
  • Python:target.attrs

Target 代码生成器

代码生成器将优化后的 IRModule 转换为可执行表示。每个代码生成器必须注册到 TVM 框架中,其名称为:

"target.build.foo"

其中 foo 与先前 TVM_REGISTER_TARGET_KIND 中的名称一致。

示例:

tvm::runtime::Module GeneratorFooCode(IRModule mod, Target target);
TVM_FFI_STATIC_INIT_BLOCK() {
  namespace refl = tvm::ffi::reflection;
  refl::GlobalDef().def("target.build.foo", GeneratorFooCode);
}

代码生成器有两个参数。第一个是要编译的IRModule,第二个是描述代码应该运行在哪个设备上的目标 Target。由于编译环境不一定与执行环境相同,因此代码生成器不应直接向设备查询属性,而应始终使用 Target 中的属性。

输入 IRModule 中的每个函数都应在输出的 runtime::Module 中可通过名称访问。

📖 前言

最近要学 Java,第一步就是装 JDK。

打开 Oracle 官网一看,下载 JDK 11 需要注册账号,注册页面还要填公司信息。好不容易填完,下载速度几 KB/s,一个 100 多 MB 的文件要下大半天。

后来发现国内有镜像站点,下载速度快多了。今天把完整步骤写下来,帮有需要的同学快速搞定。

这套方法在几台电脑上都试过,十分钟内完成安装。

🔧 前置准备

系统要求:

  • Windows 7/8/10/11(64位)
  • 至少 500MB 空闲硬盘空间

下载 JDK 11:

网盘下载(下载快):https://pan.quark.cn/s/7186f4aa4c10

📝 详细步骤

步骤一:下载 JDK 11

下载地址:

网盘下载(推荐):

网盘下载(下载快):https://pan.quark.cn/s/7186f4aa4c10

官网下载(备选):

或者去 Adoptium 官网

小提示:

  • .msi 安装版安装简单,推荐新手用
  • .zip 免安装版适合多版本共存
  • 下载完成后是类似 OpenJDK11U-jdk_x64_windows_hotspot_11.0.xx_xxx.msi 的文件

步骤二:安装 JDK

双击 .msi 文件:

  1. 点"下一步"
  2. 选安装路径

    • 默认是 C:\Program Files\Eclipse Adoptium\jdk-11.x.xx.x-hotspot\
    • 我一般改成 D:\Java\jdk-11\(好管理,不占 C 盘)

路径别带中文或特殊字符,不然可能出问题。

  1. 点"安装",等几分钟
  2. 安装完点"完成"

安装向导
图3:JDK 安装过程

到这步,JDK 已经装好了。


步骤三:配置环境变量

这步是关键,让系统能识别 Java 命令。

1. 打开环境变量

方法一(快):

  • Win + R,输入 sysdm.cpl,回车
  • 点"高级" → "环境变量"

方法二:

  • 右键"此电脑" → "属性"
  • 点"高级系统设置" → "环境变量"

2. 配置 JAVA_HOME

在"系统变量"那块(注意是系统变量,不是用户变量):

  1. 点"新建"
  2. 变量名:JAVA_HOME
  3. 变量值:你的 JDK 安装目录

    D:\Java\jdk-11\
  4. 点"确定"

配置 JAVA_HOME
图4:新建 JAVA_HOME 环境变量

3. 配置 Path

  1. 在"系统变量"里找到 Path
  2. 选中,点"编辑"
  3. 点"新建",加两行:

    %JAVA_HOME%\bin
    %JAVA_HOME%\jre\bin
  4. 把这两行拖到最上面(优先级最高)
  5. 点"确定"保存

配置 Path
图5:编辑 Path 环境变量

注意:

  • Win10/11 用"新建"按钮添加就行
  • 老版本 Win 要手动在变量值末尾加,用分号隔开
  • 电脑上装过其他 JDK?把新版本移到最上面

步骤四:验证安装

打开 CMD 测试一下:

打开 CMD:

  • Win + R,输入 cmd,回车

输入:

java -version

成功了会显示类似:

java version "11.0.xx" 202x-xx-xx LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.xx+xx-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.xx+xx-LTS, mixed mode)

验证成功
图6:成功安装后的版本信息

再测一下编译器:

javac -version

输出:

javac 11.0.xx

看到这个,JDK 11 就装好了。


步骤五:写个 Hello World(可选)

跑个程序测试环境:

  1. 新建文本文件,改名 HelloWorld.java
  2. 用记事本打开,写入:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, JDK 11!");
    }
}
  1. 保存
  2. CMD 进入文件所在目录
  3. 编译:

    javac HelloWorld.java
  4. 运行:

    java HelloWorld

输出 Hello, JDK 11! 就说明环境完全正常。

❓ 常见问题

几个新手常遇到的问题:

Q1: java -version 提示"不是内部或外部命令"?

A: 环境变量没配好。

解决方法:

  1. 检查 JAVA_HOME 路径对不对
  2. Path 里的 %JAVA_HOME%\bin 有没有
  3. 关掉所有 CMD 窗口,重新打开
  4. 还不行就重启电脑

Q2: 装了多个 JDK 版本,怎么切换?

A: 调整 Path 里变量的顺序。

方法:

  1. 编辑 Path 环境变量
  2. 把要用的版本移到最上面
  3. 重开 CMD 验证

小技巧:可以给不同版本配不同的 JAVA_HOME,比如 JAVA_HOME8JAVA_HOME11,切换时改 Path 引用的变量就行。


Q3: Win11 配置了还是提示找不到 java?

A: Win11 有时要在用户变量里单独配一遍。

方法:

  1. 在"用户变量"也加个 JAVA_HOME
  2. 在"用户变量"的 Path 也加 %JAVA_HOME%\bin
  3. 重启终端或电脑

Q4: 下载还是慢?

A: 换个镜像试试。

推荐顺序:

  1. 清华镜像https://mirrors.tuna.tsinghua.edu.cn/Adoptium/
  2. 华为云https://repo.huaweicloud.com/java/jdk/
  3. Adoptium 官网https://adoptium.net/(国内有 CDN)

Q5: .zip 免安装版怎么用?

A: 解压后配置环境变量就行。

步骤:

  1. 把 .zip 解压到 D:\Java\jdk-11\
  2. 后面环境变量配置跟安装版一样
  3. 好处是多版本共存方便,卸载直接删文件夹

📌 总结

今天装 JDK 11 的步骤:

  1. 从国内镜像快速下载
  2. 运行安装程序
  3. 配置 JAVA_HOMEPath
  4. 验证安装

这套方法的好处:

  • 下载速度快
  • 步骤简单,新手友好

到这步,Java 开发环境就搭好了。

接下来可以:

  • 装个 IDE(IntelliJ IDEA 或 Eclipse)
  • 学 Java 基础语法
  • 写第一个 Java 项目

遇到问题?

  • 检查环境变量配置
  • 确认 JDK 安装路径
  • 评论区交流

🔗 参考来源


过去,代理工具的主要作用是帮助用户突破地域限制或隐藏真实 IP。那是一个相对粗放的阶段,网络系统更多依赖静态规则进行判断,只要更换出口地址,很多限制就可以被绕过。然而到了 2026 年,这种逻辑已经彻底失效。
如今的网络环境更像是一个动态评估系统。访问行为不再只看你来自哪里,而是综合分析你是谁、你是否像一个真实用户、你的连接是否符合正常网络模式。IP 只是其中的一个入口参数,而不是决定性的唯一因素。
在这样的背景下,代理是否“高匿名”,已经不再是技术细节,而是直接影响访问成败的核心条件。

什么是真正意义上的高匿名

很多代理服务在宣传时都会强调“匿名性”,但在实际网络识别体系中,并非所有隐藏 IP 的方式都被视为同等可信。高匿名并不仅仅意味着目标网站无法看到你的真实地址,更重要的是在整个连接链路中,不暴露任何异常代理特征。
真正的高匿名代理,会在协议层、请求头以及连接行为上都尽量贴近普通用户的访问模式。这意味着服务器端无法轻易判断请求是否经过中转,也难以通过流量特征推断出代理的存在。
如果代理只是简单替换出口 IP,却在其他层面留下明显痕迹,那么它在现代风控系统中几乎没有生存空间。

数据中心代理与住宅代理的本质差异

在当前环境下,IP 的来源比 IP 本身更重要。数据中心代理虽然速度快、成本低,但它们的地址段高度集中,长期被大量用户重复使用。这种特征在网络识别系统中非常明显,很容易被标记为“非自然流量”。
相比之下,住宅代理的 IP 来自真实家庭网络,分布更分散,使用行为也更接近普通用户。即使在高频访问或长期连接的场景下,住宅 IP 仍然更容易被视为正常网络活动的一部分。
当“像不像真实用户”成为判断标准时,住宅代理自然比数据中心代理更具优势,而高匿名住宅代理则是在这一基础上的进一步优化。

高匿名住宅代理为何能提升长期稳定性

许多用户在使用普通代理时,都会遇到同一个问题:刚开始可用,但很快失效。这并不是偶然,而是因为网络系统会持续评估连接行为。一旦某个出口被反复识别为异常来源,其可用性就会迅速下降。
高匿名住宅代理的价值,正体现在“不容易被识别”为代理这一点上。由于其 IP 真实性高、使用痕迹分散,单个出口不会因为短期行为而被迅速封禁。
从长期使用角度看,这种稳定性远比短期速度或价格更重要。它减少了频繁更换 IP 的成本,也降低了业务或访问中断的风险。

代理服务质量对匿名性的影响

并非所有住宅代理都天然具备高匿名属性。如果 IP 来源管理混乱、轮换策略不合理,或者同一出口被过度使用,即使是住宅 IP,也可能迅速失去可信度。
高质量的代理服务,通常会在 IP 分配、使用频率和连接行为上进行精细控制。这种控制并不会对用户造成明显感知,但会显著影响外部系统对流量的判断结果。
在实际应用中,一些用户会选择像 IPPeak 这样的住宅代理服务,拥有8000万+住宅IP,正是因为其更接近“长期可用网络环境”的定位,而不是短期突破限制的工具。

总结

高匿名住宅代理的重要性,并不来自某一个单一优势,而是源于现代网络环境的整体变化。当网络开始“理解”你的行为,简单的 IP 替换已经无法满足长期需求。
真正稳定、安全、可持续的访问方式,建立在可信网络身份之上。高匿名住宅代理,正是这一身份的基础组成部分。
在 2026 年之后,这种代理形态只会变得更加普遍,而不会被替代。