干货 | 以模型为中心,携程契约系统的演进

一次实时数据链路丢数排查:从 MQTT 队列积压到 SQL 统计开销 本文通过一次实时数据链路压测,排查了从MQTT到ClickHouse的端到端数据丢失问题。核心方法是为每条消息添加序号,建立独立观察点(MQTT订阅端、Kafka消费者),结合转发服务阶段统计与线程栈分析,定位到下游处理速度不足源于Druid SQL合并统计的高开销。优化措施包括关闭SQL合并、扩容代理队列、增强生产侧失败处理,并验证15分钟内实现全链路对账一致,显著缓解积压与丢包。关键收获:数据可对账、明确各阶段“成功”定义、关注客户端队列状态。 阅读详情

作者简介

 

章鱼, 携程资深后端开发工程师,契约系统创始人与核心研发。

Sylar, 携程资深研发经理,专注Java技术栈相关研究。

一、前言

随着微服务化在携程的全面落地,业务被拆解得越来越细,接口数量和内外部调用方不断增多;另一方面,随着产品迭代的不断增速,对接口的修改也变得愈加频繁。

接口契约,作为各端的沟通桥梁,在微服务时代显得尤为重要。如何管理好不断变化的接口契约,是携程机票BU在微服务化过程中遇到的一大难题。本文结合一些契约管理的实践经验,介绍下携程契约管理的演进,以及携程机票BU自研发的契约系统(简称MOM - model object management,以下都以此代替)。

二、携程契约管理演变史

2.1 线下管理契约

在携程机票BU以及其它的一些团队里,早期的契约管理,主要由程序员线下进行。当发生需求变更,需要增加新的接口,或改动原有契约时,由相应的开发线下编辑契约文件(如XSD文件),再生成指定格式的契约(如Java类,Protobuf文件),提供给使用方。

在单体应用时代,或业务没有拆分很细的时候,接口契约并不会太多,调用方也相互熟悉,只要有专人负责线下契约维护,这种管理方式并不会有太大问题。但随着微服务化,接口和契约不断增多,此种管理方式的瓶颈逐渐凸显,问题主要集中在以下几点:

1)线下管理,契约容易丢失。

2)契约变更,只有编辑者才能主动感知,无法很好的周知到所有使用方。若契约变更不当,容易在上线时才发现问题。

3)当有多个需求,需要对同一份契约进行修改时,需手工解决各种冲突,这个过程极易出现问题。就好比不用Git,手工去进行代码分支管理一样。

4)契约可读性差,接入沟通成本大,各团的原始契约也没有一个统一的标准。

2.2 第三方工具管理契约

由于线下契约管理,存在太多各式各样的问题。携程内部各团队都在积极探寻,尝试借助一些第三方工具,去更好地管理契约。常见的有Swagger、Knife4j、YAPI等工具。

Swagger是一款非常受欢迎的开源框架,它通过文档与代码的绑定,能很好地对API进行文档化描述,接入起来也比较方便。Swagger一定程度解决了线下管理契约易丢失、可读性差等问题。但由于Swagger单机或集群的契约管理方式,会使得携程内部各项目(应用)之间,显得比较割裂,所以Swagger并未在携程内部大范围推广。同时,Swagger的界面比较粗糙,文档的编写需要遵守一系列的规范,上手有一定难度。

Swagger

Knife4j是一款国产开源项目,也是用于API文档的生成。与Swagger相比,它有着更加出色的界面,并且能够支持如离线文档、安全控制、在线调试等功能。但是与Swagger有相同问题,Knife4j并不是一个中心化的契约管理方案。

Knife4j

YAPI是去哪儿为推进API标准化,研发的一款API治理工具。本身也拥有丰富的功能,携程内部也有一些团队在使用,但它的设计更注重于API的多样化管理,不支持模型共享,不支持单独模型聚合方式管理,必须要有接口名称和输入输出信息。这些限制给契约的管理带来不少麻烦。

YAPI

总的来说,Swagger、Knife4j和YAPI,将契约管理方式从线下转到了线上,一定程度解决了契约易丢失,可读性差的问题,同时还提供一些API管理的高级功能,如调试、Mock等,那为什么还需要MOM呢?

