首页 文章 精选 留言 我的

精选列表

搜索[告别],共849篇文章
优秀的个人博客,低调大师

告别数据无序:得物数据研发与管理平台的破局之路

一、背景介绍 为什么得物需要自建大数据研发与管理平台? 得物作为一家数据驱动型互联网企业,数据使用的效率、质量、成本,极大影响了公司的商业竞争力。而数据链路上最关键的系统是计算存储引擎和数据研发平台。其中计算存储引擎决定了数据的使用成本,数据研发平台则决定了数据的交付效率、数据质量以及数据架构合理性。 得物数据生产链路 过去整套大数据基础设施我们都使用云上商业化产品(下文简称“云平台”),但在各方面已远无法匹配上得物长期的业务发展。目前得物大数据面临着如下挑战: 因此24年技术部正式启动大数据系统自建,Galaxy数据研发与管理平台为其中一个重要项目,负责面向参与数据生产的用户,提供离线和实时数据的采集同步、研发运维、加工生产、数据资产管理以及安全合规的能力,满足业务长期发展对于数据架构、数据质量、数据交付效率的诉求。 二、产品功能架构 下图为整体产品功能架构,其中蓝色部分为当前已落地功能,灰色部分为规划中的功能。 Galaxy数据研发与管理平台产品功能架构 24年立项开始至今,我们主要专注在4个最核心能力的建设,分别为:数据研发套件、数据架构技术、数据质量技术、智能化数据研发。如果把数据研发平台比喻成一辆汽车,那么这四部分的定位如下图所示: 下文会对这些关键技术实现、落地进展以及Galaxy数据研发平台的架构演进,进行解析。 三、数据建设的“驾驶舱” - 数据研发套件 3.1 系统架构解析 数据研发套件包含数据研发IDE、数据资产系统、离线任务调度系统三部分,在平台中的定位类似于“汽车的驾驶舱”,为数据工程师提供丰富的工具集,控制全公司的数据流动与计算。整体系统架构如下图所示: 3.2 数据同步技术解析 数据同步也叫数据集成,它是Galaxy数据研发平台的核心组件之一,主要用于公司各种异构数据源与数据仓库进行数据传输,打通数据孤岛。它作为大数据链路加工的起点和终点,不仅用于数仓ODS层(Operational Data Store,保存原始数据)的入仓构建,也负责将数仓数据回流(出仓)到消费侧的各种数据源中。 离线数据同步 离线数据同步是最为主流的一种数据同步模式,以批量读写的形式将源表以全量或增量的形式周期性的写入目标表。目前Galaxy数据研发套件支持了多种类型数据源的离线同步,包括: 目前Galaxy数据研发套件的离线同步内核基于Spark Jar进行实现,下图为离线数据同步架构: Galaxy数据研发套件离线数据同步架构 离线数据同步的具体实现执行流程(以MySQL同步至得物自建离线存储系统为例): MySQL离线同步至得物自建离线存储系统的执行流程 实时数据同步 离线数据同步存在着一些局限性,主要有: 对在线数据库压力大,即使是读库也可能影响线上部分业务的稳定性。而如果单独为数据入仓申请一个备库,又会带来较大的额外成本; 大表同步时间长(可达7小时)此类任务基本无法保障下游重要数据产出的SLA; 需要在短时间传输大量数据,对网络带宽依赖高; 数据时效差,最快也是T+H的延迟,无法满足实时报表等对时效性敏感场景的需求。 因此需要实时数据同步的能力对此类场景进行补充。我们主要支持两种实时同步方案: 1)基于业务库binlog的的实时入仓 对比离线数据入仓,基于binlog的实时入仓可以避免对数据库造成压力,减少了对网络带宽的依赖,同时对于超大规模的表可以大幅缩短基线加工时长。但此方案依然需要(小时/天)将增量数据和全量数据做Merge处理和存储,这会产生冗余的计算和存储成本,且时效性也较差,因此本质上只能为离线数仓场景服务。 2)实时镜像同步 通过实时计算引擎Flink CDC将变更数据实时更新到存储系统中,保持数仓ODS表和来源数据库表的增全量同步,整体架构更加简单,并减少ODS层的批计算和冗余存储成本。目前规划通过Paimon、Iceberg等开放Lakehouse能力来实现离线存储系统的实时事务性更新。根据实际业务场景,也可以直接将数据实时写入StarRocks等支持更新的OLAP数据库中。 3.3 数据研发套件任务迁移方案解析 在过去得物的全部数据加工任务全部运行在云上数据平台,因此除了对齐产品能力外,我们还需要将数据加工任务从云平台“平滑”的迁移到Galaxy研发平台。 由于调度系统的故障风险极大,一旦异常很可能由于依赖错乱导致数据异常或停止调度导致的数据产出延迟。因此我们将Galaxy研发套件的平台层迁移和调度层迁移进行解耦,以便将调度系统的迁移节奏放缓。 首先进行风险较低的研发平台层迁移,让业务可以尽快上线,便于优化数据研发流程和数据资产管理能力。此阶段任务的调度依然运行在云平台。之后再进行调度层的迁移,这个阶段用户基本无感,完成后则彻底不再依赖云平台。 因此架构上一套研发平台需要同时适配两套调度系统(云任务调度+Galaxy自研调度系统 ),并支持逐步往自研Galaxy调度的平滑演进。 为了让调度迁移的过程需要如同“数据库主备切换”一样,尽量让用户无感,我们使用了影子节点的方案,以实现迁移流程的业务无感、可灰度、可回滚。影子节点本质是一个Shell任务,当调度系统启动它后,它会通过Rest API检测对方调度系统中实体节点的状态,并与它保持状态同步。通过影子节点,我们可以实现按照任意调度任务id进行灰度迁移,调度迁移本质就是将云平台的实体节点替换为影子节点。如下所示: 基于“影子节点”的双调度互通方案 3.4 功能建设与迁移进展 1)功能对齐与优化 目前Galaxy研发套件已完成与原云数据研发平台的主链路功能对齐,具备数据研发与资产管理的全套流程,同时还针自建Spark引擎查询和运维、在线数据入仓等方面进行定向优化。提效成果: 临时SQL查询性能优化 通过简化调用链路+Spark Driver预启动等查询加速技术,平均每个Query可以比原云数据研发平台固定节约35s+。 减少查询等待时间:290+人日/月 在线数据入仓自动化提效 通过工单申请即可实现MySQL数据入仓。自动帮用户创建同步数据源、增/全量ODS表、同步任务、增量Merge任务,并自动赋权以及数据初始化。根据用户调研和埋点分析,每个数据入仓需求可提效30min+。 提效效果:20+人日/月 2)业务迁移进展 目前我们已完成数据平台、数据挖掘、数据分析团队的全部任务迁移(占得物全域的44%),并完成了算法团队的POC。同时还将上述团队的临时取数业务迁移到了自建Spark引擎,从而实现云上商业版计算引擎的DEV资源缩容400+cu,总计可节省临时取数计算成本约2万+/月。 四、公司数据资产的“底盘”-数据架构技术 目前,公司业务用数越来越敏捷和频繁,而数据资产却没有做到“好找敢用”,大量的重复数据和数据烟囱也随之出现。这不仅导致大量数据二义性问题,同时也使计算存储成本难以控制。以离线数仓社区&交易的试点域为例,重复冗余表达到了54%,重复指标达到了35%。这本质上是缺乏数据架构体系的建设,数据架构是公司数据管理的“骨架”和“路线图”,它如同“汽车的底盘”,忽视数据架构可能导致数据的无序增长以及业务的决策错误。 4.1 Onedata数据架构方法论 及工具体系 Galaxy数据研发平台基于“Onedata”的数据架构方法论,建立了统一的数据采集和生产规范,使数据的新增更加合理、易用,提高数据的复用度、研发效率、交付质量,降低使用成本。这是一种“内啡肽”式的数据建设,前期需要花费一定时间进行数据模型的设计并遵守数据研发规范,但从业务的长远发展来看,这是必须要走的一步。 目前我们已在数据采集入仓和数据研发两个环节完成了数据架构能力建设,确保数据的入口(ODS)以及数据仓库的规范性,并再后续通过旁路数据治理的手段进行存量数据的规范化。如下图所示: Onedata数据架构工具体系 融入了Onedata数据架构技术体系(红色部分)后的Galaxy数据研发平台架构如下图所示: 融入Onedata规范数据生产能力(红色部分)的 Galaxy研发平台技术架构 下文主要对两个关键模块,统一ODS自动化入仓平台、Onedata数据建模的实现方案进行解析。 4.2 统一ODS自动化采集入仓方案解析 ODS(Operational Data Store),为操作数据层,是整个数仓最基础的一层,是原始数据采集入仓的第一个环节。Onedata的核心理念之一是所有的数据采集有统一的规范和入口。因为随意的从在线库进行采集同步会导致大量重复的数据存储,以及过长浪费的表存储生命周期。 由于数据的采集入仓本身没有过度复杂的业务逻辑,因此Galaxy数据研发平台实现了自动化数据采集入仓能力,提供在线数据源到数仓ODS层的标准化采集和管理能力。无需研发代码的同时,产生的数据都是严格满足架构规范的。具体价值有: 避免重复ODS数据存储 通过库owner+数仓owner双重审批,避免不合理的数据入仓 控制ODS表生命周期,避免存储成本浪费 全流程自动化,提高ODS层数据研发效能 目前支持MySQL和TiDB的全量采集同步和增量采集同步。同时,开启自动更新模式的入仓任务,还会订阅来源MySQL表的变更消息,并自动更新同步任务。关键流程如下: 自动化数据入仓流程 4.3 规范数据建模与自动化指标研发方案解析 Onedata在数据研发环节,核心采用维度建模的理论。它构建了公司级的一致性维度、标准化的事实表以及可灵活分析的汇总表和无二义性的指标。并将数据进行清晰的分层,将公司内部分散、异构的数据整合成一套可信、可复用、可分析的数据资产。其主要价值有: 保证维度和指标一致性:通过维度和业务过程的概念建模,确保维度表和事实表的全局唯一性;同时通过原子要素的指标建模,确保指标口径的全局无二义性。 提升开发效率:数据工程师无需重复构建维度表和基础事实表,直接复用数仓公共层的成果;同时指标原子要素定义完成后,指标和汇总表的代码全部可以系统自动化生成和优化,大幅提高效率,也减少出错的可能性。 增强数据可解释性:明确的表业务描述以及字段关联的指标和维度,以及清晰的星型/雪花模型关系,使数据的消费侧更方便的使用数据。 事前治理:严格根据架构规范进行数据研发,禁止重复表的新增,约束数据表的生命周期、数据依赖等,避免事后运动式治理。 Onedata核心概念、建模流程以及配合工具如下图所示: Onedata的数据建模流程 其中最为关键部分为“指标建模”。我们将指标的口径组成拆成了三部分组成:原子指标、业务限定、统计周期,同时在其物化到表上的时候再确定统计粒度。通过原子要素的组合定义指标可以确保同样的指标在公司全局只会有一个,以及标识出不同的汇总表、应用表中的指标是否为同一个。另外当原子口径发生了变化,系统也可以根据血缘关系找到受影响的指标和表,让owner进行握手确认,确保口径变更一致性。例如下图所示: 1个原子指标口径变更,影响了7个关联指标、 2张表的同步变更 从上图我们也可以看到,原子口径的变更影响非常大,即使可以基于血缘进行变更握手管控,人工修改逻辑也容易改错或遗留。因此我们实现了自动化指标代码生成的能力,基于原子口径自动化生成指标及其物化表的加工逻辑。 指标代码自动化生成方案: 将指标按来源表分组,并将其的组成原子要素(原子指标+业务限定+统计周期+统计粒度)进行SQL逻辑的组装、优化、方言翻译,具体流程为: 数据建模与指标SQL生成案例: 1.数据建模 2.代码生成 3.代码优化 - 指标SQL优化规则 4.4 当前落地进展与效果 1)统一自动化ODS采集入仓 目前已实现通过工单申请的方式一键完成MySQL和TiDB的数据进行增/全量自动化采集入仓能力,无需人工编写代码即可实现规范的数据入仓。产品效果如下: 业务成果: 业务域落地:目前已在得物内部各域全面落地统一ODS入仓能力。2025年Q3,得物全域新增的入仓任务93.6%是通过Galaxy自动化采集入仓平台自动化生成的; 表生命周期规范:25年新增ODS表生命周期定义率较24年Q4提升7.4倍,节约了大量离线存储; ODS存储增量控制:通过源头规范数据入仓,配合数据治理团队使数仓ODS层存储季度增幅降低:32%->8% 2)规范建模与自动化指标代码生成 目前已完成数仓规划->概念建模->明细表维度建模->指标建模->指标代码自动化生成->汇总表代码自动化生成的Onedata规范建模研发全流程,产品效果如下: 业务成果: 商家域数仓Onedata一期落地效果:完成了40+数据资产沉淀与规范化汰换改造,以及190+应用指标定义与上架,同时沉淀了100+公共派生指标。通过数据规范化重构、二义性问题的解决以及自动化代码生成的能力,可实现商家数据需求数仓开发效率提升40+%,每迭代线上需求吞吐量提升75%->90%。 社区域数仓Onedata一期落地效果:完成1200+应用指标的定义与上架,实现100%无二义性。通过精品资产的规范建设与切换,通过复用公共层数据,实现5+万/月的成本下降。由于数据二义性的解决以及资产规范度的提高,实现数仓和分析师用于口径oncall和业务取数的人力成本减少约10+人日/月。 五、数据生产的“刹车片” - 数据质量技术 得物数仓发展至今,不仅用于高管决策以及数据报表的场景,同时和得物线上业务做了非常强的耦合,各域均存在P0级资损风险场景,例如:社区数仓的运营投放、算法数仓的新品商业化、交易数仓的费率折扣、营销域、用户域等等。这些数据直接应用于线上业务,任何的数据质量问题都可能导致公司、商家、用户的利益受损,以及业务对数仓的信心丢失。 然而过往数仓的数据交付只是停留在快速提供数据以发挥业务价值这一步,业务和研发对数据质量和稳定性保障重视度严重不够,并且没有明确生产变更和数据质量校验的SOP,同时也没有健全的工具体系支撑,全靠数据工程师的自我修养,导致历史上很多核心数据加工任务没有保障或者保障不全面,不断引发P级故障。 5.1 Galaxy的数据质量工具体系 数据质量的相关工具就如同“汽车的刹车片”,可以想象没有刹车在路上行驶是如何的危险。因此我们在Galaxy数据研发平台建设之初就同步进行了数据质量工具的开发。目前所建立起来的离线数仓质量加固SOP及配合的工具如下: 离线数仓质量加固SOP 目前重点建设的2个核心功能,分别为:数据质量校验规则,用于监控生产数据质量并进行及时阻断止血,避免下游数据污染;以及数据变更管控流水线,在数据生产变更的环节嵌入消费场景打标、自动化风险扫描、code review、自动化数据测试、发布审批等功能,以全面保障数据质量。融入了数据质量技术体系(红色部分)后的Galaxy数据研发平台架构如下图所示: 融入数据质量能力(红色部分)后的Galaxy数据研发平台架构 5.2 当前落地进展与效果 数据质量校验规则 Galaxy数据研发平台已经实现了完善的数据质量规则校验能力,用户在Galaxy数据研发IDE上面向数据标准进行高效的质量规则定义,系统会自动生成校验SQL随着任务的发布一起下发到调度系统中执行。同时支持了强规则(主路执行,数据异常阻断任务执行)和弱规则(旁路执行,数据异常进行告警)两种规则运行场景,应对不同的场景诉求。产品效果如下所示: 场景覆盖方面已经实现了表非空校验、表波动校验、字段主键校验、字段非空校验、字段波动校验、字段枚举校验、自定义SQL校验等15种规则,覆盖了离线数仓100%的校验场景。 同时通过批量导入、弱转强等提效工具帮助离线数仓团队在25年Q3新增了1200+质量规则,全量P0任务质量规则覆盖率达到96%,非P0任务86%。并结合发布管控流水线能力,实现了P0场景任务100%变更覆盖表级规则,且金额等高风险字段100%变更覆盖字段级规则。 数据变更流水线 目前已经完成了完整的变更管控流水线的能力,主要功能包括:消费场景打标、静态风险扫描、Code Review、冒烟测试、数据探查、数据比对、发布审核。产品效果如下所示: 其中,场景打标方面,离线数仓末端任务(ADS和回流)98.3%打标了数据消费场景,对于全链路分析数据重要性和消费场景起到了巨大的作用;变更管控方面,静态扫描节点已实现了48个风险扫描规则,覆盖了94%的已知风险场景,当前系统自动化风险识别率98%(剩余为人工CR发现的问题),平均每双周可事前拦截600+起风险事件。 六、数据研发之路的“辅助驾驶”-智能化数据研发 过去10年,通过开源大数据组件的兴起,大幅度降低了企业构建大数据Infra的难度,在一定程度上实现了企业间的“数据平权”。而在企业内部,由于数据同步、ETL研发调度、资产管理、数据治理等复杂的技术导致找数和用数门槛非常高,因此大部分场景都是提需求给数仓团队进行数据加工,那么数据团队的交付效率就变成了公司各业务线数据化经营决策的瓶颈。 6.1 Galaxy的智能化演进路线 我们计划分3个阶段(L1~L3)建设Galaxy数据研发平台的智能化能力,来提升数据研发效率,降低业务自主进行数据研发的门槛,实现公司内部不同部门和岗位间的“数据平权”。如下所示: Galaxy数据研发智能化演进路径 当前我们处于L1的Copilot阶段,通过在数据研发流程中,旁路嵌入基于专家经验规则和大模型的智能SQL代码续写、智能任务诊断、智能SQL代码纠错与优化、 智能质量规则推荐等应用,辅助用户进行高效数据研发。嵌入Copilot后的Galaxy研发平台整体架构如下,主要关注红色部分: 数据智能化L1阶段的Galaxy研发平台技术架构 下文主要对当前较为成熟的功能,智能SQL代码续写的实现方案进行解析。 6.2 智能SQL代码续写方案解析 SQL代码续写的重点在于工程链路,大模型上我们选择适合代码生成的小参数模型,当前使用了Qwen-2.5-coder,后续会进行其他模型的实验。系统流程如下: 智能SQL代码续写系统流程 关键模块功能描述: 6.3 当前落地进展与效果 目前Galaxy研发平台已经落地了智能代码续写、智能任务诊断、智能SQL纠错与优化3个Copilot应用,具体业务效果如下: 其中高活用户的智能代码续写功能开启率为98.5%,整体采纳率趋势和我们做的优化动作如下: 智能SQL续写采纳率趋势 (2025年04月25日~2025年09月09日) 七、后续规划 后续Galaxy数据研发平台会持续完善现有功能提升产品体验,同时在智能ETL Agent、Data Fabric、数据逻辑化三个前沿方向进行探索,通过技术先进性为公司数据业务带来更多的价值。 7.1 长期规划一:智能ETL Agent 核心目标:数据研发提效,并降低数据研发门槛 ETL Agent核心能力是需要将用户的自然语言业务需求翻译成数据表的SQL加工逻辑,其本质上就是“NL2SQL”的传统命题。然而,如果让大模型直接分析用户的问题,那么它需要尝试从底层混乱的物理表结构中生成目标SQL,这会将业务语义的复杂性完全压给大模型,导致同一指标因表结构理解偏差或字段映射错误而产生不同结果。 Galaxy的ETL Agent会采用“NL2Metric2SQL”的方案。通过大模型进行自然语言的解析,结合向量数据库的相似度匹配实现NL2Metric的能力,然后基于Onedata数据模型和指标语义层,将自然语言的用数需求准确翻译为指标原子要素(原子口径、业务限定、统计周期、统计维度),并自动构建ETL加工链路。如下图案例: 智能ETL Agent用户流程案例 这也是Galaxy智能化的L2阶段,这个阶段将数据研发分成了专家数据研发以及智能数据研发。专家模式依然按传统SQL任务进行数据研发。而智能研发则以自然语言形式的数据需求作为输入,通过提前将Onedata数据模型存储在RAG的向量数据库中,然后根据数据需求内容进行分词,按相似度从RAG中匹配出相关的指标要素构建出提示词,并请求大模型获得正确的指标要素。 实现智能ETL Agent后的智能化L2阶段Galaxy研发平台架构(红色部分为Agent相关模块) 7.2 长期规划二:Data Fabric 核心目标:减少非必要的离线数据存储成本 传统的数据集成(数据入仓)方案是通过离线或实时数据同步工具将公司内部各数据源的数据全量或增量地抽取、清洗、加载到一个中心化的数据仓库中。但这种方案在技术上存在三个问题: 离线存储成本大:传统的数据集成方式,离线数仓的ODS层会拷贝全部所需在线数据的副本。然而其中很大一部分的数据仅用于短期分析,或用于对RT不敏感的查询场景,这些数据在离线数仓中物化存储的ROI极低,造成了大量存储成本浪费。 数据搬迁成本大:随着业务的发展,公司的数据源可能分布在不同地域、不同云环境。周期性的将海量数据同步至中心化数仓,将产生巨大的网络带宽成本和入仓等待时间。同时入仓需要与数仓工程师进行需求沟通,也存在大量协作成本。 数据一致性问题:数据同步有显著延迟,在离线同步的场景下,分析的数据会有天级延迟。 Data Fabric(数据编织)是一种全新的数据集成架构方案,核心理念是 “不移动数据,移动计算”。 技术实现方案上以外表的形式来封装源端表,通过统一的元数据系统,将源端表(外表)和离线表(内表)统一管理起来,使用起来对用户无感。在执行计算时,通过Spark引擎的跨源联邦查询能力,直接从各源端数据库(一般为备库或抽数库)将数据查询回来后进行分布式计算。下图展示了Data Fabric与传统数据集成的区别: 7.3 长期规划三:数据逻辑化 核心目标:计算存储成本降低,数据研发与运维提效 通过视图或参数化视图进行整条数据链路的构建,那么整条链路就完全不需要任何存储成本,计算成本也仅在视图查询时才发生。但这样会导致一个问题,当视图逻辑复杂,嵌套层级多时,查询效率非常低,且对相同视图的查询都需要重新计算。因此我们需要对一些关键的视图进行物化,物化后的视图,在查询时可以直接访问其物化表,实现查询性能的大幅提升。 数据逻辑化架构,会存在两层,上层为由用户定义的物理表以及虚拟视图组成的逻辑层,对用户感知;下层为物理表和系统自动生成的视图物化表组成的物理层,对用户不感知,具体如下图所示: 数据逻辑化的架构分层 数据逻辑化的关键技术之一为视图物化表的命中。当某个视图存在物化表时,需要将对应查询范围的数据直接翻译成物化表的查询,而不去展开视图查询,以提升查询性能。技术链路如下图所示: 数据逻辑化的视图物化命中改写链路 另一项关键技术为视图的物化策略与回收策略。系统需要定期通过算法识别出在满足产出时效的前提下,整体计算和存储成本最低的物化方案。例如下方案例: 数据逻辑化的视图物化与回收策略 目前全域优化场景简单且有效的算法有遗传算法、模拟退火算法等。通过评估在一定存储成本限制下,哪些视图的物化组合,可以使用整体计算cost最低。 将数据虚拟化技术和ETL Agent能力结合,我们可以实现系统自托管的智能数据研发,即Galaxy智能化的L3阶段。 往期回顾 1. 从一次启动失败深入剖析:Spring循环依赖的真相|得物技术 2. Apex AI辅助编码助手的设计和实践|得物技术 3. 从 JSON 字符串到 Java 对象:Fastjson 1.2.83 全程解析|得物技术 4. 用好 TTL Agent 不踩雷:避开内存泄露与CPU 100%两大核心坑|得物技术 5. 线程池ThreadPoolExecutor源码深度解析|得物技术 文 /宇贤 关注得物技术,每周更新技术干货 要是觉得文章对你有帮助的话,欢迎评论转发点赞~ 未经得物技术许可严禁转载,否则依法追究法律责任。