2.3 为什么研发MOM

携程机票BU结合自己的实践经验,并走访收集了其它团队在契约管理上的痛点,总结出一款好用的契约管理系统,所应当具备的功能有:

1)云端管理,项目、权限管理

2)友好的界面,支持在线编辑

3)版本管理,差异比对

4)契约变更消息通知

5)契约导入,代码生成

6)模型共享

由于Swagger、Knife4j以及YAPI,对以上功能的支持或多或少有缺失,而且它们都是以面向API管理为主,并不能很好地解决上述问题。携程机票BU开始尝试研发MOM,并在近一年内陆续在携程内部推广开来。

契约系统又称为MOM(model object management),从名字就能看出,其管理的是模型对象。这个设计理念也是与Swagger,YAPI等工具面向API做管理的最大不同。

模型,无关于接口实现,无关于契约文件类型,也无关于具体生态环境,它仅由字段组合而成。在MOM中,模型作为被管理的最小单位,可以进行任意的组合与嵌套,通过这种结构化的管理方式,使得契约的描述性更加强大,突出表现在能够模型共享上。

模型管理这一理念,其实也是源于携程机票BU的实践经验。在2017年左右,携程服务端的技术栈从.Net转向Java,前端有iOS、Android、React Native、Hybrid等技术栈,一个接口对应了多份契约文件。同时,随着微服务化的深入,接口数量也暴发式增长,我们发现很多接口契约的部分内容是可以复用的,例如航班信息,主要就包含了航班号,出发到达地,机型等信息。

为了解决一份契约会有不同的文件格式,以及契约复用的问题,MOM设计之初就抽象出模型这一概念,并将其作为底层设计的核心思想,这也使得MOM之后具有良好的扩展性,所有其它工具支持的功能,理论上MOM都能支持。

总的来说,Swagger,Knife4j和YAPI主要关注的都是对API的管理,而MOM更加关注的是对契约的管理。

三、MOM架构

MOM作为一个帮助大家管理契约的工具,在使用频率方面,并不会太高,并发压力不会太大。研发时更侧重于其功能的丰富性。所以,整体的物理架构不是很复杂,但支持的功能以及逻辑单元相对丰富,且留有很好的扩展性。

3.1 物理架构

  

MOM采用双集群进行灾备,使用MySQL管理模型、项目、版本等结构化数据,Mongo用于管理用户上传的原始文件及最终生成的契约文件。系统采用Local Cache + Redis的二级缓存结构进一步降低DB的访问压力,同时用Zookeeper保证各台机器的数据一致性,可能发生变更的静态数据由Schedule定时进行更新。整个系统使用传统的MVC架构进行设计,前端页面使用Angular搭建,服务使用Java进行开发。

3.2 逻辑单元

 

 

从以上的逻辑单元可以看出,MOM主要包含的功能有:项目管理,契约编辑,多版本管理,契约生成,变更通知,以及底层的核心:模型管理。后面会对这些功能进行展开介绍,分享这些功能的相关经验。

四、MOM功能介绍

4.1 契约编辑

契约编辑主要分为两块,契约导入和在线编辑。

4.1.1 契约导入

契约导入,顾名思义是将现有的契约,可以是各类契约文件,导入到系统中, 方便后续的查看和修改。这功能的必要性有一定历史原因,因为各团队维护契约文件的方式都不相同,契约文件类型存在差异,要想后续都在MOM上进行管理,就必须提供这么一个功能方便各方快速接入。

之前也提到过,MOM的核心理念是管理模型,不是具体的接口或契约类型,这一层抽象使得契约导入功能能够很方便的实现,需要支持什么类型的契约导入,开发其相应的文件解析器,将契约文件转换成MOM底层维护的模型即可。

契约导入完成后, MOM界面上统提供树形结构与扁平化的展示方式,方便用户直观看到契约模型的相关信息。目前,MOM支持BJSC(携程SOA契约),Protobuf,XSD,Json Schema等契约文件的导入。后续若要支持更多契约类型,也能很快地进行扩展。

4.1.2 在线编辑