优秀的个人博客,低调大师

JeecgBoot 代码生成器 1.5.1 重磅升级:一键生成,告别手工迁移

前言 作为 JeecgBoot 开发者,你是否还在为每次生成代码后需要手动复制前端文件到项目而烦恼? 本次 1.5.1 版本升级将彻底解决这些痛点! ✨ 升级亮点 1. 前端代码直通项目 旧痛点 手动复制前端代码效率低且易出错 新特性 配置ui_project_path参数即可自动写入前端项目 jeecg_config.properties 新增前端项目地址配置 # 生成到前端VUE3项目路径 ui_project_path=E:\\JeecgBoot\\jeecgboot-vue3 2. 菜单 SQL 自动迁移 优化点 自动将生成的 Flyway 格式的菜单 SQL 文件,迁移到 start 项目的 flyway 目录 jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql └── V20230819__init_menu_for_moduleX.sql ⚡ 升级步骤 1. 升级代码生成器依赖版本号 修改根目录下的 pom.xml,升级 codegenerate 版本号到 1.5.1 <codegenerate.version>1.5.1</codegenerate.version> 2. 增加前端项目配置 修改jeecg-module-system/jeecg-system-start/src/main/resources/jeecg/jeecg_config.properties,设置下前端项目路径和后台JAVA项目路径业务包路径 # 生成到后端Java项目那个模块路径 project_path=E:\\JeecgBoot\\jeecg-boot\\jeecg-boot-module\\jeecg-module-demo # 生成到前端VUE3项目路径 ui_project_path=E:\\JeecgBoot\\jeecgboot-vue3 # 业务包路径 bussi_package=org.jeecg.modules.demo 升级价值 减少 85% 的前端文件迁移工作 节省 60% 的菜单 SQL 初始化时间 预计每周为开发者节省 1-2 小时 💬 开发者说 "升级后开发效率提升 30%,前端联调更顺畅" —— 某电商项目负责人 🔗 相关资源 GitHub 提交 PR 记录 代码生成配置文档 代码生成使用文档

优秀的个人博客,低调大师

告别 DOM 的旧时代:从零重塑 Web 渲染的未来