在线编辑是MOM的特色之一,对于历史契约,在用户完成契约导入后,MOM会将用户的契约模型持久化下来。对于新接口新契约,MOM也支持在界面上直接进行创建。后续,当接口需要扩展功能,修改契约时,MOM支持在界面上直接修改并保存。界面上友好的契约修改操作流程,避免了人工编辑契约文件可能带来的问题。

值得一提的是,对契约的编辑修改有一项Best Practice:对于已发布的契约,后续的修改只能是顺序增加字段,不能修改现有字段的名称和类型,也不能在任意位置插入新字段。因为,修改已有字段的名称和类型,必定会带来线上兼容性问题;要求顺序增加字段,主要是针对像Protobuf这类对顺序有强要求的契约格式。那字段越加越多,越来越冗余怎么办?可以考虑另起炉灶升级接口契约,或尝试GraphQL。

4.1.3 契约编辑小结

契约导入和在线编辑是MOM的一大特色。这功能有别于其它工具,因为Swagger、Knife4j、YAPI都是面向API做管理,或与代码绑定不支持导入编辑,或只支持从Postman等工具导入接口。这与MOM专注契约的管理,有本质上的不同。契约可以看作是API的进一步抽象,MOM导入和编辑的是契约,而不是API。

当契约导入后,或完成编辑保存后,数据是以模型进行管理,在MOM上,模型到契约间的转换是双向的。举个例子,导入的是XSD格式契约,MOM将其转成模型进行存储,最终在界面上,MOM又可以将模型转换成各类契约格式,进行展示。

 

4.2 项目管理

MOM中的契约模型,是以项目维度进行管理,项目分为应用与自定义项目。

应用是携程内部的定义,可以包含一组接口,通常也是生产发布的最小单位。通过这种直接与应用一一绑定的方式,可以方便用户快速查找自己应用的契约。

自定义项目与应用的差异,主要在于管理模型的差异上。自定义项目更多用于,存储共享模型、数据埋点模型等, 它们可以脱离携程的生态环境而存在。值得一提的是,模型在不同的项目下是相互隔离的,原则上一个项目只能使用该项目下的模型,如果想要跨项目使用模型,必须先建立项目之间的绑定关系。

为了降低契约被项目成员之外的用户误操作,MOM提供了权限管理,权限实际是建立在应用维度之上的。MOM会定时同步应用权限(谁是Owner、管理员),只有拥有这些角色的用户才允许编辑该项目下的契约模型。

4.3 模型管理

模型管理,是MOM底层的核心。模型是最小的管理单元,契约的节点树是在此基础上进行嵌套搭建的。MOM维护了基础数据类型,除此之外系统允许用户定义自定义模型和枚举类。

MOM参考了Java的设计,项目以文件夹形式进行管理,模型所处的文件路径,决定了模型最终的生成位置。为了更好的进行模型描述,MOM对模型抽象出了模型名称、字段、描述、注解等相关属性,通过构建绑定关系使得共享策略得以生效。

契约系统的模型共享,主要分为项目间的共享与外部jar包内的模型共享。项目间的主要使用场景是,用户构建自定义项目维护共享模型,该模型可以被其他项目中的接口访问,来避免触发冲突规则。外部jar包引用,是通过同包下的同名模型进行相关的替换操作,系统解析maven仓库中jar包中的原始文件, 提取类型的节点树信息,替换项目中的模型。

4.4 多版本管理

    

多版本管理是契约管理的一个重要组成部分。

之前提到,由于需求的快速迭代,团队协作中,契约不可避免的产生多个可编辑的版本。MOM为多个版本提供了相互隔离的环境,并且提供回滚,增量覆盖全量覆盖的相关功能。需要注意的是,版本在发布之后是不允许进行编辑操作的。但是多版本隔离的同时会带来冲突的合并问题,如何解决多版本冲突,提升契约的稳定性更是重中之重。为了解决稳定性问题系统先后提供两种解决方案,其一是版本比较,其二是版本冲突的自动合并。

4.4.1 多版本比较

如何帮助用户更快的发现契约的变更,除了契约变更通知这一种手段外,系统自定义了相关的比较规则,降低用户比较的费力度。核心思路是减少比较内容,突出差异信息。