引言 浏览器这玩意儿现在真够诡异的。WebAssembly 在服务器端混得风生水起,但客户端还是那副老样子,跟十年前没啥区别。 WASM 粉会跟你吹,通过点 JS 胶水代码就能调原生 Web API。但核心问题是:为啥非得用 DOM?这东西就是个默认选项罢了。本文直击 DOM 和相关 API 的痛点,为什么该让它们退场了,顺便脑洞下怎么改进。 作者不是浏览器全栈专家——没人能全懂了,这正是症结所在:东西太杂太乱。 DOM 的“文档”模型:臃肿得像个大胖子 DOM 烂到什么程度?Chrome 里document.body有 350+个键值,大致分类: 节点操作:appendChild、removeChild之类的。 样式相关:style对象塞了 660 个 CSS 属性。 事件处理:那些过气的onevent属性,比如onclick,基本没人用了。 杂七杂八:innerHTML、className等。 属性和方法界限模糊,很多 getter 会偷偷触发重排,setter 藏在暗处。还有一堆历史遗毒。 DOM 不瘦身,还在发福。你是否感受到这痛苦,取决于你是搞静态页还是 Web App。作为开发者,我们大多避开直接操 DOM,转而用框架。但偶尔有纯 DOM 党吹它牛逼——纯属自欺欺人。DOM 的声明式功能,比如innerHTML,跟现代 UI 模式八竿子打不着。同一件事 DOM 有 N 种方式,全都不优雅。 Web Components 的尴尬处境 Web Components 是浏览器原生组件方案,但来得太晚,人气不高。API 设计笨重,Shadow DOM 加了层嵌套和作用域,调试起来头大。粉丝的辩护听着像在找借口。以下是一个简单的示例: class HelloWorld extends HTMLElement { connectedCallback() { const shadow = this.attachShadow({ mode: 'closed' }); const template = document.getElementById('hello-world').content.cloneNode(true); const hwMsg = `Hello ${this.getAttribute('name')}`; Array.from(template.querySelectorAll('.hw-text')).forEach(n => n.textContent = hwMsg); shadow.append(template); } } customElements.define('hello-world', HelloWorld); 看起来还行?但实际开发中,Shadow DOM 的复杂性和 DOM 的字符串化特性(stringly typed)让开发者头疼。相比之下,React、Vue 等框架的虚拟 DOM 完全避开了这些问题,因为它们的语法只是“长得像 XML”,而不是真的依赖 DOM。 HTML 的停滞不前 HTML10-15 年没大动静。ARIA 是亮点,但只是补语义 HTML 的漏。语义 HTML 从 2011 年就开始推,但到现在都没<thread>或<comment>标签。嵌套<article>来模拟评论?指导原则也奇葩。 HTML 总像在嫉妒纸媒,没能真正拥抱超文本本质,也不信开发者能守规矩。 WHATWG(浏览器厂商)接管后,没啥愿景,就在边边角角加补丁。CSS 甚至长出了表达式——每个模板语言都想变编程语言。 编辑 HTML?contentEditable理论上行,但实际搞成可用编辑器是黑魔法。Google Docs 和 Notion 的工程师肯定有吐不完的槽。 渐进增强、 markup/style 分离?做 App 的开发者早不信这套了。 现在 App 大多用 HTML/CSS/SVG 拼凑 UI,但开销巨大,越来越不像正经 UI 工具箱。 比如 Slack 的输入框:用一堆 div 模拟富文本。剪贴板 hack 用隐藏元素。列表/表格得手动虚拟化,自管布局、重绘、拖拽。聊天窗滚动条粘底每次都得重写。虚拟化越深,越得重造页面搜索、右键菜单等。 Web 混淆了 UI 和流式内容,当年新鲜,现在过时。UI 陈旧,内容同质化。 CSS 的“内外倒挂”:别用错心智模型 CSS 口碑一般,但问题在哪?很多人误以为它是约束求解器。看这例子: <div> <div style="height: 50%">...</div> <div style="height: 50%">...</div> </div> <div> <div style="height: 100%">...</div> <div style="height: 100%">...</div> </div> 第一个想分一半高?第二个自相矛盾?实际 CSS 忽略height,父元素收缩包裹内容。 CSS 是两趟约束:先外到内传尺寸,再内到外集内容大小。App 布局外到内:分空间,内容不影响面板大小。文档内到外:段落撑开父级。 CSS 默认内到外,文档导向。要外到内,得手动传约束,从body { height: 100%; }开始。这就是垂直对齐难的原因。 Flexbox 给显式控制: 用flex-grow/shrink做无溢出自适应布局,加 gap 间距。 但 Flex 混淆了简单模型:需先“猜测”子自然尺寸,布局两次——一次假设浮空,一次调整。递归深了可能爆栈,虽少见,但大内容一丢,一切变形。 避坑:用contain: size隔离,或手动设flex-basis。 CSS 有contain、will-change这类直击布局的,暴露底层层级本质。代替position: absolute包裹。 本质上,这些切断 DOM 全局约束流——默认太宽泛,太文档化。 CSS 的好地方? Flexbox 懂了这些坑,还挺靠谱。嵌套行列+gap,直观适配尺寸。CSS 好部分在这,但得用心打磨。Grid 类似,但语法太 CSS 味儿,啰嗦。 从零设计布局,不会这样:不会用减法 API 加屏障提示。会拆成组件,用外/内容器+放置模型,按需组合。 inline-block/inline-flex示意:内部 block/flex,外部 inline。盒模型两正交面。 文本/字体样式是特例:继承如font-size,为<b>工作。但 660 属性大多不继承——边框不递归子级,那会傻。 CSS 至少两东西混搭:继承的富文本样式系统 + 非继承的嵌套布局系统。用同语法/API 是错。 em相对缩放过时,现在逻辑/设备像素更 sane。 SVG 无缝入 DOM,动态形状/图标调色。但 SVG 非 CSS 子/超集,重叠处微差,如transform。坐标字符串化,烦。 CSS 加圆角/渐变/剪裁,有 SVG 嫉妒,但远不及。SVG 做多边 hit-testing,CSS 不行。SVG 有自己图形效果。 选 HTML/CSS 还是 SVG?基于具体 trade-off,全是向量后端。 注意一下的坑: text-ellipsis只截单行文本,非段落。检测/测量文本 API 烂,大家数字母凑合。 position: sticky零抖动滚动固定,但有 bug。无条件 sticky 需荒谬嵌套,本该简单。 z-index绝对层级战,z-index-war.css 里 +1/-1 比拼。无相对 Z 概念。 API 设计难,得迭代建真东西,找漏。 SVG 与 CSS 的权衡 SVG 在 Web 中用于动态生成图形或调整图标样式,但它与 CSS 并非完全兼容。例如,SVG 的 transform 与 CSS 的变换属性有微妙差异,且 SVG 的坐标全是字符串序列化,增加了开发复杂性。 国内场景:假设你在开发一个数据可视化仪表盘,类似 ECharts 的柱状图。你可以选择用 SVG 绘制图形,或者用 CSS 实现类似效果。SVG 支持多边形点击检测(hit-testing),而 CSS 不行;但 CSS 的圆角、渐变等功能又让 SVG 显得多余。最终,你可能需要在两者间做痛苦的权衡。 Canvas 上的油画:HTML in Canvas 的坑 DOM 坏,CSS 几成好,SVG 丑但必备……没人修? 诊断:中间层不合用。HTML6 先砍东西起步。 但关键解放现有功能。理想:用户空间 API 同逃生口,狗食自家。 HTML in Canvas 提案:画 HTML 到<canvas>,控视觉。不是好法。 API 形因塞 DOM:元素须 canvas 后代参与布局/样式/无障碍。离屏用有“技术关切”。 例子:旋转立方体交互用 hit 矩形+paint 事件。新 hit API,但只 2D——3D 纯装饰?问题多。 从零设计,不会这样!尤其浏览器有 CSS 3D transform,何须为自定义渲染全接交互? 未覆盖用例如曲面投影,需复杂 hit。想过下拉菜单吗? 像没法统 CSS/SVG 滤镜,或加 CSS shader。经 canvas 是剩选项。“至少可编程”?截 DOM 一好用,但非卖点。 Canvas 上复杂 UI 是为绕 DOM:虚拟化、JIT 布局/样式、效果、手势/hit 等。全低级。预备 DOM 内容反生产。 反应性上,路由回同树设循环。渲染 DOM 的 canvas 非文档元素了。 Canvas 真痛:无系统字体/文本布局/UI 工具。从零实现 Unicode 分词,就为包裹文本。 提案“DOM 黑箱内容”,但知套路:还得 CSS/SVG 拼凑。text-ellipsis仍破,得从 90 年代 UI 重造。 全或无,要中道。下层需开。 未来的方向:重新设计 DOM DOM 和 CSS 的问题根源在于它们背负了太多的历史包袱。以下是一些可能的改进方向: 精简的数据模型:未来的 DOM 需要大幅减少属性数量(从 350+精简到几十个),专注于核心功能。类似 React 的虚拟 DOM,但直接内置于浏览器中。在开发类似头条的信息流应用时,开发者需要快速渲染大量卡片。精简的 DOM 模型可以减少不必要的 API 调用,提高性能。 统一的布局系统:将 CSS 的内外布局模式明确分开,支持更直观的“外部约束”和“内部自适应”。例如,垂直居中应该像 align-items: center 一样简单。在电商平台的商品详情页中,开发者希望轻松实现复杂的布局(例如商品图片和描述的动态对齐),而不是依赖一堆 CSS hack。 WebGPU 的潜力:WebGPU 提供了更底层的渲染能力,可以完全抛弃 DOM 的复杂性。例如,Use.GPU 项目展示了一个基于 WebGPU 的简洁布局系统,代码量仅为传统 DOM/CSS 的几分之一。在开发类似 B 站的弹幕播放器时,WebGPU 可以用来高效渲染动态弹幕,省去 DOM 的性能开销。 多线程与隔离:现代浏览器已经是多进程架构,但 DOM 的设计没有跟上。未来的 DOM 需要支持更好的多线程和跨源隔离,适应复杂的 Web 应用需求。在企业级应用(如钉钉的协作平台)中,开发者需要集成第三方服务(如 OAuth 登录)。一个支持多线程的 DOM 可以显著提高安全性和性能。 结论 HTML、CSS 和 DOM 的现状就像一辆老旧的马车,虽然还能跑,但早已不适合现代 Web 应用的复杂需求。国内开发者在开发小程序、电商平台或社交应用时,常常需要用框架和 hack 来弥补 DOM 的不足。未来的 Web 需要一个更精简、更灵活的渲染模型,可能基于 WebGPU 或全新的 API 设计。 与其修补 DOM 的漏洞,不如从第一性原理出发,重新设计一个适合现代应用的 Web 渲染层。就像当年的 Netscape 开启了 Web 时代,今天的我们也有机会重新定义浏览器的未来。

优秀的个人博客,低调大师

新一代国产 ORM 框架,sagacity-sqltoy-5.2.59 发版,告别 mybatis

开源地址: github:https://github.com/sagframe/sagacity-sqltoy gitee:https://gitee.com/sagacity/sagacity-sqltoy idea 插件 (可直接在 idea 中检索安装):https://github.com/threefish/sqltoy-idea-plugins sqltoy 脚手架项目:https://gitee.com/momoljw/sss-rbac-admin sqltoy lambda 项目:https://gitee.com/gzghde/sqltoy-plus 更新内容 1、优化updateByQuery适配公共属性设置(updateSqlTimeFields)2、优化NumberUtil数字转英文金额格式3、为提供根据pojo自动创建表或修改表做好结构性准备4、针对公共属性赋值以数据库时间为准的字段(sqlTimeFields)且涉及强制修改(forceUpdateFields)在更新和创建记录时统一规则以数据库时间为准5、未匹配数据库方言(主要是适配hive)分页Long类型根据数据大小转Integer(hive jdbc setLong报错) sqltoy 的关键优势: //------------------了解 sqltoy的关键优势: -------------------------------------------------------------------------------------------*/ //1、最简最直观的sql编写方式(不仅仅是查询语句),采用条件参数前置处理规整法,让sql语句部分跟客户端保持高度一致 //2、sql中支持注释(规避了对hint特性的影响,知道hint吗?搜oracle hint),和动态更新加载,便于开发和后期维护整个过程的管理 //3、支持缓存翻译和反向缓存条件检索(通过缓存将名称匹配成精确的key),实现sql简化和性能大幅提升 //4、支持快速分页和分页优化功能,实现分页最高级别的优化,同时还考虑到了cte多个with as情况下的优化支持 //5、支持并行查询 //6、根本杜绝sql注入问题 //7、支持行列转换、分组汇总求平均、同比环比计算,在于用算法解决复杂sql,同时也解决了sql跨数据库问题 //8、支持保留字自动适配 //9、支持跨数据库函数自适配,从而非常有利于一套代码适应多种数据库便于产品化,比如oracle的nvl,当sql在mysql环境执行时自动替换为ifnull //10、支持分库分表 //11、提供了取top、取random记录、树形表结构构造和递归查询支持、updateFetch单次交互完成修改和查询等实用的功能 //12、sqltoy的update、save、saveAll、load 等crud操作规避了jpa的缺陷,参见update(entity,String...forceUpdateProps)和updateFetch //13、提供了极为人性化的条件处理:排它性条件、日期条件加减和提取月末月初处理等 //14、提供了查询结果日期、数字格式化、安全脱敏处理,让复杂的事情变得简单,大幅简化sql或结果的二次处理工作 //-----------------------------------------------------------------------------------*/ sqltoy 特点介绍: sqltoy 的核心构建思想 sqltoy 的对比 mybatis (plus) 的核心点:查询语句编写、可阅读性、可维护性 对象化 crud 是基础,但 sqltoy 有针对性的改进:update、updateSaveFetch、updateFetch 等 sqltoy 的缓存翻译,大幅减少表关联简化 sql,让你的查询性能成几何级提升 极致的分页,同样帮助你实现查询的性能大幅提升 快速分页:@fast () 实现先取单页数据然后再关联查询,极大提升速度 分页优化器:page-optimize 让分页查询由两次变成 1.3~1.5 次 (用缓存实现相同查询条件的总记录数量在一定周期内无需重复查询 sqltoy 的分页取总记录的过程不是简单的 select count (1) from (原始 sql);而是智能判断是否变成:select count (1) from 'from 后语句 ', 并自动剔除最外层的 order by sqltoy 支持并行查询:parallel="true",同时查询总记录数和单页数据,大幅提升性能 便利的跨数据库统计计算:数据旋转 便利的跨数据库统计计算:无限极分组统计 (含汇总求平均) 便利的跨数据库统计计算:同比环比 5、树形表排序汇总 6、扩展集成

优秀的个人博客,低调大师

让测试告别点点点:ZadigX 全流程自动化测试解决方案

01、测试行业现状分析 快速获得反馈以了解在软件交付生命周期内更改所产生的影响,是构建高质量软件的关键。以前,团队依靠人工测试和代码检查来验证系统的正确性。此类检查和测试工作通常在开发完成后的一个单独阶段进行。然而,这种方法存在一些缺点: 手动回归测试耗时且费用高昂,成为整个流程中的瓶颈,导致无法频繁发布软件,开发者无法快速获得反馈。 人工检查和测试不可靠,人们在手动回归测试等重复性任务中通常表现不佳,并且很难通过检查来预测复杂软件系统的更改会产生什么样的影响。 开发者必须等待很长时间才能获取其更改的相关反馈,并且需要大量工作来对缺陷进行分类和修复。性能、安全性和可靠性问题通常需要进行设计更改,如果在此阶段发现这些问题,费用更高。 较长的反馈周期让开发者难以了解如何构建质量代码,质量有时会被视为“其他人的问题”。 开发者不负责测试自己的代码,很难了解如何编写可测试的代码。 对于不断改进的系统,及时更新测试文档需要大量的努力。 相反,团队应该: 在软件交付生命周期内持续执行所有类型的测试。 创建并定制快速可靠的自动化测试套件,在持续交付流水线[1]中运行自动化测试。 ZadigX 具备管理软件开发全生命周期能力,几乎支持市面上所有测试工具和服务、以及平台系统,同时支持多种测试框架和不同的测试类型,通过强大的运行时环境治理和自定义工作流能力,为测试团队提供强有力的工程支撑 ZadigX 帮助测试团队,将测试服务和能力左移、右移到开发团队、运维团队等全生命周期中,尽早发现问题,让其他角色也参与到质量建设中来,规避因修复此类问题而造成额外成本。 02、持续测试实践思路 持续测试[2]是一种具体的工程实践,旨在确保系统在可靠性、安全性、操作性能和可用性方面的稳定性。它涵盖了多种测试类型,包括左移测试、右移测试、冒烟测试、单元测试、集成和消息传递测试、性能测试、功能测试、回归测试和用户验收测试等等。将持续测试[3]融入 ZadigX 的整个 DevOps 流程,能够实现高效的业务部署、快速发现和修复错误、改善用户体验,并最小化业务中断的成本。 03、用 ZadigX 落地持续测试 编排不同测试类型 静态代码扫描 支持主流的静态安全工具例如 SonarQube、Coverity,和任何自定义扫描工具。 如何配置:以 SonarQube 示例,新增代码扫描,指定扫描工具<SonarQube>,配置待扫描的代码库、扫描脚本,开启质量门禁检查并配置触发器,具体的配置步骤可参考文档:如何配置静态代码扫描[4]。 如何编排:编辑自定义工作流,在指定阶段(比如:构建之前)添加<代码扫描>任务即可。 单元测试 支持对 Java、Golang、Python、C++、JavaScript、C#、PHP、Ruby 等各种语言的技术栈执行单元测试 如何配置:新增测试,配置基本信息、代码信息和测试脚本,在<测试报告配置>中指定报告目录,添加触发器配置并增加 IM 通知,具体的配置步骤可参考文档:如何配置测试[5]。 如何编排:编辑自定义工作流,在指定阶段(比如:部署之后,执行自动化测试)添加<测试>任务即可。 集成测试 支持的测试类型包括但不限于:API 接口测试、UI 测试、端到端测试、压力测试、场景测试... 配置过程和单元测试类似,此处不再赘述。具体编排:编辑自定义工作流,添加<测试>任务并填写配置,以下图示例说明参数: 任务名称:根据实际语义配置,比如 apitest-for-service 任务类型:选择服务测试 服务组件:选择待测试的服务组件,配置服务组件和测试的关联,当部署服务后将会运行指定的测试 此外,为自定义工作流配置触发器和通知,实现基于代码变更自动运行测试、测试结果及时同步 IM。参考文档:触发器配置[6]、通知配置[7]。 系统测试 支持产品级别的测试,对产品进行全面的系统测试,从整体充分把握系统质量。测试配置中的任务类型选择<产品测试>,其他的配置和集成测试类似,此处不再赘述。 运行持续测试场景 开发阶段:静态扫描打基础 流程:代码实现 > 代码提交 > 自动触发静态代码扫描质量门禁 > 开发人员及时获得反馈 > 有的放矢改进 代码开发完毕提交 PR 后会自动触发代码扫描执行,可有效拦截未通过质量门禁的代码变更。扫描结果会自动 comment 在代码变更中,开发人员可点击快速获得扫描结果,针对反馈进一步优化代码。从代码源头来规避质量风险,做到 fail fast > feedback fast > fix fast。 测试阶段:组合策略赋能力 流程:静态扫描(开启质量门禁) > 构建 > 部署 > 自动化测试 > IM 通知 ZadigX 可一键拉起独立的开发、测试环境(参考文档:创建环境[8]),只需要将测试编排进自定义工作流中就可以实现在开发环境、测试环境分别建设自动化测试套件,将测试能力编排进团队日常合作的每一个环节中: 开发自测阶段,更新开发自测环境并执行自动化测试。 多名开发联调测试阶段,可以将多人的改动同时部署更新进行集成测试验证。 测试工程师验收阶段,可在 ZadigX 中分析测试报告,并根据覆盖情况持续补充自动化用例集,确保自动化测试套件与业务功能一同迭代,持续为团队提供价值,测试工程师的能力也在平台中得到充分展现。 此外,工作流运行结果可及时通知到 IM 群中,团队内每个人都能及时感知自动化执行情况,为质量负责。 发布阶段:多重保障保质量 流程:发布质量门禁 > 发布委员会人工审核 > 分批次灰度发布 > 系统测试 > IM 通知 测试验收通过后进行发布上线操作,建议几种配置策略: 建设发布门禁,通过自定义任务自动获取安全扫描、单元测试、集成测试等质量结果来判断是否允许上线,作为上线过程的卡点,确保版本验收通过并且符合质量要求后再做上线操作。 灵活编排蓝绿、金丝雀、分批次灰度、Istio 等发布策略,以确保发布可靠性,可参考:发布工作流[9]。 发布工作流适当增加测试团队人工审批,以确保业务流程上的发布合规性。 04、One More Thing:如何度量持续测试效果 任何实践都要讲求投入产出比,而持续测试的效果可以通过:测试的编写人员比例,发现的 Bug 数量,自动化测试的有效性,以及是否在 CI/CD 中运行自动化测试来衡量等方面来度量,具体如下: 05、小结 通过 ZadigX 支撑持续测试和自动化测试的实施,帮助测试团队更好地应对当前的测试行业挑战,确保软件交付的质量和稳定性,提高开发和交付过程的效率。 参考链接 阅读原文https://mp.weixin.qq.com/s/meO6yqzZdMQfBoEsAcr1Ig [1]持续交付流水线:https://continuousdelivery.com/implementing/patterns/#the-deployment-pipeline [2]持续测试:https://cloud.google.com/architecture/devops/devops-tech-test-automation [3]持续测试:https://www.ibm.com/cn-zh/topics/continuous-testing [4]如何配置静态代码扫描:https://docs.koderover.com/zadig/ZadigX%20v1.5.0/project/scan/ [5]如何配置测试:https://docs.koderover.com/zadig/ZadigX%20v1.5.0/project/test/ [6]触发器配置:https://docs.koderover.com/zadig/ZadigX%20v1.5.0/project/common-workflow/#触发器配置 [7]通知配置:https://docs.koderover.com/zadig/ZadigX%20v1.5.0/project/common-workflow/#通知配置 [8]创建环境:https://docs.koderover.com/zadig/ZadigX%20v1.5.0/project/env/k8s/ [9]发布工作流:https://docs.koderover.com/zadig/ZadigX%20v1.5.0/project/release-workflow/

优秀的个人博客,低调大师

告别纽交所!纽交所维持三大运营商退市决定

5月7日,三大运营商发布公告称纽交所称将对三家中国电信运营商启动退市程序。 公告显示纽约证交所委员会维持了纽约证交所监管部门重新启动本公司美国存托证券ADR下市程序的决定,预计纽约证交所将向美国证券交易委员会提交25表格以撤销本公司美国存托证券的上市及注册(退市)。 2020年11月12日,特朗普政府公布一项行政命令,禁止美国投资者对中国军方拥有或控制的企业进行投资。该规定可能会影响到包括中国电信、中国移动、海康威视等31家中国企业。此举旨在阻止美国投资公司、养老基金和其他机构买卖这些中国企业的股票,这些中国企业今年早些时候被美国国防部认定为受中国军方支持。行政命令将于明年1月11日生效。该命令将禁止美国投资者对上述中国企业的证券进行任何交易。同时,它还禁止美国人在被认定为“中国军事企业”的60天内买卖这些企业的证券。 有专家表示,三大运营商都是在香港上市,在美国市场ADR的退市对他们在香港的正常交易不会有很大影响,更多的是体现在预期和信心上。而影响投资者对运营商未来预期的更主要的因素其实还是他们在国内市场的表现。所以说对运营商来说,根本的还是做好自己在国内市场的工作。只要国内市场稳健发展,外界这些影响就都是可控的。 3月9日,中国电信在港交所发布公告指出,为把握数字化发展机遇,完善公司治理,拓宽融资渠道,加快改革发展,推动战略落地,实现高质量发展,中国电信拟申请本次A股发行并在上海证券交易所主板上市。公告显示,在符合上市地最低发行比例等监管规定的前提下,中国电信拟公开发行A 股数量不超过12,093,342,392股(即不超过本次A股发行后公司已发行总股本的13%,超额配售选择权行使前)。且在相关法律、行政法规、部门规章和相关规范性文件的规定下,制定本次发行方案。所募资金将用于5G产业互联网建设项目、云网融合新型信息基础设施项目及科技创新研发项目。

优秀的个人博客,低调大师

中国数据库告别卡脖子之忧:阿里OceanBase霸气卫冕全球第一

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。 中国自研OceanBase数据库,又刷新了世界纪录。 时隔七月,再次在TPC-C公开证明实力。 但这一次,不只是新晋霸主地位的巩固,也不止于打破业界尘封9年世界纪录后的新里程碑…… 更是技术性能benchmark、底层基础自主研发,以及全球标准话语权的关键事件。 很多年后回溯起来,这还可能是两个时代的分水岭。 数据库、操作系统和芯片,科技产业和数字化经济中三大当之无愧的底座技术,之前无一项主动权掌握在中国手中。 现在,阿里巴巴、支付宝,十年之功、20万亿行代码之力——在数据库领域,打破全球纪录的7个月后,再次创造了新的标准线。 究竟是怎样的成就? 去年十一,我们就报道过,阿里自主研发的金融级分布式关系数据库OceanBase,在国际事务处理性能委员会(TPC)的TPC-C基准测试中登上榜首。 这一成绩还打破了由美国公司甲骨文(Oracle)保持了9年之久的世界记录,成为首个登顶该榜单的中国数据库产品。 中国工程院院士、计算机专家李国杰都盛赞说:“这是中国基础软件取得的重大突破。” 如今,7个月后,纪录再度被刷新。 OceanBase不仅打破了去年自己保持的世界纪录,性能分数首次突破7.07亿,相比去年大幅提升近11倍。 而且这一次还是扩展能力的展现,在分布式架构下使用超过1500个节点的数据库集群,最终实现了整体性能的大幅提升——这在传统的集中式数据库是无法想象的。 更重要的是,在产业领域,分布式数据库解决了传统数据库几十年的难题,标志着数据库行业迎来了新一轮技术变革。 TPC-C,被誉为“数据库领域的世界杯”。 是全球主流计算机硬件厂商、数据库厂商公认的性能评价标准,其对数据库系统的软硬件协同能力要求极高。 也是全球目前最具公信力的联机交易处理(OLTP)数据库的功能与性能结合的测试标准,金融、电信、政府等关键领域的客户,一般参照 TPC-C 结果来衡量各个数据库厂商的事务处理能力。 更直接来说,TPC-C的测试就是数据库产品真实实力的最佳公开证明。 具体到测试本身,主要涵盖两大方向,分别是基本属性和压力性能。 在模拟真实交易环境并考察数据库基本性能的需求下,要求连续运行至少2小时,通过每分钟创建新订单数量来评价数据库的性能和性价比,规定测试任务需要在指定时间内完成,95%事务在1s内完成。 所以一款商业数据库想要向业界证明自身实力,TPC-C测试,绝对是一项硬指标。 然而,TPC-C排行榜长期被甲骨文、IBM和微软等传统数据库和硬件厂商占据…… 中国自研品牌的身影,从未出现过。 直到2019年9月,阿里一鸣惊人,打破甲骨文长达9年的霸榜垄断。 然而当是时,虽然成绩超第一名甲骨文纪录两倍有余,但外界依然有不少质疑的声音,且认为“蹭”了硬件红利。 于是这一次,时隔7个月再战——硬件基本无变化,要的就是技术架构和软件实力的证明。 所以也有外界评价说:「再无敌手,独孤求败」。 但参与此次“证明”的阿里工程师表示:这个评价听起来太狂了。 不过也认同,在数据库领域,技术架构的优越和领先,确实短时间内是很难超越的。 阿里凭什么? 这一次,OceanBase在测试压力性能时被要求连续运行至少八小时,1500多个数据库节点以及5000多万个仓库与对应数量的客户端参与其中,过程中上下抖动情况不超过1%。 以最苛刻的方式,无压力通过了该测试,而且短时间内,别人再以同样标准通过测试,几无可能。 OceanBase总经理杨冰,阿里连续两次刷榜的带头人。 他分享了OceanBase取胜的核心原因: 分布式整体系统可用性的技术创新。 即不用担心高额的软硬件投入来保障扩展性能所造成的杯水车薪,又可搞定节点故障无法使用主备镜像技术等问题。 以此为出发点,OceanBase大胆采用了Paxos分布式一致性协议,作为整个分布式数据库中最核心的技术之一。 OceanBase创始人阳振坤坦言,无论是主备库数据不一致还是分布式事务的技术缺陷,根本原因都在于关系型数据库自身软件高可用性的缺失,仅仅通过堆砌硬件红利来解决问题显然是治标不治本的做法;而OceanBase则是从数据库内部入手将问题解决。 当然,经过首次冲击TPC-C测试成功再到二次震撼TPC-C并满载而归,期间OceanBase技术团队也做了很多重要的优化升级工作。 例如提供兼容Oracle的租户模式并支持兼容PL/SQL的存储过程;实践分布式并行查询的新执行引擎帮助更好支持TPC-H这类场景测试,更快走向混合负载等。 关于兼容Oracle的工作难点,杨冰强调OceanBase团队的目标是打算用两年时间做到业务的平滑迁移,不需要修改一行代码,也不需要业务做任何调整,但过程中由于Oracle本身功能较多,先去突破哪些具体的内容确实是一种挑战。 另外甲骨文一直以来都是一家技术能力强大的企业,对自身专利权限十分看重,未来在兼容工作进行过程中技术团队认为务必要基于自研数据库的属性对类似功能的加持保持慎重。 更重要的是,分析甲骨文单机数据库强大的技术功能后,OceanBase团队发现其混合负载是其重要的技术杀手锏,“未来在OceanBase分布式技术架构中实现此项功能的确算是一种不小的技术挑战。” 此外,对于OceanBase来说,公开挑战里的成功,只是日常实力的证明方式之一。 与诸多中国技术公司一样,业务场景才是最好的练兵场,而且中国业务场景下的挑战,可能比基准测试还要复杂多变得多。 或许你多少有了解,支付宝投身OceanBase获得成功,除了强大的专业技术人才投入之外,更重要的是阿里经济体与支付宝业务为代表的的互联网规模、金融级场景的复杂度,以及每年双十一大促时期的大型历练机会…… 这些都为其提供了天然的练兵场,因为只有经过丰富的业务场景考验才能证明数据库系统的通用性,“用出来”才是硬道理。 举个例子,在高效解决银行业务从传统Oracle迁移到OceanBase的有关问题时,由于实操经验丰富,团队早已面向开发者、运维人员等不同技术层面人群提供了完成与大数据链路同步以及异构数据库、同构数据库同步与迁移的诸多工具,例如OCP、OMS等。 现如今随着OceanBase在金融场景的商用化程度越发深入,创始人阳振坤表示,未来团队更想该产品代表下一代分布式数据库的技术趋势前沿与发展方向,在除金融行业以外的多个领域。 例如交通、铁路与航天等也都陆续出现OceanBase的身影,夯实金融场景技术创新之余大力推进商用化进程,逐渐成长位至关重要的通用性技术。 包括如今面貌一新的国民应用,目前背后底座就是OceanBase。 所以可以想见,随着TPC-C的再次实力证明,会有更多公司、业务、场景和领域,用上全球领先且中国自研的OceanBase数据库。 在波诡云谲的大环境中,不必再担心任何形式的断供。 十年磨一剑 但即便如此,OceanBase一路走来,也并非轻而易举。 现在看到的是全球瞩目,之前却有十年的风雨兼程。 OceanBase创始人阳振坤回忆,当时完全是凭借技术灵感,认定传统集中式数据库,总会有尽头。 “我虽然不是做数据库的,但长期的分布式经验让我觉得像Oracle那种单机数据库总会有个尽头。毕竟业务数据量没几个月就要翻一翻,分布式绝对是个机会。” △OceanBase创始人阳振坤 于是当年6月25日,OceanBase正式立项。 又一年,OceanBase 0.1版本正式发布,在淘宝收藏夹上线,成功帮助淘宝收藏夹业务的数据库服务器数量大幅度减少。 2013年,支付宝开始启动“去 IOE”,即去掉了Oracle数据库、IBM小型机和EMC存储。 2014年支付宝交易库上线,OceanBase产品真正带到金融核心业务。 2017年第一个外部用户南京银行也正式上线OceanBase。 再到去年9月,一战成名,打破垄断。 但更重要的是今年3月,OceanBase宣布正式通过阿里云向全球开放,实现更广泛的高可用、高性能、低成本服务。 而筚路蓝缕的研发之路中,一度因为困难重重、中途因为找不到愿意使用的业务,OceanBase团队还曾经濒临解散。 如今春风化雨,一切尽付笑谈中。 更重要的是,曾经因为数据库技术垄断,甲骨文创始人拉里·埃里森,让中国合作方在零下二十多度的凛冽环境中苦等2小时的傲慢往事,或许再也不会有了。 现在,我们不仅有了国产自研OceanBase数据库可供选择,而且OceanBase,也是最好的选择。 接下来,就看操作系统和芯片的了。

优秀的个人博客,低调大师

关于5G的10个问答 让我们告别盲人摸象