因为契约的生成格式可以是多种多样的,如果是对每一种生成格式都提供一套比对方案虽然能满足各方的需求,但是必然给系统的维护带来一定的挑战。前文提到系统使用结构化的模型管理,那么是否能提供一种可读性良好,同时能突出展示差异的解决方案?答案是有的。

结合目前线上在使用的契约,参考多方的契约处理格式,最终系统仿照Protobuf的文件定义出模型及接口的比较模板,针对用户关心的主要数据,提取出:字段名、字段别名、注释、模型等相关属性。使得用户比较时可以更直观的发现契约的改动。

当然系统也提供了生成文件的比较,如Java文件,方便特定的用户进行比较。如果有需要,后续也会对其他的格式逐步增加比对支持。

 

4.4.2 版本冲突自动合并

版本比较一定程度上帮助用户发现问题,但冲突合并才是解决问题的关键。能否支持冲突合并,成为考量系统易用性的重要标准。

契约的冲突合并,与代码的冲突合并类似,每当契约需要进行正式发布时,都应检查在其之前是否已有其它修改发布了。若有,则需解决可能引入的冲突。冲突的类型可能是新增类型,或者对某个模型的字段的修改,这些变更如果遗漏,显然是致命的。

针对该问题,系统参考Git的文件管理规则进行设计。契约合并的时机,发生在用户即将发布正式的契约版本时,系统自动拉取最新的发布版本与当前的发布版本进行比较,并做冲突展示,由用户选择解决冲突的方式,允许用户忽略冲突发布,当然相应的结果由用户承担。冲突的自动合并,降低了手工操作犯错的几率,极大的提升了团队协作效率。

 

4.5 契约生成

契约生成是大多数用户比较关心的地方。能否满足各用户的使用场景,对系统而言也是一个重大挑战。

契约系统独立维护了一套描述性极强的模型结构,对于不同的生成契约类型,只需要根据不同契约的生成规则,定制不同的契约模板即可。随着系统的不断迭代,目前已经支持Java、TS、GraphQL、C#、XSD、Protobuf等文件的生成。

此外,光生成契约文件对于用户来说,易用性可能还不够。MOM还支持将生成好的契约,直接发布到代码仓库。目前,MOM已支持直接将契约部署到maven和NPM(Node Package Manager)仓库,只需简单配置仓库地址即可。至此,契约的编辑到部署,可以全在MOM的操作界面上完成,这极大的提高了开发效率。

 

4.6 变更通知

MOM不仅方便了契约维护方对契约进行管理, 也方便了接入方能够很好的查看接入。当契约发生变更时,将变动消息告知所有的关心此契约的人,是很有必要的一个功能。

MOM的通知包含变更通知、发布通知。通知的渠道可以是各式各样的。通知的范围包含项目的管理员、owner、项目的关注人以及项目的调用方。契约系统会把用户的每一次编辑记录进行收集作为后续的通知内容,并把契约的改动可能影响的潜在用户列入通范围。此外,通知内容上提供ReleaseNote的编辑方式,用户编辑完成之后可以选择需要通知的对象及通知的方式进行通知操作。 

目前,MOM的消息通知渠道,主要包括Trippal(携程内部通讯工具) 和Email。系统预留了可扩展性,若需其它渠道的消息通知,可以快速进行开发或配置。

 

五、总结

总的来说,MOM与其它工具最大的不同,是其更关心契约的管理。特别是在敏捷模式盛行的今天,业务变更快速而频繁,不可避免的经常对契约进行修改。如何管理并支持好这些修改,是MOM这个产品需要解决的核心问题。

目前,MOM在携程内部正处于推广阶段,功能也在不断的增强与完善中。后续会考虑剥离携程相关生态的依赖, 在契约导入、契约生成、消息通知等功能上, 做到可插拔可扩展。最终开源到社区,帮助大家解决契约管理的问题。

最后:

  • 如果你维护的项目多,接口契约经常发生变化

  • 如果你的接口文档不清晰,甚至还是线下维护的方式

  • 如果契约模型需要在各项目,各接口间共享

  • 如果你需要生成各式类型的契约,提供到使用方法

  • 如果你有多个团队共同维护一个项目, 契约修改经常冲突

  • 如果你想把契约的变更,及时通知到各个关注方