第五代(5G)移动网络来临,但目前在科技界面临挑战以及让人感到深不可测。先锋概念公司总裁Will Strauss上周告诉记者,“从某些方面来说,5G有点像俗话里说的几个盲人在摸象。” 在不久前移动通信世界大会召开的前夕,我们向一些行业分析师和观察人士提了10个问题。 我们与之交谈过的行业观察人士之中有GSM协会(GSMA)技术总监David Hutton以及美国国家仪器公司(NI)射频通信和软件无线电(SDR)主管James Kimery。 GSMA是一个移动运营商和相关企业的协会,致力于支持推广各类标准。Hutton的解释是,协会的使命是引导产业聚焦“使用案例”和发展惠及消费者和企业的新标准。他表示,“5G发展不应该仅仅是由科技的发展推动的。” NI是个自动化测试设备和虚拟仪器软件公司。NI是蜂窝通信社区的新人。NI和4G或任何以前的旧标准的制定关系极少。据Kimery说,到2010年时这种情况有了彻底的改变。 5G本身和5G样机的开发颇为复杂,这使得NI的软件定义无线电平台成了涉及5G创新的学术研究人员和电信设备厂商手里不可或缺的工具。 NI现时在5G社区拥有独特的地位,它参加各种试验和有关制定标准的会议,是一个敏锐的观察者。NI公司以中立的态势见证5G的发展。 1、新兴的5G标准能提供什么? 据NI的Kimery介绍,5G可望提供的优势在于三个方面:为智能设备提供宽带数据、车用超可靠、超快、超低延迟通信以及为海量的连接设备提供机器类通信。 Jim McGregor是TIRIAS研究所的创始人和首席分析师,他表示,“5G有一些重要和关键的构成成分,包括:5G加强型载波的整合;与Wi-Fi和免授权频段和物联网解决方案的整合。” 2、5G将会和4G兼容吗? Kimery表示, “不兼容。目前讨论的5G技术不会走1G、2G和3G的路。” 而GSMA协会技术总监David Hutton就回答得更详细些。他表示,“由于5G技术并不是一种技术而是个含括各种标准的“生态系统”,我们会见到5G将会保持与4G一些后向兼容性。” Kimery的不兼容假设是基于3GPP(第三代合作伙伴计划)去年秋天在美国凤凰城的关于5G的讨论。当时,3GPP有下列的约定: 无线频段小于 6兆赫和大于6兆赫 向后兼容的无线接入技术(RAT)--- LTE演进 非向后兼容RAT---新的5G RAT 先锋概念的Straus的归纳是:“我觉得有一件事很明显,5G(约2020年)的基站控制逻辑将基于LTE,加入更多、更高的频率后,多个频率(载波整合)之间会更加黏合,随基站MIMO和定向广播而来的是天线数目变大。” 3、我们见过许多5G试验。我们连5G标准都没有,他们在试验什么呢? 其实,大部分这些试验都是“前期商业试验”,重点是技术可行性和可靠性。坊间对6GHz以上的毫米波频谱用于5G的兴趣越来越大。Kimmery表示,”对手机通信行业的每一个人来说这都是一个大飞跃。到目前为止,手机通信行业用的谱率都低于6GHz。” 而在蜂窝系统里启动毫米波的使用有其挑战性。挑战包括需要解决高频带信道带来的各种缺陷和应付这种信道的传播特性。 Kimmery表示,许多运营商和网络设备厂商在测试自己提出的系统的性能和收集结果。 4、这样说来,大家都盯着使用6GHz毫米波系统里不同频段的测试结果。各运营商/设备团队测试系统用的频率是什么样的情况? Kimmery表示,不幸的是,大多数运营商和设备厂商都对自己的试验内容和结果三缄其口。GSMA的Hutton表示同意,他表示,“是的,他们都是在私底下进行。” Kimery称,只有一个例外,NTT DoCoMo是个例外。 NTT DoCoMo公司在11月透露了公司截至目前为止的5G试验的一些细节。 DoCoMo和诺基亚网络去年十月在东京高楼林立的六本木进行了5G试验,用的是毫米波信号,甚高频70GHz。公司的报告提到,实现了“超高速数据传输,高于2Gbps”。 日本电信商DoCoMo称,该试验是在商业区内进行的第一次5G数据传输试验。 DoCoMo还进行了其他5G试验,包括11月与韩国三星一起做的那次,用的是28GHz高频信号,同时还用到多天线和波束跟踪的波束形成技术 。 5、他们什么时候会分享这些测试结果呢? Kimery 表示,5G技术工作委员会定于3月7-10号在瑞典哥德堡开会。他表示,“我们希望运营商和设备供应商将分享他们的数据,分享他们的样机测试结果。” 6、带我们走一轮5G标准化的时间表。 5G的研究阶段将于2017完成工作(最有可能是3月,届时14版出笼)。行业的目标是在2018年9月敲定5G修订版 1.0的第一期。第二期将于2019年12月完成。 7、5G的第一期和第二期段是前向兼容的吗? Kimery表示,委员会已经同意行业将保持2018年5G第一期和2020年加入的创新之间的兼容性。 8、5G的种种对各种人是各种东西。5G是不是被拉向不同的方向? Hutton承认,GSMA已经为新兴5G标准确定了70个不同的使用实例。他表示,这些实例从智能计表到触觉互联网、到虚拟现实等等无所不包。 增强型移动宽带通信的技术要求可能 不完全和关键可靠、无延迟通信或大规模的物联网设备的要求是一样的。 这里什么优先级别高什么优先级别低就变得至关重要。这会主导5G第一期发展的焦点所在。 9、那5G第一期最可能的焦点是什么呢? Kimmery提出,“对于电信商来说最紧迫的问题仍是移动数据的快速增长。”事态的发展很可能处决于数据的增加。 尽管其他诸如大规模MIMO、波束形成、新的波形和新的调制方案等一些技术也必须考虑,Kimery认为毫米波必定是敲定5G第一期标准的讨论的前沿和中心。 Hutton不那么确定,他觉得毫米波还是带点“学术”色彩。他指出,虽然有些应用实例会受惠于较高的频率,“我们需要看到不同的技术走到了一起”,最终使得 5G可以满足不同行业的广泛需求。 10、5G第一期标准化成功的关键是什么呢? Kimery强调指出,用上毫米波技术,“选定一个频率是很重要的”。他称,无论是28GHz、39Ghz或70GHz,“要选一个”。他补充说,“我们可以以一个频率为焦点,再扩展到其他频率就变得更容易些。” 原文发布时间为:2016年03月07日 本文作者:李超 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

魅族的野心与挑战:告别小而美 品牌形象成阻碍

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 “我喜欢魅族,是因为白永祥(魅族总裁)的实在,不像有些厂商的老板尽说些大话。”魅族PRO5发布会前,一位自费从内蒙古呼和浩特专程请假坐火车赶来北京参加发布会的魅友(魅族粉丝)告诉腾讯科技,自己作为魅族多年的用户,对过去的MX4和MX5两款手机却很不满意。他将希望寄托在了即将发布的PRO5。 某种程度上,白永祥的确很实在。在接受腾讯科技等媒体访谈时,白永祥不小心透露自己平时爱看《花千骨》。 “现在的年轻人不都爱看高颜值嘛。”专访结束后,白永祥匆匆走出房间,三步并作两步,边走边对腾讯科技解释,自己其实是在追赶潮流。 过去一年的魅族,又何尝不是在追赶潮流?学小米走高性价比模式,推出千元手机品牌魅蓝,引入阿里战略投资,再紧随华为小米之后进军高端手机市场。至此,魅族手机的子品牌定位已然明朗,魅蓝是定价千元机市场的青年良品,MX是超高性价比的中端,而PRO则是其定义的高端品牌。 那家追求***、特立独行的公司不见了,取而代之的是要走全产品线、冲销量、看业绩、追求利润,回归商业世界的魅族。 在过去的一年时间里,魅族一共发布了8款机型。这意味着,平均每隔一个半月,魅族就要请歌星或乐队在北京国家会议中心High一次。 这一次,魅族更是下血本请来了以“上头条”著称的《中国好声音》第四季导师汪峰。“全部都站起来!”一站上台,汪峰就立即调动起全场的气氛。声嘶力竭用力嘶吼的他,与快速求变疯狂追赶的魅族,确有几分相似。 回归高端的内因 魅族曾是一家带有浓厚黄章色彩的公司,从来只追求产品的***,而对产品之外的其他事,甚至包括销量,都毫不关心,原本在自己的世界里很是滋润。直到2011年小米手机的出现,才在魅族平静的湖面上惊起一阵波澜。不过,顽固的黄章任凭外界风吹浪打,我自岿然不动。 而另一家国产手机厂商华为彻底觉醒,也是2013年底的事了。从那时起,华为开始将“荣耀”作为独立手机品牌运作,与小米一样采用电商模式,预约销售、定时抢购。高举“高性能”和“低价格”的旗号。 而后知后觉的魅族,确如其创始人黄章所言“大彻大悟得有点迟了”。终于在2014年9月宣布新发布的MX4手机售价为1799起,比高冷的MX3起售价足足低了700元,并于去年12月发布全新子品牌“魅蓝”,搅局千元智能机市场。 然而,随着多家国产厂商集体涌入,千元手机市场的竞争日趋激烈,这一价位的手机市场不断被蚕食,已经逐渐趋于饱和。 这时候,为几百元争得头破血流的国产厂商开始发现,高端手机市场仍然被苹果、三星把控,并瓜分了手机市场利润的绝大多数,但这一领域有实力的玩家并不多。于是,华为、小米各自发布了Mate7和小米Note顶配版瞄准高端手机市场。 在高端手机市场长期被国外品牌霸占以及国内高端手机品牌不足的情况下,魅族自然也想分得一杯羹。 从另一个层面讲,无论是否真有对赌协议,在获得阿里5.9亿美元战略投资以后,魅族必须在手机出货量上保持高速增长,不能再由黄章一味地任性,仅仅只做“小而美”的公司。因此,走高性价比模式就成了为数不多的选择之一,而另一个选择则是拓宽产品线,往下进军千元机市场,往上回归高端阵营,保持高中低端不同定位的产品线同时运作。 面临的挑战 高端手机市场同台较量,魅族至少要证明其市场能力强于小米。 整个2015年上半年,小米几乎都在为同一款产品——小米Note大做文章,多次召开发布会,发布竹制后盖版、女神版、黑丝纪念版等多个版本。与此同时,一向很少投放线下广告的小米也在楼宇和公交站台等多处投放了小米Note的广告。 然而,小米方面迟迟不肯公布小米Note的出货量,始终未打消外界的疑虑。在3000元及以上手机市场,除了华为Mate7曾引起市场的追捧外,其他国产高端手机几乎都遭遇了滑铁卢。 小米的品牌定位偏向于中低端,对其高端手机小米Note顶配版的销量会有一定的阻碍。而对于魅族而言,也面临同样的问题。 魅族此前曾主打3000元左右的高端手机,但随着去年大幅降价与小米展开正面较量以来,其品牌形象已经发生改变,人们逐渐开始将“魅族”与“性价比”划等号,这将在某种程度上影响魅族PRO5的销售。 魅族去年全年手机销量500万台,今年仅上半年手机销量就已达到890万台,同比增长540%。 不过,低端手机有利于走量,魅族销量大幅上升很大程度上依赖于其定位千元机市场的魅蓝。相对而言,在高端手机市场要保持同样的势头要困难许多。 在国内,“抢购”已经成为手机行业的一种常态,但究其根源还在于供应链和产能上的不足。增加高端产品线后,魅族或面临一定的产能问题。 对此,李楠曾表示,魅族的产能依旧不够好。但他同时强调,需求一定是一夜之间爆发的,但是产能的提升不是一个工厂的事情,还有出货所面临的渠道,渠道所面临的用户以及售后支持等,魅族本可以在今年做到2500万或3000万销量,可是真不能做那么多。 此外,魅族已经开始进军国际市场,这或许在专利方面会对魅族提出更高的要求。 不过,魅族PRO5产品本身有诸多可圈可点之处,不再堆砌参数,而是将现有的功能做到精致,力求提升用户体验,这些都将在销量上有所体现。 “我相信这台手机在中国高端手机市场没有对标的品牌了。”李楠表示,魅族PRO5不计成本,不求销量,因为魅族上个月的手机销量达到289万台,已经足以让自己在手机市场中活下来。 在国内手机市场,此前3000元为一大分水岭,在此之上,是苹果三星的天下,二者以此赚得盆满钵满,在此之下,国产手机靠性价比“走量”,借此占领市场份额。如今,华为已经撕开了一条口子,而魅族才刚刚掀开一条缝。

优秀的个人博客,低调大师

告别数据库“膨胀”:Dify x SLS 构建高可用生产级 AI 架构