那你可以参考MOM以模型为中心的契约管理方案,也可以持续关注MOM的后续消息。

【推荐阅读】

 “携程技术”公众号

  分享,交流,成长

携程SOA2.0契约文件VS自动生成插件 携程SOA2.0的XSD文件使用了xml的语法,不易阅读,写错了也不能编译,基于此实现了一个VS插件,完成这个繁琐的功能。 立即下载

相关推荐

K-L展开 (Karhunen-Loeve expansion)

K-L变换

susan_wang1的博客 2万+

DDD下的代码文档生成

一、背景 目前低代码生成领域非常火爆,而且市场价值在逐步上升,很多巨头都在重金投入。低代码的出现意味着程序员可以从大量重复低效的劳动中脱离出来,同时可以更好更快的支持业务解决实际问题,极大的提高了交付价值的效率。那么在DDD中实际上也有一些人尝试使用低代码的方式进行建模,意图将建模过程程序化,自动化,通过模板或者预设脚本得到建模结果。本章内容则重点讨论DDD下的代码文档生成的意义,以及这种思路将带给我们什么启示。 二、观点 2.1 观点1–手动构建 很多研究DDD的人都会遇到这个问题–是否使用低代码来降低建

程序男的专栏 972

Part03 数据结构

本文介绍了CSP-S初赛中常见的高级数据结构及其实现,包括: 线性结构:双端栈、双端队列、单调队列、优先队列和ST表,重点分析了它们的特点、时间复杂度及典型应用场景。 集合与森林:并查集(带路径压缩和按秩合并)和树的孩子兄弟表示法,展示了多叉树转化为二叉树存储的方法。 特殊树结构:包括二叉堆、树状数组、线段树和字典树,详细说明了它们的构建、查询和更新操作,特别强调了线段树的递归实现和字典树的前缀匹配特性。 每种数据结构都配有核心C++代码实现,涉及数组模拟、动态规划和树形结构等编程技巧,适合算法竞赛选手快速

weixin_43863957的博客 1179

DDD领域驱动设计内容分享(十五):从携程订单系统重构,看DDD的巨大价值

携程用车订单业务包括接送机、包车、打车等产线,涉及订单状态管理、支付状态管理、供应商订单状态管理、履约状态管理等功能。履约状态关乎司机相关状态,完成订单需结清额外费用。携程租车订单业务涵盖订单状态管理、支付状态管理、押金扣除记录、供应商订单状态管理、履约状态管理等功能。履约状态主要涉及取还车相关状态。通过划分上下文和明确职责,各个领域负责自己的数据和领域知识。这样一来,订单不再涉及这些字段,而是由数据写入的业务方负责维护。因此,在后续与订单无关的业务逻辑发生变化时,订单无需进行修改。

之乎者也·的博客 1136

基于YOLOv8和PaddlepaddleOCR的微信截图聊天记录提取

本文提出了一种基于YOLOv8和PaddleOCR的微信聊天记录提取方法。首先使用YOLOv8n模型分割出聊天气泡(针对深浅色模式分别训练),通过合成数据集增强模型鲁棒性,召回率达0.995。随后采用PP-OCRv5进行文本识别,利用坐标匹配将气泡内文本送入识别队列,短长文本平均置信度分别>0.98和>0.95。文中特别强调了PaddleOCR不同版本的输出格式差异及适配方案,建议使用3.0+版本。该方法有效解决了直接OCR识别易受干扰的问题,通过气泡分割+文本定位的两阶段策略显著提升了识别准确

2401_87383958的博客 2354

高效数据迁移:ICCAP到ADS的数据导入与导出实战指南

本文提供了从ICCAP到ADS进行高效、准确数据迁移的实战指南。针对射频与微波电路设计中的关键挑战,详细阐述了迁移前的战略规划、ICCAP数据的精细化导出(包括脚本化批处理)、ADS数据的多种导入方法(如Data Items、DML模型库及编程化API),并强调了数据完整性与准确性验证的重要性,确保模型参数和仿真结果在平台间可靠传递。

weixin_29291185的博客 131

SOA2.0 学习摘要

SOA:面向服务的架构。SOA开发流程:1 在助理系统创建服务,包括appID,服务名称等;                        2  定义服务IDL(Interface description language), 生成bjsc定义文件,引入到项目中。                            通过一个工具,生成对应的代码,引入到项目的不同module中(client , ...

SECURE2的博客 1665

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2294

WCF足迹2:契约

契约是WCF中很重要的概念。它是用一种与平台无关的标准语法来描述WCF服务的功能。当客户端获取服务端WCF服务的时候,会根据服务端声明的契约生成客户端契约的复本,客户端和服务端通过契约来实现沟通。一个生活中的例子:比如KFC,它是一家快餐品牌。假设我想通过加盟的方式在我家附近开一家KFC快餐店。首先,我们要向KFC加盟代理提交加盟申请,经过资格申查后,和KFC签述加盟协议。然后,我根据协议中规

hui5390094的专栏 1736

前拉后推计划逻辑适用于哪些行业和企业规模?

《前拉后推计划逻辑的行业适用性分析》摘要:前拉后推计划逻辑(需求端后推锚定交付、供应端前拉匹配资源)最适用于需求波动大且具规模效益的行业,包括家具制造(定制化需求+批量运输)、机械装备(非标设备+部件采购)、消费电子(短周期产品+核心部件备货)及汽车配套(交期绑定+批量生产)等领域。该模式要求企业具备:1)独立计划部门;2)ERP/MES等信息系统;3)资源冗余能力,故更适配中型(1-10亿营收)和大型企业(10亿+)。小型企业需简化应用,仅聚焦关键环节。不适配需求稳定(如快消品)、无规模效益或短周期生产的

追随内心 144

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 384

Apollo- 配置发布钩子:实现发布前后的自定义业务逻辑执行

Apollo 配置发布钩子:实现配置变更时的自定义逻辑 摘要 本文介绍如何通过 Apollo 配置中心的发布钩子机制,在配置变更前后执行自定义业务逻辑。主要内容包括: 发布钩子的作用:在配置发布前后触发校验、通知、缓存清理等操作,确保配置变更的安全性和一致性。 技术实现方案: Server端深度集成方案(推荐):通过扩展ConfigService,利用@Primary和@Bean实现发布前后的逻辑注入 OpenAPI轻量级方案:基于ApolloOpenApi和Webhook实现外部系统联动 核心功能: 发布

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

YOLOv11改进 | 主干/Backbone篇 | 利用目标检测轻量化网络MobileNetV2替换Backbone(yolov11系列全系轻量化)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。其在MobilNetV1的基础上采用反转残差结构和线性瓶颈层。这种结构通过轻量级的深度卷积和线性卷积过滤特征,同时去除狭窄层中的非线性,以维持表征能力。MobileNetV2在性能上和精度上都要比V1版本强很多,其在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中都展现了一定的有效性。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、MobileNetV2的框架原理。

Snu77的博客 2843

Apollo- 全生命周期配置管理:从开发到生产的配置治理落地

选型从来不是比功能列表,而是比治理纵深与工程友好度。维度ApolloNacos(配置模块)Consul KV环境隔离粒度✅ 原生支持DEVTESTPRO等多环境命名空间,且同一 AppID 下不同环境完全隔离互不可见⚠️ 依赖 namespace + group + profile 多层组合,易混淆⚠️ 仅靠切换,无服务端环境强制校验❌ 无环境概念,全靠 key 命名约定配置发布原子性 & 回滚✅ 单次发布即全量生效(强一致性),支持秒级回滚至任意历史版本(带操作人、时间、原因)

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

优快云开发者周刊第27期:Elastic 简化开源授权许可;Severless实战开发小程序;龙芯平台上构建Go语言环境指南

开发者周刊将甄选Top100技术社区/团队博客的每周优质内容,集中推荐给优快云开发者,内容以优质技术文章/视频、精选活动分享为主,每周五推送一期。欢迎关注订阅。 【本周优质内容推荐】 干货 | 以模型为中心,携程契约系统的演进 作者 | 章鱼, 携程资深后端开发工程师;Sylar, 携程资深研发经理 来源 | 携程技术 摘要:随着微服务化在携程的全面落地,业务被拆解得越来越细,接口数量和内外部调用方不断增多;另一方面,随着产品迭代的不断增速,对接口的修改也变得愈加频繁。接口契约,作为..