作者:无哲、言合 一、前言:Dify 的规模化挑战 Dify 是当前最受欢迎的低代码 LLM 应用开发平台之一,在 Github 上已斩获 120k+ 的星标数。国内外有众多企业基于 Dify 构建自己的智能体应用。阿里云可观测团队既是 Dify 的深度用户,也是社区的活跃贡献者。 在大规模生产实践中,我们发现 Dify 在高负载场景下面临显著的数据库性能瓶颈:其执行引擎高度依赖 PostgreSQL,单次 Chat 请求可能触发数百甚至上千次数据库访问;与此同时,Worker 进程在知识库索引构建、Trace 追踪等任务中也会持续写入大量数据。这频繁导致 DB 连接池打满、慢查询频发 等问题,已成为制约 Dify 集群横向扩展与并发能力的关键瓶颈。 二、现状与挑战:Dify 存储机制痛点分析 数据分布现状 Dify 的数据主要分为三类: Meta类 数据:租户、应用、工作流、工具等配置信息; 运行时日志:工作流执行明细、会话历史、消息记录等; 文件类数据:用户上传文件、知识库文档、多模态输出等(通常存于对象存储)。 其中Meta 与运行日志均存储在 PostgreSQL 中,运行时日志占据了数据库的绝大部分资源。以我们的生产环境为例,运行日志占 DB 存储空间的 95%以上。在访问频率最高和慢查询最多的 SQL 模式中,绝大多数都与运行日志的读写相关。 Dify 的运行日志包含工作流的执行明细记录和会话消息数据,执行记录中有工具输出、模型上下文等大量长文本信息,并且运行日志数量也会随着用户请求快速增长。 核心痛点 将这类海量、高吞吐的日志数据全量存储在 PostgreSQL 中,带来了多重挑战: 负载压力大: Workflow 节点的每次执行都会产生明细日志(节点执行明细数据,记录节点的输入输出和运行状态等数据),高并发下 workflow_node_executions 表的读写极易成为热点。 连接占用: 尽管 Dify 1.x 的几个版本对数据库长连接问题做了很多优化(如 issue #22307[1]),但日志密集访问仍加剧连接池压力,影响核心业务的连接获取。 扩展性不足: 运行日志随着业务量呈爆发式增长,而 PG 扩容依赖垂直升配,升级规格往往伴随主备切换导致的连接闪断或维护窗口,难以实现完全的无感扩容。社区已有多个反馈(如 issue #18800 [2]因会话数据堆积导致首 Token 延迟增加 3 秒; issue #22796 [3]呼吁将日志迁出 PG) 分析加工能力缺失: 控制台仅支持有限关键词检索,难以满足业务对历史会话进行多维分析、二次加工及精细化运营的需求。 社区的积极探索与演进 运行日志存储一直是影响 Dify 系统性能与稳定性的痛点。针对这一问题,社区一直在积极寻求解决方案,并已落地了多项优化措施: 内存数据库(issue #20147[4]):适用于无需持久化的轻量场景,同时新版执行引擎已完成日志存储抽象,为后续异构存储改造奠定了基础。 后台异步执行( issue #20050[5]):通过 Celery Worker 异步写入日志,有效降低了核心链路的延迟,减轻了 API 引擎对 DB 的同步依赖。 周期性清理( issue #23399[6]):引入自动清理机制,定期移除陈旧的会话与执行记录,有效缓解了数据库存储膨胀问题。 大字段分离存储: 针对 LLM 长上下文导致的大字段问题,支持将超长字段截断并转存至对象存储,减轻了 DB 的 I/O 压力。 根因分析:数据特征与存储引擎的错配 上述优化在特定阶段非常有效,缓解了 Dify 的燃眉之急,但在大规模生产场景下,应用层的逻辑优化(异步、清理等)已触及天花板。要彻底解决扩展性问题,必须消除数据特征与存储引擎的错配------即我们一直在试图用"关系型数据库"去承载本该由"日志系统"处理的数据。 Dify 工作流记录虽然并非完全是Append-Only写,但具有鲜明的日志特征,与典型的业务数据(如用户信息、应用配置)截然不同: 终态不可变: 记录仅在执行期短暂流转,结束后即成为"只读"档案。在 PG 中长期留存海量只读数据,不仅挤占昂贵的 SSD 资源,庞大的表数据更会显著降低索引效率与查询性能。 泛结构化与 Schema 易变: 核心负载为巨大的 JSON 对象(每个工作流节点的Inputs/Outputs),且结构随版本迭代。PG 难以高效处理深层 JSON 检索,且亿级大表的 DDL 变更会引发长时间锁表风险。 高吞吐时序写入: 日志随时间源源不断地产生,持续消耗 IOPS 与数据库连接。请求高峰期极易导致连接池耗尽,导致创建应用等核心业务因资源争抢而失败。 因此,我们需要一种支持存算分离、弹性伸缩、低成本且具备原生 OLAP 能力的存储架构。阿里云日志服务(SLS) 凭借其云原生特性,成为解决这一瓶颈的最佳选择。 三、方案选型:为什么 SLS 更适合 Dify 日志场景 SLS 并不是"另一个数据库替代",它是为日志场景量身定制的基础设施。在Dify工作流日志场景下,相比于 PG,SLS 在以下四个维度实现了架构上的优化升级: 极致弹性,应对流量波动 Dify 业务常有突发流量(如 AI 推理高峰)。PostgreSQL 需按峰值预置硬件资源,低谷期的资源浪费,一旦流量突增超过预设上限,数据库稳定性会有问题。 而SLS 作为 SaaS 化云服务,天然支持秒级弹性伸缩,无须关心分片或容量上限,且默认支持 3AZ 同城冗余。 高写入吞吐 + 架构解耦,保障核心稳定 高并发写入: SLS 针对日志场景优化,数据以追加方式顺序写入,避免了数据库中常见的随机 I/O 和锁竞争,能以极低成本支撑数万 TPS 的写入吞吐,轻松应对 AI 业务的写入洪峰。 资源隔离: 将日志负载剥离至 SLS 云端,实现日志数据流与 Dify 核心业务事务的物理隔离,有效保障主业务系统的稳定性与性能。 海量日志,低成本长期留存 SLS 数据采用高压缩比技术,支持自动化分层存储,可将历史数据自动沉降至低频和归档存储,无需维护清理脚本,成本远低于数据库 SSD。这使得 Dify 能以极低的成本满足长周期的分析和审计需求。 开箱即用的数据价值释放能力 Schema-on-Read: SLS 写入时不强制校验 Schema,完美适配 Dify 快速迭代带来的字段变更,无需对历史数据重新变更。 秒级分析: SLS 内置了针对日志优化的分析引擎(倒排索引+列存)。开发者可以使用关键词从海量日志中检索,也可以利用 SQL 对亿级日志进行实时聚合分析,将日志数据转化为业务洞察。 丰富数据生态: 日志在SLS中,可以进一步进行更完善的处理和分析,比如数据加工清洗、联合分析、可视化、告警、消费和投递等等。 四、技术实现:核心架构改造与插件化 为了将 SLS 引入 Dify,整个工程实施分为两个部分:一是对 Dify 核心的插件化改造,二是基于 SLS 读写日志的插件实现。 1.Dify 核心插件化改造 Dify 早期架构中,工作流记录的读写逻辑深度耦合了 SQLAlchemy(PG ORM),扩展性受限。从 v1.4.1 以后社区引入了 WorkflowExecution 的领域模型(#20067[7])并开始逐步对工作流执行核心流程进行重构,定义了一套标准的 Repository 接口,涵盖日志的写入、更新、读取以及统计等标准行为。在 v1.8.0 社区引入了 Repository 的异步实现,通过推迟日志记录保存提升了工作流执行速度。 虽然 Repository 接口为多存储驱动提供了可能,但早期的抽象并不彻底:它主要解决了"写"的抽象,但大量"读"操作仍绕过 Repository 直接依赖 SQLAlchemy,且复杂的跨表 Join 查询使得存储层难以真正剥离。 为此,我们和 Dify 研发团队多次交流,确定了 Repository 抽象层的完整实现方案。我们通过剥离跨表关联查询、标准化读取与统计接口,真正实现了存储层的完全解耦与插件化加载。 2.SLS 日志插件实现 在插件实现过程中,核心挑战在于抹平关系型数据库(PG)与日志系统(SLS)在数据模型上的差异。为此,我们采用了以下技术策略: 基于多版本的状态管理 SLS 的 LogStore 是 Append-Only 追加写入,而Dify 的工作流执行过程存在状态流转,从 RUNNING 变为 SUCCEEDED/FAIL。因此我们采用了多版本控制的思路: 写入策略:每次状态更新,不覆盖旧日志,而是新写入一条包含完整状态的日志记录。我们在日志模型中引入了一个纳秒级的时间戳字段 log_version来区分版本。 读取策略:在查询或统计时,插件内部会生成聚合 SQL,对于同一个 workflow_run_id,始终选取 log_version 最大的那条记录作为最终状态。 Schema 自动同步 Dify 的迭代速度非常快,数据库模型经常发生变更。如果每次升级 Dify 都需要用户手动维护索引配置,将极大地增加运维负担。SLS 插件启动时会自动扫描 SQLAlchemy 模型定义,并与 SLS 索引配置进行 Diff。一旦发现新字段,自动调用 API 更新索引。用户无需手动维护索引,开发者也无须为 SLS 单独编写升级脚本。 原生 PG 协议兼容 值得一提的是,SLS 新增原生支持 PostgreSQL 协议。绝大部分原有的统计与分析 SQL,均可通过 PG 兼容模式直接发送到 SLS 上执行,极大地降低了插件的开发适配成本。 五、实践指南:配置与平滑迁移 该功能已正式合并至 Dify 社区主分支。基于Dify最新代码,只需进行简单配置,就可以将工作流执行记录切换到SLS存储。 第一步:准备工作 (1)创建 Project:在阿里云日志服务控制台创建 Project(建议与业务同地域) 无需手动创建 Logstore 和索引,Dify 启动后插件会自动检测并创建。 (2)获取访问凭证:获取具备 SLS 读写权限的 AccessKey ID 和 Secret。 可以授予 AliyunLogFullAccess,或按需配置最小权限(创建/查看Project、创建/查看logstore、创建/更新/查看索引、写日志、查日志等) 第二步:配置Dify 在 .env 或 docker-compose.yaml 中修改以下配置项,将工作流存储驱动指向 SLS 插件,并补充连接信息: # 1. 修改 Repository 驱动指向 SLS 插件 CORE_WORKFLOW_EXECUTION_REPOSITORY=extensions.logstore.repositories.logstore_workflow_execution_repository.LogstoreWorkflowExecutionRepository CORE_WORKFLOW_NODE_EXECUTION_REPOSITORY=extensions.logstore.repositories.logstore_workflow_node_execution_repository.LogstoreWorkflowNodeExecutionRepository API_WORKFLOW_NODE_EXECUTION_REPOSITORY=extensions.logstore.repositories.logstore_api_workflow_node_execution_repository.LogstoreAPIWorkflowNodeExecutionRepository API_WORKFLOW_RUN_REPOSITORY=extensions.logstore.repositories.logstore_api_workflow_run_repository.LogstoreAPIWorkflowRunRepository # 2. 新增 SLS 连接配置 ALIYUN_SLS_ACCESS_KEY_ID=your_access_key_id ALIYUN_SLS_ACCESS_KEY_SECRET=your_access_key_secret ALIYUN_SLS_ENDPOINT=cn-hangzhou.log.aliyuncs.com ALIYUN_SLS_REGION=cn-hangzhou ALIYUN_SLS_PROJECT_NAME=your_project_name ALIYUN_SLS_LOGSTORE_TTL=365 # 日志存储天数 # 3. 迁移开关配置 LOGSTORE_DUAL_WRITE_ENABLED=false LOGSTORE_DUAL_READ_ENABLED=true 为了保证存量 PG 用户能平滑升级到 SLS 版本,我们在插件中提供了两个开关: (1)双写机制:通过配置 LOGSTORE_DUAL_WRITE_ENABLED=True(默认关闭),系统会将日志同时写入 PG 和 SLS。这适用于存量用户迁移初期的灰度验证,确保在不改变原有数据流的情况下,验证 SLS 的配置正确性和 Dify 版本升级本身的兼容性。 (2)双读降级机制:通过配置 LOGSTORE_DUAL_READ_ENABLED=True(默认开启),系统优先从 SLS 读取日志。如果 SLS 中未找到该记录(例如迁移前的老历史数据),插件会自动降级回 PG 再次尝试读取。 六、成效对比:迁移到SLS的三大收益 收益一:DB压力显著下降 切换到SLS,相当于把现有PG中数据量最大的两张表的数据迁移走了。根据我们线上业务的数据,DB减少了95%以上的存储空间(运行时间越长,这个比例越高),并且读写过程中的DB的连接数、CPU等压力也有显著降低。 收益二:存储成本大幅降低 为了直观量化迁移后的成本收益,我们以一个典型的生产级场景进行估算:假设 Dify 应用日增日志 10GB,为了满足模型评估与回溯需求,需留存最近 300 天(约 3TB)的数据。 注:这里估算SLS成本的时候,已经将存多条状态记录会占用存储空间的因素考虑进去。 此外对于PG实际生产中还需额外考虑高可用多副本、预留存储空间、连接池扩容等隐性成本。 这里造成近 10 倍成本差距 的根本原因在于存储机制的不同。 Dify的工作流记录包含了用户提问、知识召回、工具调用和模型响应等数据,是评估和回归等任务需要的数据资产,长期留存价值高。 对于 PG: 存储时间越长,数据量越大,对昂贵的 SSD 存储空间占用就越多,成本会大幅增长。pg实例需要提前预估存储空间,存储空间不可能完全利用起来,必然闲置一部分空间。 对于 SLS: 专为日志设计的高压缩比与分层存储技术,使得存储数据量越大、时间越长,其边际成本优势越明显。 收益三:数据价值释放,从"运维监控"到"业务洞察" 这里我们以一个真实的 Dify 应用场景------"电商智能客服助手"为例,展示日志数据接入 SLS 后,如何挖掘其背后更大的业务价值。 (1)无缝集成,原生体验 接入 SLS 后,Dify 界面上的日志查询与回溯体验保持不变,但底层存储已完全切换。 日志回溯:Dify 控制台的日志详情页直接从 SLS 读取数据,响应更迅速。 监控图表:Dify 内置的监控统计图表,也是通过执行 SLS SQL 实时生成的。 (2)超越基础,SLS 进阶分析 虽然 Dify 内置了基础查询和统计功能,但面对复杂的业务分析需求,我们可以直接转至 SLS 控制台,解锁更强大的能力。 任意字段的高速检索 SLS 支持全文索引和任意键值对条件的组合查询,快速精准检索出符合某种特定特征的日志。 业务趋势分析(可视化)场景 比如这里我们分析"用户意图识别"这个工作流节点里,按识别出的用户意图的分类统计随时间变化的PV情,便于通过观察不同分类的趋势变化,做出相应的运营决策。 * and title: 用户意图识别 and intent | select json_extract(outputs, '$.intent') as "用户意图", date_trunc('minute', __time__) t, count(1) as pv group by "用户意图",t order by t limit all 异常诊断(漏斗分析)场景 可以通过漏斗图,分析观察工作流哪些中间节点出现异常失败的比率较高。 status:succeeded | select title, count(distinct workflow_run_id) cnt group by title order by cnt desc 成本与风险风控(实时告警)场景 配置告警规则,统计 LLM 节点的 Token 消耗,一旦超过预设阈值,立即触发钉钉/电话告警。 数据闭环(ETL 与加工)场景 利用数据加工和定时 SQL,对工作流的输入输出进行清洗、脱敏与标准化,构建持续更新的评估与训练数据集。 总之,将 Dify 工作流日志接入 SLS,不仅能高效查询日志,更能通过分析、可视化、告警和数据加工,将日志转化为业务洞察,真正实现从"看日志"到"懂业务"的跃升。 七、总结:迈向生产级 AI 架构 将 Dify 运行日志迁移至阿里云 SLS,并非一次简单的"存储替换",而是 Dify 向生产级高可用架构演进的关键一跃。 我们通过业务数据与日志数据解耦的架构改造,成功将高吞吐、泛结构化的日志流从事务型数据库中剥离。让 PostgreSQL 专注核心业务事务处理,让 SLS 充分发挥其在海量数据存储与分析上的原生优势。 这一特性带来的价值是全方位的: 解决DB性能瓶颈: 将日志与核心事务解耦,从根本上解决数据库瓶颈,保证核心业务稳定性。 大幅降低日志成本: 利用SLS的弹性伸缩、高压缩比、分层存储,低成本存储海量日志。 充分释放数据价值: 从简单的日志查看升级为强大的实时分析、监控告警、加工处理,将运维数据转换为业务洞察。 如果您正在构建大规模的 AI 应用,或者正被 Dify 数据库的性能瓶颈所困扰,现在就是升级的最佳时机。拥抱云原生日志架构,让您的 Dify 跑得更快、更稳、更智能。 参考链接: [1]https://github.com/langgenius/dify/issues/22307 [2]https://github.com/langgenius/dify/issues/18800#event-17534118862 [3]https://github.com/langgenius/dify/issues/22796 [4]https://github.com/langgenius/dify/issues/20147 [5]https://github.com/langgenius/dify/pull/20050 [6]https://github.com/langgenius/dify/issues/23399 [7]https://github.com/langgenius/dify/pull/20067

优秀的个人博客,低调大师

告别多源数据处理繁琐!SpreadJS 让筛选排序如 Excel 般顺手

在数据处理领域,Excel 以其直观易用的筛选与排序功能,成为众多用户日常办公的 "必备工具"。无论是从海量员工信息里精准定位特定部门成员,还是按多维度优先级梳理销售数据,筛选与排序都是提升数据可读性、分析效率的关键手段。即便是在电商平台,仍有大量从业者依赖 Excel 来快速筛选、分析数据。 然而,Excel 存在明显短板 ------ 无法对多平台数据进行整合。当企业面临多数据源、海量数据处理需求时,就需要一款既能兼容 Excel 操作习惯,又具备多数据源整合能力的电子表格工具。经过多方探寻,SpreadJS 脱颖而出。 选择 SpreadJS,核心在于它高度契合 Excel 的交互体验,能适配业务人员既有操作习惯,实现线下报表向线上的无缝迁移;其强大的自动化数据处理与报表生成能力,可大幅减少人工冗余操作;它还能兼容复杂报表与多数据源,支持主流前端框架集成。同时,SpreadJS 提供单元格级权限管控与协同编辑功能,满足了企业级数据安全与共享的需求。 接下来,结合一组旅游数据,先带大家认识 SpreadJS 筛选,排序功能。 这个面板与 Excel 高度一致,涵盖了排序、按颜色排序、按颜色筛选、文本筛选以及列表筛选等功能。 一、筛选功能 升序 / 降序 升序 / 降序:点击 "升序",该列数据按升序规则排列,是针对当前列的快速单例升序操作;点击 "降序",则按降序规则排列,为单例降序快速操作方式。 按颜色排序 / 筛选 按颜色排序 / 筛选:"按颜色排序" 可依据单元格背景颜色或字体颜色对数据排序,比如将背景为红色的单元格数据排前,便于从视觉层面整理数据;"按颜色筛选" 能筛选出具有特定背景颜色或字体颜色的单元格数据,快速定位符合颜色特征的数据行。 文本/数字/日期筛选 文本/数字/日期筛选:可对文本类型数据进行复杂筛选,如筛选出包含特定文字、以特定文字开头 / 结尾、等于 / 不等于某一文字的记录,精准定位文本数据。 文本筛选中的高级用法 1. 通配符筛选 使用场景:当你需要筛选出包含特定字符模式的数据时,通配符就非常有用。Excel 中有两个通配符:问号(?)代表单个字符,星号(*)代表任意多个字符。 操作示例: 在 "city" 列进行筛选,如果要筛选出城市名是两个字的城市,在自定义筛选的条件框中输入 "??"; 若要筛选出城市名中包含 "安" 字的城市,输入 "安"。 2. 多条件逻辑筛选 使用场景:当需要根据多个文本条件筛选数据时,可使用 "与" 和 "或" 逻辑。 操作示例:假设要筛选出城市名中包含 "西" 或者包含 "南" 的城市,在自定义筛选中,第一行条件选择 "包含",输入 "西",第二行条件选择 "包含",输入 "南",然后选择 "或" 关系;若要筛选出城市名中既包含 "北" 又包含 "京" 的城市(这种情况一般针对特定数据,如只有 "北京" 满足) ,则选择 "与" 关系。 3. 开头或结尾匹配筛选 使用场景:当你关注数据的开头或结尾字符时,可以使用此类筛选。 操作示例:在 "city" 列筛选城市名以 "宝" 开头的城市,在自定义筛选条件框中选择 "开头是",并输入 "宝";若要筛选城市名以 "州" 结尾的城市,则选择 "结尾是",输入 "州"。 数字筛选中的高级用法 1. 区间筛选 使用场景:在处理数值型数据(如销售额、年龄等)时,需要筛选出某个数值区间内的数据。 操作示例:假设有一列是游客的消费金额数据,要筛选出消费金额在 500 - 1000 元之间的数据。在自定义筛选中,第一行条件选择 "大于或等于",输入 "500",第二行条件选择 "小于或等于",输入 "1000",并选择 "与" 关系。 2. 基于平均值、最大值、最小值的筛选 使用场景:当你需要根据数据的统计特征进行筛选时,这种方法很有效。 操作示例:对于游客的年龄数据,先计算出平均年龄,然后在自定义筛选中选择 "大于" 或 "小于",并输入平均年龄值,筛选出年龄大于或小于平均值的游客数据;或者筛选出年龄大于最大年龄减 10 的数据,即选择 "大于",并通过公式计算出 "最大值 - 10" 的结果后输入(如果数据量较大,可借助函数如 MAX 计算最大值 )。 3. 前 N 项筛选 使用场景:在处理排名或关注 top 数据时使用。 操作示例:对于游客消费金额数据,要筛选出消费金额最高的前 10 位游客。在自定义筛选中,选择 "10 个最大的值",然后在弹出的对话框中,将 "10" 修改为你需要的数值,如 "5",即可筛选出消费金额最高的前 5 位游客数据。 三、日期筛选中的高级用法 1. 基于时间段的筛选 使用场景:当你需要筛选出特定时间段内的日期数据时,如筛选出某一年、某一季度或某几个月的数据。 操作示例:在 "date" 列筛选 2023 年的数据,在自定义筛选中,第一行条件选择 "大于或等于",输入 "2023 - 01 - 01",第二行条件选择 "小于或等于",输入 "2023 - 12 - 31",并选择 "与" 关系;若要筛选出 2023 年第二季度的数据,输入 "2023 - 04 - 01" 和 "2023 - 06 - 30"。 2. 相对日期筛选 使用场景:根据当前日期或某个固定日期的相对时间进行筛选,如筛选出过去 30 天内的数据、未来一周的数据等。 操作示例:假设当前日期是 2024 - 05 - 01,要筛选出过去 30 天内的旅游订单日期数据。在自定义筛选中,选择 "大于",输入 "=TODAY () - 30"(TODAY () 是 Excel 中的日期函数,返回当前日期),即可筛选出从 2024 - 04 - 01 到 2024 - 05 - 01 的数据。 列表搜索 在搜索框输入关键词,能快速筛选出该列中包含该关键词的数据项,方便在大量数据中查找特定内容。 全选 / 取消全选:"全选" 勾选后,该列所有数据项被选中,显示对应数据行;"取消全选" 取消勾选后,该列所有数据项不被选中,可重新选择需要的数据项。 数据项列表:列出该列所有不同数据项,通过勾选或取消勾选特定数据项,可筛选出包含这些数据项的行,精准控制显示的数据内容。 二、排序功能 在排序面板中,支持设置多条件排序规则: 添加 / 删除 / 复制条件:点击 "添加条件",可新增排序条件,实现多列数据的组合排序,比如先按 "tourist_attraction" 列排序,再添加 "city" 列作为次要排序条件,满足复杂排序需求;"删除条件" 可移除已添加的排序条件,方便调整规则;"复制条件" 能快速复制已有排序条件,减少重复操作。 排序规则设置区域:通过 "列(主要关键字)" 下拉菜单,可选择要排序的列,如图中选择 "tourist_attraction" 列,依据数据中的不同列确定排序字段;"排序依据" 选择 "数值",表示按列中数据的数值大小排序,此外还支持按 "单元格颜色""字体颜色""单元格图标" 等排序,满足对数据多种属性的排序需求;"次序" 选择 "升序",即按从小到大(数值)或从 A 到 Z(文本)的顺序排列数据,也可选择 "降序" 实现反向排列。 选项按钮:点击后进入更详细的排序设置界面,可设置排序时是否区分大小写(针对文本数据)、排序方向(按行或按列)等,进一步细化排序规则。 而除了上述提到的功能,SpreadJS还提供了一些扩展的能力。 三、扩展功能 中文拼音首字母排序。 function compareSize(value1, value2) { return value1.toString().localeCompare(value2.toString(), "zh"); } sheet.bind(GC.Spread.Sheets.Events.RangeSorting, function (e, info) { // 可以根据 info.range 判断是否是需要处理的范围 info.compareFunction = compareSize; }); 通过上述的代码,监听排序操作,使其按照中文拼音首字母排序。 自动扩展筛选区域 当创建一个筛选并且只选择一个单元格时,SpreadJS 将扩展筛选区域,直到区域周围的单元格都是空的。 创建筛选后,SpreadJS 将筛选区域扩展到原始值以下,直到出现空值。 四、示例 下面通过两个示例,看看如何运用这些筛选排序功能: 示例一:高学历游客线上支付偏好与景区关联分析 筛选操作: 对 "education" 列进行文本筛选,勾选 "本科""硕士及以上" 等学历选项,筛选出高学历游客相关数据。 对 "pay_meth" 列进行筛选,勾选 "线上团购""支付宝" 等线上支付方式选项。 排序操作: 以 "tourist_attraction" 为主要关键字,设置 "数值" 排序依据,选择 "升序",使景区按序排列。 添加 "pay_meth" 为次要关键字,同样 "数值" 升序,让同一景区内不同支付方式也有序呈现。 分析目的:通过筛选排序,能清晰呈现高学历游客在不同景区的线上支付偏好,助力景区针对高学历游客优化线上支付服务与营销,比如在高学历游客青睐的景区,加大线上支付优惠活动推广。 示例二:优质景区境外游客交通方式分析 筛选操作: 对 "level" 列进行筛选,勾选 "4A""5A" 等级选项,聚焦优质景区数据。 对 "visitor_ty" 列进行文本筛选,筛选出 "华侨""外国人" 等境外游客相关数据。 排序操作: 以 "level" 为主要关键字,"数值" 升序(或降序,依查看习惯),将景区按等级排序。 添加 "transport" 为次要关键字,"数值" 升序,让同一等级景区内的交通方式有序展示。 分析目的:操作后,可直观了解优质景区中境外游客的主要交通方式,景区可据此在交通枢纽处(如对应交通方式站点)设置景区专属服务点,或与交通运营方合作推出针对境外游客的交通 + 景区游览套餐。 示例三:景区淡旺季与游客消费及折扣关联的高级分析 筛选操作: 利用文本筛选功能,对 "date" 列设置 "自定义筛选",筛选出每年 1 - 3 月(淡季)和 7 - 8 月(旺季)的数据。 结合多列筛选,同时对 "pay_meth" 列筛选出 "线下团购""线上团购""现金" 等主要消费支付方式,对 "discount" 列筛选出折扣为 0、0.6、0.85、0.9 等不同折扣区间的数据。 排序操作: 采用多条件优先级排序,首先以 "date" 为主要关键字,"数值" 升序,将淡季和旺季数据依次排列。 添加 "discount" 为次要关键字,"数值" 降序,让同一时间段内高折扣数据优先显示。 再添加 "pay_meth" 为第三关键字,"数值" 升序,使相同折扣下不同支付方式有序呈现。 高级功能运用及分析目的: 借助 SpreadJS 的单元格级权限管控,可设置仅相关市场分析人员能查看和编辑此筛选排序后的数据,保障数据安全。同时利用协同编辑功能,团队成员能在线共同对数据进行标注、补充分析思路。通过这样的高级筛选排序,能深入剖析景区淡旺季不同折扣策略下游客的消费支付偏好,为景区在淡旺季制定更精准的营销与价格策略提供数据支撑,比如旺季可针对高折扣且热门的支付方式推出组合优惠,淡季则通过特定支付方式的折扣活动吸引游客。 无论是日常办公中对数据的基础处理,还是企业级多源海量数据的深度分析,SpreadJS 都以其类 Excel 的友好操作与强大拓展能力,为数据筛选排序工作带来高效与便捷,成为数据处理领域的得力助手。 体验地址 SpreadJS在线表格编辑器

优秀的个人博客,低调大师

告别App 中国移动5G消息上线数字人民币钱包

近日,中国移动宣布将于5G信息中添加“数字人民币”钱包功能,用户可以直接从5G信息界面中完成包括查询余额、交易记录向他人转账等等操作,省去了还要在应用商店下载App的繁琐操作。 所谓“5G信息”,可以说是无端的5G应用,它与现有的即时聊天软件有所不同,可以让手机号成为5G消息的用户ID,无需添加好友,无需注册,无需安装App,即可发送支持发送文本、图片、音视频、地理位置等丰富消息。 5G信息不需要下载App就能支持多款应用功能据悉,数字人民币与 5G 消息融合为用户提供了便捷易用的社交支付能力,为数字人民币的快速推广提供了有力支撑。另外,在风险防控方面,数字人民币钱包交互内容采取加密方式传输,能够更好地防范消息传输风险,有效守护客户的信息和资金安全,未来的交易方式甚至可能完全“去App化”。 9月29日,中国联通产品中心副总经理黄昌建表示,目前中国联通的5G消息全国运营平台已经完成,传统短信、数字短信和5G消息的能力已经集约化起来。5G消息可能会在10月中下旬全国试商用。

优秀的个人博客,低调大师

Tapdata 唐建法:是时候告别ESB和MQ了, 不妨这样“实时”打通数据孤岛

数据孤岛已成企业数字化转型“绊脚石”。 早期系统设计,不考虑数据互通,传统的 ERP、OA、CRM……每个系统都是独立的,不同架构之间具有天然的层级,数据库也多为单体式,在数据指数级增长的今天,陷入性能无法扩展的窘境,数据孤岛问题对企业而言将会“越来越痛”。 如何从根本上解决数据孤岛问题? 近年来行业有着各种各样的尝试,比如数仓、大数据平台、数据中台等几代数据工具和架构,但似乎一直没有找到最佳方案。 原因是,以 Teradata、Vertica 和 Greenplum 为代表的数仓基于 MPP 架构,拓展性较差,跨节点关联计算瓶颈明显,而且不支持半结构化和非结构化数据;基于 Hadoop 架构的数据湖、大数据平台由于是开放式架构,横向扩展性强,能以原始格式存储数据而无需对数据进行结构化处理,近期数据中台更是一片火热,但它们的技术底层仍然以大数据平台的技术为基础,更多只是一种企业管理理念的创新。 在唐建法(TJ)看来,当前大热的主流数据中台解决方案仍存在不少误区: 贪大求全:产品化体验不容易达到,需要大量人力堆砌; 数据业务化走的太远:各种地产中台、营销中台、金融中台...... 已经越来越脱离数据; 几乎都是基于 Hadoop 大数据底层,以离线数据为主:支持的核心业务场景更偏向 BI 报表、各种数据分析等 OLAP 场景,重在对历史数据做洞察和分析。 TJ 强调:回归数据本质。 “为新业务提供统一、完整、实时的数据,并且支持十万级并发和毫秒级响应,能够完美支撑 TP+AP 业务” 才是新时代打通数据孤岛方案的标配。这也正是 Tapdata 在做的事情——打造一个“务实”的实时数据服务平台。所谓“务实”,包括: 聚焦于数据,承担“采集,融合,治理,建模,质量,安全”等核心职责,将“洞察画像,推荐,AI引擎,营销引擎,大屏可视化”等非核心职责由下游业务系统完成。 能够提供离线和“真实时”数据处理能力,即全链路实时:实时获取数据 + 实时处理 + 实时服务,在支撑 AP 型业务基础之上,更能支持 TP 型业务或场景。 通过 Tapdata 实时数据服务平台“实时”打通数据孤岛,从而支撑全渠道业务(OLTP + OLAP): 实时采集融合——建立统一数据平台 实时处理——构建数据资产(模型) 实时服务——支持上层应用业务 无论企业现在有多少个业务系统,用了多少个不同的数据库,Tapdata 实时数据服务平台能以一种无痛接入的方式,使用基于日志同步的数据虚拟化技术,为企业构建一个虚拟、统一的数据访问层。如此一来,企业需要数据的时候只需要到一个中央化的地方,通过Tapdata 提供的标准化接口(tap),就可以简单方便地获取到想要的数据,就像打开自来水龙头取水一样简单。 要实现这一目标看似简单,实则困难重重。比如:实时数据同步的可靠性、反向更新问题,还要考虑各种异构库的同步问题等。 考虑到降低客户建设成本、长期运维成本和学习曲线,Tapdata 率先采用数据即服务(Data as a Service,简称 DaaS)架构理念,没有使用主流的类似 Flink 或者 Kafka 这样的大数据技术,而是自研数据虚拟化技术,相比传统的联邦查询方式,基于同步的虚拟化对技术要求更高,容错性更低,毕竟需要对各种底层实现完全不同的数据库进行事务级别的日志解析,忠实还原并在亚秒级延迟下重放到 DaaS 平台。这个架构没有捷径,Tapdata 经过大量的实战研发,并且在不断优化实现和算法的基础上,形成了技术壁垒,能够安全可靠的将源系统数据无需其他ETL工具,就可以实时镜像到 DaaS 平台,并提供准确的数据服务。 Tapdata 的异构数据源统一访问框架通过定义一个支持绝大部分数据库的标准,从统一的URL连接方式,到富结构的数据模型,到标准的DML和DDL,来为具有多源异构数据库的企业用户提供一个简单、一致的数据访问能力。只需要一种语法,就可以对企业所有数据进行浏览查看,甚至简单的更新管理。 从此,用户无需再做多种存储方案,解决元数据、搜索、缓存、队列等问题,只需使用 Tapdata 实时数据服务平台,就拥有了一个架构简单,部署轻量,低成本和上手快的 DaaS 平台,可为业务应用及大部分数仓、大数据平台和中台建设提供最完整、统一、准确的实时源数据。 Tapdata 秉承开源精神,为开发者服务。目前已通过云上开放的方式( http://cloud.tapdata.net ) ,将异构数据库实时同步能力免费提供给开发者使用,虽然,Tapdata Cloud 还只是 Tapdata 的一小部分功能,但已具备独立完成多达十几种数据库的异构数据同步能力,为新业务扩展,缓存加速, 全文检索,数据库备份容灾等很多新型业务场景提供生产级的支撑,后续会逐步将 Tapdata 的所有能力迁移上云。随着 Tapdata 完成数千万美元 Pre-A 轮融资,将进一步加大研发投入,并适时对核心能力进行开源。 申请试用 Tapdata 实时数据服务平台和了解更多信息 https://tapdata.net/

优秀的个人博客,低调大师

苹果iPadOS 15特性汇总:生产力表现提升 告别“买后爱奇艺”

6月8日凌晨,苹果WWDC21如期发布,其中iPadOS也迎来了自己的全新版本iPadOS15。 苹果在发布会中提到,依托iPdaOS构建的各项独特功能,才令iPad有了独一无二的移动能力和触控表现。 全新升级的iPadOS15也将会使iPad的功能更加丰富强大。 自由奔放的组件排列 今年的iPadOS15将在主屏幕交互上有重大升级,支持小组件和单个应用混合排列,使用者可以按照自己的喜好,随意组合屏幕上的顺序排列,做到极具个性化。 此外苹果还推出了一些适应iPad大屏的小组件,轻轻一扫,即可随意切换影音、游戏和照片等不同类型主页,做到高效流畅交互。 高效整理的应用资源库 为了方便使用者轻松找到不常用的应用,此前的iPadOS 15效仿iOS也推出了iPad的应用资源库。 所有应用都能在应用资源库中轻松找到,使用逻辑和iPhone的应用资源库使用基本一致,但iPadOS上的这个应用资源库可以做到随时从程序坞直接上拉使用,这一点上来说,比iOS的应用资源库更胜一筹。 简单快捷的多任务管理 多任务管理也是iPadOS15的升级亮点之一,相比之前复杂繁琐的分屏操作,此次的iPadOS15新增了分屏控件,在上方拉出即可使用,轻点分屏按钮,之前打开的应用便可向伸缩至屏幕边缘。 这时,我们可以随意的在主屏幕上进行操作,然后再次点按第二款应用时,两个应用就能自动分屏占据整个屏幕,如果想要更换分屏的应用,只需要将不需要的应用下即可。 同时,在分屏的情况下,还支持部分应用的小窗模式打开,比如发布会中演示的邮件应用就是如此。 应用架还支持部分应用的暂存管理,而且支持随意组合分屏,想要选择那款应用,上滑应用架选择即可,非常的方便。 更为强大的备忘录 备忘录作为iPad的核心应用,它的升级直接影响了iPad整体的生产力。 对此,苹果推出了QuickNote,意为全系统快捷备忘录,而启动它也十分方便,只需要拿着ApplePencil从iPad屏幕的角落边缘轻扫,即可打开QuickNote,当我们用完的时候,下拉回去即可。 不仅如此,QuickNote还支持应用识别,可以识别系统和部分第三方应用的链接,需要什么链接和笔记,在QuickNote上直接搞定。 覆盖全局的翻译系统 在iPhone中备受好评的翻译这次也随iPadOS15来到了iPad中,不仅支持实时语音自动翻译,而且全系统所有文本均可以翻译,连照片上的实体文字也照样可以翻译无误。 首次搭载的编译功能 SwiftPlaygrounds作为学习代码的绝佳方式,寓教于乐,深受代码初学者的喜好,在iPadOS15中,iPad的编译功能得以增强,开发者可以在iPad上轻松完成开发。 总结 整体来看,iPadOS15的升级亮点也不少,整体上的提升和生产力都有关,娱乐影音这块,今年好像是没有什么提升,这也表示了苹果对iPad这条产品线的重新定位,期待iPadOS15的后续更新。

优秀的个人博客,低调大师

程序员如何告别无聊?何不创建一些有趣的东西呢?

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 是时候摆脱那些让你厌烦的无聊项目啦。你一定也有很多天马行空的奇思妙想,想要创建一些刺激且有趣的业余项目,但却不确定如何进行。 没关系,本文带着你“找找刺激”! 提高技能的最好方法就是实践。这些有趣又有挑战性的项目是你的最佳选择。 1. 数独 数独游戏大家都不会陌生吧,这些有趣的谜题也是获得算法经验的好方法。本项目的需求是创建一种算法,可用于生成有效的数独游戏。 如果你觉得这太简单了,还可以构建一种算法来解决这些数独游戏。可以执行此操作的一种方法是创建回溯算法。 你可以从中可学到: 学习和实现数独算法 为数独游戏增加一些难度,获得更大成就感 2. 目录应用 如今,创建目录已不再稀奇。但是,这个项目却不同,它可以使用Flutter来运行。Flutter是Google最新的UI工具包,可仅使用一个代码库创建本机移动应用程序。它使用Dart编程语言。最近Flutter可是很火呢! 你可以从中可学到: Flutter Dart编程语言 应用开发 3. 渐进式Web应用 渐进式Web应用程序很热门。由于控制渐进式网络应用程序的范围非常容易,因此这也非常适合作为业余项目创建。 计划构建渐进式Web应用程序时,可以选择Angular、React、Vue等顶级JavaScript框架中的一个,将其结合起来。最好对这些框架进行一些研究,然后选择最喜欢的框架。这样你将获得最佳的学习体验。 你可以从中可学到: 使网络应用逐步发展所需的一切 选择的JavaScript框架 Web开发基础,例如HTML和CSS 4. 自动驾驶乐高车 几年前,我从事过类似的项目,被要求制造一辆由乐高拼成的汽车,该汽车可以在纸上写出某个特定的单词。 该项目旨在使用乐高或乐高技术制造一辆行驶中不会撞到任何物体的汽车。需要用到树莓派Raspberry Pi(或Arduino)、一些乐高玩具和超声波传感器,以避免出现任何障碍。 本项目最有趣的地方就是软件和硬件的结合。如果有人从未接触过树莓派Raspberry Pi(或Arduino),强烈推荐做下这类项目。 你可以从中可学到: Arduino(或Raspberry Pi)的基本用法。 读数传感器。 软件和硬件之间的交互。 5. 汽车分类 聚类和分类是机器学习的一部分。本项目旨在根据汽车有关数据将汽车分类为安全或不安全。这个项目是了解机器学习全部知识的好方法,所需要做的就是数据集。 你可以从中可学到: 掌握机器学习 分析数据 6. 2D游戏 如果一直有尝试游戏开发的想法,那么创建2D游戏绝对是个不错的开始,这将极大地提高编程技能。 你不必为游戏创新而冥思苦想,最好的入门项目就是重建Flappy Bird,无论是在移动设备上还是台式机上都可操作。也可以自己制作游戏,但要记住从小游戏做起。 你可以从中可学到: 实体的运动 横向滚动 碰撞检测 7. 大数据 如果对大数据项目感兴趣,那绝对应该尝试使用芝加哥犯罪数据集。这是一个多分类问题,对于经验丰富的数据科学家来说非常有用。这个问题很容易,但是由于该数据集有超过600万个观测值,所以数据管理异常困难。 你可以从中可学到: 大数据方面知识,例如数据建模 处理大数据集 从列表中选择最有趣的那个,然后开始上手。相信你一定能从中收获良多! 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/live 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-06-07本文作者:读芯术本文来自:“读芯术公众号”,了解相关信息可以关注“读芯术”

优秀的个人博客,低调大师

告别繁琐提升效率,Docker 帮您降低从开发到部署的复杂性

出品丨Docker公司(ID:docker-cn)编译丨小东每周一、三、五晚6点10分 与您不见不散! 在 Mobelux,开发项目永远不会停止。我们一直在研究新的和现有的代码库。无论何时,都有多个版本的 Python、Ruby、NodeJS、PostgreSQL、MongoDB 和 Elasticsearch 投入使用。 在这些不同的环境中运行我们的代码,同时确保每个开发和测试环境都配置了正确版本的软件和守护进程是一件非常痛苦的事情。所有这些可移动的部分都可能破坏生产环境部署的一致性。 为了简化开发和部署,我们开始使用 Docker 和 Docker Compose,它们让我们的工作变得更加轻松。 Docker 的基础介绍 如果这是你第一次听到 Docker,那么我会为您概述它是如何工作的。 Docker 让您以一种一致的、可重复的方式快速、轻松地设置复杂环境。它为您的软件提供了一个称为容器的小型隔离环境,该环境完全独立于运行在您的计算机或其他容器上的其他软件。 然后,您可以将这些容器配置为任何操作系统并安装任何必要的软件,从而可以轻松配置特定于应用程序的需求,而不会影响可能存在冲突需求的其他软件。它在很多方面类似于虚拟机(对于那些熟悉该技术的人而言),但运行的系统资源要少得多。 每个 Docker 容器都是 Docker 镜像的执行实例 —— 一个预构建的定义,内置所有软件和配置,因此它在任何地方运行都完全相同。镜像本身是由一个名为 Dockerfile 的文本文件所构建的,该文件包含一个简单的命令列表,并且可以在必要时不断重建。 这意味着一旦创建了 Dockerfile 文件,任何用户都可以通过它快速构建镜像并运行预先配置了正确软件的容器。您还可以预先构建和发布镜像,以节省更多时间。 您可能知道,大多数的 Web 应用程序和 API 不仅仅只包含一个应用程序。它们使用在其他服务器上运行的数据库、缓存和其他 Web 服务。Docker Compose 是一个与 Docker 一起发布的工具,预装了 Docker for Mac 和 Docker for Windows,它可以让您定义一组容器,这些容器可以一起启动并在专用网络上运行。这样,您就可以在一个本地的、隔离的、自动配置的环境中模拟整个应用栈了。 使用 Docker 进行开发 当您在传统的 Web 平台开发环境中工作时,开发人员必须配置许多内容,并随着平台的发展使它们保持同步。首先,必须安装正确的环境(例如特定的Python、Ruby 或 NodeJS 版本)。仅此一项可能非常耗时,容易出错,并且对于刚接触生态系统的人来说需要处理很多事情,特别是当您添加用于隔离环境的工具和多个项目的库存在于同一台机器上时。 接下来,开发人员需要确保他们拥有正确版本的外部服务,例如数据库和缓存。如果您正在处理多个项目,则可能需要多个版本,并且您必须将它们与您在生产中所使用的任何版本保持同步。每个项目还可能需要任意数量的开发库和系统工具来正确构建和运行。如果没有什么工具可以帮助您,那么整个事情就会变得极其困难和耗费时间。 Docker 就是那个可以拯救您的工具! 使用 Docker,我们只需配置一次,然后将其作为 Docker 镜像发布。当开发人员在同一个项目上工作时,他们会下载最新的镜像,或从项目的 Dockerfile 文件中重建它。它将自动安装所有软件依赖项的正确版本,这样我们就可以确保一切都是正确的和最新的。 通过使用 Docker Compose,我们可以更进一步为正确的数据库、缓存、搜索引擎甚至 Amazon S3 克隆配置镜像和容器。我们配置这些组合栈,以便在开始时启动所有服务,将当前代码的本地副本安装到开发容器中,以便开发人员可以使用其主操作系统的本机代码编辑器和工具,并为开发人员提供命令能够安装任何特定于发行版本的依赖项并运行开发代码。 这节省了我们配置系统和调试配置问题的工作时间。首次设置环境只需要几分钟(甚至几秒)而不是几小时。 作为额外的好处,在整个项目生命周期中的 Bug 数会减少,因为开发人员使用相同的库、基本操作系统和用于运行生产系统的外部服务。任何这些服务和依赖项的更新也可以在本地轻松测试,因此您可以确保它们按预期工作。 使用 Docker 进行测试 在开发测试之后,Docker 仍然是首选工具,它让整个流程变得更简单、更精确。 所有与开发相关的挑战仍然存在于测试中,甚至当不是所有的测试人员都来自于开发或高技术背景时,这种情况会变得更加复杂。Docker 为管理这种复杂性提供了几种不同的选择。 开发人员可以为 docker 镜像提供已经在镜像中的代码的正确版本。通过这种方式,测试人员不需要与版本控制或检查进行交互,以确保他们在本地拥有正确版本的代码。然后 Docker Compose 可用于使用该镜像运行容器以及外部服务的容器,因此他们只需简单地运行 Docker Compose 堆栈,一切都在那里。 如果我们确实需要从版本控制中测试特定代码,那么测试人员仍然可以通过克隆 git 镜像仓库并将其安装到正在运行的容器中,类似于开发过程。不同之处在于,具有需要测试的代码的容器不是转到命令行,而是自动安装当前的依赖项,用基本的测试数据为数据库提供种子,并自动运行该服务。 为了使它更简单,我们一直在使用一个名为 Lifeboat 的工具 —— 一个简单的用于 Docker Compose 的 GUI 和 GitHub Desktop。这使得测试人员可以轻松地启动和停止撰写堆栈,而无需在项目之间导航或在命令行上管理 Docker 和 git。 使用 Docker 进行部署 最后是部署时间,Docker 继续依旧让事情变得更容易。 在传统的服务器部署中,每个服务器必须在部署时手动更新依赖关系。对于使用 Python 或 Ruby 等语言构建的大多数现代 Web 平台,这意味着要联系外部服务器以下载这些依赖项,并且在某些情况下,每次都要编译它们。每次发生这种情况时,都会有存在失败的风险 —— 特别是考虑到服务器操作系统可能与开发或测试发生的地点不同。 在使用Docker时,这些风险会降低或消除。我们首先创建一个镜像并将其部署到 staging,以确保它按预期构建、部署和运行。然后将这个完全相同的镜像(已安装和配置了所有依赖项)部署到生产中,从而消除以前在部署期间出现故障的机会。 从开发到部署,Docker 使开发人员的工作变得更加轻松。我强烈建议大家尝试一下。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册