极客日报 2052

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Apollo- 配置推送机制:长轮询与事件推送的实现原理与配置

请求路径必需 Query 参数appIdcluster推荐 Header(客户端声明最大等待时间)(全链路追踪 ID)成功响应(200)Body:Header:空响应(304)当超时且无变更时返回,客户端立即重试Apollo 官方文档 - 长轮询协议说明🔗 此链接为 Apollo 官网中文设计文档页,包含协议字段完整定义与状态码语义,长期有效。Apollo 的推送不是炫技的“黑科技”,而是一套以稳定性为底线、以兼容性为前提、以渐进式演进为核心不做假设。

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

日均20亿流量:携程机票查询系统的架构升级

导语 | 携程机票查询系统,日均20亿流量,且要求高吞吐,低延迟的架构设计。于是,提升缓存的效率以及实时计算模块长尾延迟,成为制约机票查询系统性能的关键。本文是携程集团机票业务技术总监宋...

QcloudCommunity的博客 1747

干货 | 终于来了!携程开源RN开发框架 - CRN

作者简介赵辛贵,携程无线平台研发部开发总监。2013年加入携程,主要负责App基础框架研发相关工作,曾参与Native、Hybrid和ReactNative框架设计、工...

携程技术中心 3169

干货 | 数据库压力降低90%,携程机票订单缓存系统实践

作者简介Chaplin,携程资深PMO,平时喜欢解决系统相关的问题,包括但不限于分布式/大数据量/性能/体验等,不畏复杂但更喜欢简单。本文旨在分享携程机票后服务订单处理团队,在构建机票...

携程技术 1161

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 410

Elasticsearch ingest pipeline 被禁用之后:性能代价、安全治理与数据入库时间的四种替代方案

生产环境为什么禁用 Elasticsearch ingest pipeline?写入路径同步执行的开销、Painless 脚本的安全治理是根因;而 _ingest.timestamp 出不了 pipeline,ES 8/9 也没有原生入库时间字段。本文给出四种替代方案:采集端注入时间戳、bulk 响应后回写、refresh=wait_for 近似、最小 set pipeline 白名单,附选型对比与踩坑清单。

Sayai的专栏 341

Day3 - Flink 窗口与时间语义:从滚动窗口到迟到数据处理

水位线是一个特殊的时间戳,代表"小于这个时间戳的数据都已经到齐了比如水位线推进到 10:00:05,就告诉 Flink:10:00:05 之前的数据应该都到了,如果还有晚于这个时间到达但时间戳小于 10:00:05 的数据,就是"迟到数据"。窗口大小固定,窗口之间不重叠,数据只属于一个窗口。时间线: 0 10 20 30 40 50 60窗口1: [--------)窗口2: [--------)窗口3: [--------)窗口4: [--------)

YEEMOLY的博客 244

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 510

行业研究报告采购避坑指南:从需求拆解到机构选型的实操逻辑

先说结论:买行业研究报告这件事,坑不在“哪家便宜”,而在“你拿到的数据能不能回答你的问题”。作为一个经常帮企业做采购决策的顾问,我见过太多花了几万块买回一堆PDF却用不上的案例。这篇文章把采购流程拆成五步,每一步告诉你该看什么、该避什么,尽量帮你少交学费。

2601_96585642的博客 221

代购系统改造:服务无状态化、分级隔离

代购系统因链路长、流量脉冲、写放大等特点,高可用设计需聚焦“消灭单点”。通过服务无状态化、分级隔离、数据库与消息队列容灾、监控告警与混沌工程验证,实现MTTR降至3分钟内,支付成功率超99.9%。核心经验:缓存雪崩防于过期策略,跨地域用短TTL GeoDNS,支付降级必须幂等。高可用本质是持续检验“无单点”假设的闭环体系。

2601_95706522的博客 161
上一篇: 干货 | 如何构建系统优化成本,携程出海云原生实践
下一篇: 干货 | 多业务线亿级体量,携程是怎么做账务中台的
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值