干货 | 跨多业务线挑战下,携程订单索引服务的1.0到2.0

置顶必读(1) |《滚雪球学 Spring Boot 4.x》专栏目录导航篇(持续更新中)! 🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。 阅读详情

作者简介

唐巍,携程用户平台部订单服务组资深后端开发,在互联网尤其是移动互联网方面有丰富的经验,目前主要负责OrderIndex的维护和架构升级工作。

经过团队几个月的努力,我们最近终于完成了OI(订单索引服务)从1.0到2.0升级的里程碑,上线了新的数据同步平台和对应的数据查询服务。在这里我们总结了其中的经验和心得,希望能给大家,尤其是有做跨多业务线或者复杂系统需要升级改造的同学们,一点启发或者是帮助。

 

一、什么是OI?


携程的众多业务线订单信息分布在各业务线不同的订单系统之中,有各自独立的查询服务,而公司内部又存在着大量跨业务线查询统一订单信息的诉求,为解决这样的痛点,OI 项目应运而生。

OI的全称是OrderIndex(订单索引服务),是“携程APP-我的携程-订单列表”的订单信息数据源,是一个以“聚合不同数据来源的订单信息,并提供统一分类查询功能”为核心业务的系统。

 

二、OI 1.0

OI1.0是目前支撑OI业务的主力系统,上线于2013年。查询服务基于公司的SOA服务治理平台开发。订单同步和辅助Job基于公司的作业调度平台(JosWS)开发。

      

其中核心机制如下图。

640?wx_fmt=png

OI 1.0的订单同步机制

                           

数据同步以及下发流程如下:

1)对应业务线订单的订单同步Job,从业务线的订单数据库通过扫描相关表的时间戳,来感知订单变化(获取变化的订单号orderid);

2)通过业务线提供的拉取订单详情的SQL从业务线订单数据库读取订单详情相关数据;

3)根据业务线提供的业务,将从业务线数据库拉取的订单详情相关数据转化为实际的订单数据,并规整后保存到OI的数据库中;

4)在OI的接口调用方通过SOA服务来查询订单信息的时候,将我们同步过来的订单信息透传下发;

 

基于这样的架构和机制,截止目前,OI 1.0聚合了超过50+数据源,160+业务线的订单数据,总量超过5亿条。并通过实时数据查询服务以及订单变更消息通知以毫秒级的订单同步延迟,支撑了下游超过200个系统共计日均4亿+次的订单查询需求,并且,这些数字还在不断的变大。可以预见,OI 在之后还会承担更重要的责任。

虽然目前OI 1.0看起来仍然运行良好,但是随着 OI 业务的不断扩展,我们也发现了一些问题。

 

1)业务线提供的数据源只支持直连DB,并且需要提供的接入信息非常复杂

  • 需要Db提供生产核心订单库的访问权限,有安全风险

  • 需提供所有相关表的表结构以及字段说明,并提供跟实际订单信息之间的关联转化逻辑

  • 绝大部分情况下,订单的信息变更必须反映到订单主表的时间戳变更上,否则无法感知到订单变化

 

2)业务线提供的订单数据源结构各不相同,还需结合配套业务使用

  • 订单接入和修改需要我方产品、开发、和测试人员理解业务线的所有相关业务,并理解其原始数据到 OI 数据的转化过程,沟通成本和出错率高,响应也相对较慢(上线周期长),易出错。

  • 由于各接入方数据不标准,验证数据和业务的正确性需要熟悉业务的开发、测试人员人工进行,比对点和工作量都很大。

 

3)大量的订单接入方(业务线),和 OI 服务的调用方希望我们接入大量的非标准字段,由于旧系统的各种限制,往往难以支持或者周期漫长

  • 1.0系统并不支持扩展字段的添加,所有的扩展字段添加都需要定制开发(从指定 db 指定表的指定字段获取数据,再经过某种业务进行处理,最后落我们空余的某个 db 字段),若无空余字段,则无法支持

  • 由于1.0系统中我们的字段大多有固定含义,所以能借用存放的空余字段不多

  • 由于借用空余字段的存放,所以下发的部分字段,在不同场景下有不同的含义,数据使用方需知业务线原始业务,以及 OI 的字段命名映射逻辑(OI 下发的数据字段名跟业务方字段名不同)

 

4)OI感知订单变化依赖于业务线提供的 Sql 定制开发,出于对性能考虑通常只能扫描订单主表的变更,若订单变更有独立于订单主表之外的,感知订单变化的部分的实现会特别复杂。

  • 一旦业务线修改感知订单变化的业务或者新加渠道,OI 都需要重新修改代码,或者新增 Job 支持

  • 订单直接物理删除,感知不到变化,需业务线配合,新增物理删除订单信息同步

 

5)同步 Job 依赖于公司的 Job 调度平台,由于调度平台的限制,

  • 每新增一个 Job 都需要开发一个对应的 Job 类,并发布代码,流程长,风险大

  • 若一个实例需要多活,需要在 Job 调度平台中针对每个实例,单独手工配置 Job 调度任务

 

6)公司内的合作部门,有数据接入 OI 的需求,但是因为目前系统的实现机制评估下来工作量,以现有的人力完全无法支撑。

 

下图是我们迫切需要解决的问题:

640?wx_fmt=png

于是我们决定对 OI 进行改造升级,彻底解决这些问题。


三、OI 2.0

首先,我们对于 OI 进行了重新定义:

OI 是一个提供了基于标准化流程接入,针对订单数据提供统一汇聚、检索、输出、管理的数据平台。

基于全新的定位,重新设计了OI,新的架构如下:

640?wx_fmt=png

OI 2.0的系统架构

 

主要改造方向有如下几点:

640?wx_fmt=jpeg

针对订单变更检测重新设计,提供新的接入方案。

1)业务线订单服务在更新订单时推送变更消息。

优点:时延最短

缺点:需业务线配合,开发成本高

2)基于订单数据库相关表的 Binlog 通过 Canal 组件推送变更消息。

优点:时延可以接受<500ms,开发成本极低

缺点:中间环节多,故障点增多,并且只支持mysql数据库

3)扩展了基于 sql 的变更检测,无需业务线再提供 sql,而是提供关联 db 信息。

优点:中间环节少,时延较低(<200ms)

缺点:耦合高,依赖业务线数据库访问权限

 

640?wx_fmt=png

 订单详情标准服务化改造

我们针对获取订单详情方式进行了重新设计,抛弃了过去通过 sql 直连 db 读取数据,在同步 Job 中进行转化的模式,重新抽象了订单的基础 MetaData,并以此为基础设计了一套新的标准详情服务接口契约,以此将业务进行抽像,将具体的业务实现从 OI 中剥离了出来,返还给了业务线。

640?wx_fmt=png

OI平台化

 

将订单变更检测和订单详情数据源,以及订单的部分特殊标准信息(如订单状态等)全部作为meta通过统一配置管理平台来进行管理,并且自研了 Job调度模块以支持根据配置的数据源 MetaData,动态的生成同步 Job 来执行数据同步任务,并进行数据校验。

同样,SOA 数据查询服务基于相同的 MetaData, 来提供数据查询服务。

基于新的设计,订单同步流程也采用了新的模式。

640?wx_fmt=png

平台化后的订单同步流程

1)首先,将需要同步的数据源 Meta 信息通过配置管理录入。

2)OI 同步平台根据数据源 Meta 信息生成同步 Task 和对应的同步 Job (若同一数据源有配置多种感知渠道,则生成多组同步 Task 及对应 Job)。

3)通过配置的订单感知渠道(db,消息队列,SOA服务),感知订单变化。

4)通过统一的标准 Facade Order Detail Service 获取,标准 MetaData 描述的订单信息。

5)将订单信息经过校验和变更比对后,更新(加入)到 OI 数据库。

6)通过标准 MetaData 的订单实体信息查询接口,将订单数据下发给服务调用方。


四、OI 2.0平台化,我们做了哪些具体的工作?


4.1 重新设计了统一接入信息模板,通过统一配置管理服务管理

基于平台化后的系统,重新设计了一份标准订单接入的信息模板,用来取代之前跟每个业务线针对所有数据源逐一讨论商定的接入信息文档。(不过暂时不支持接入方自主录入,需线下提供,审核完毕后,再录入Meta信息)。通过这个改变,将过去接入过程中贯穿始末的业务讨论时长从数周缩短到了一两次会议(电话或者面谈)就能沟通完毕的程度。

4.2 自研 Job 调度系统(JobHost)

我们放弃了使用公司已有的成熟通用 Job 调度系统,自研了一套 OI 定制的Job 调度系统,通过定制开发,支持了一些原本很难实现的功能。

1)结合统一信息模板,极大的简化了订单同步 Job 的复杂度,OI 的JobHost 默认会基于配置动态生成常规(Normal)同步 Task,同时也支持手工指定要同步的数据源来生成任意多个自定义的同步 Task(如针对部分数据进行数据清洗的补偿 Job,OI 1.0由于设计原因仅支持一个),并支持通过对数据源的开启标志的控制,实现对相关Job的实时联动控制(公司的调度系统需手工操作)。

2)运行状态监控粒度更细,由于定制开发,所以针对各种 Job 的不同运行步骤,设置了更丰富的监控点,更好的了解 Job 的运行状态。

3)除了守护 Task 会保持心跳,检查 JobHost 中运行的 Job 健康状态,尝试进行自动恢复外,我们还设计了人工干预的机制,可以针对运行在每一个实例中的任意 Job 进行更细微的调整。

4.3 自研的数据查询引擎(Sql+内存过滤, 根据策略编译查询条件)

为增加数据平台对异构数据存储结构的支持以及提供特定场景下的db数据读取优化,我们自研了一套简易的数据查询引擎。

上层服务只需要将数据查询请求,转化成平台统一的 OrderQuery,再注入一套 OrderQuery 编译策略,以支持将 OrderQuery 中的查询请求和过滤条件,转化为 DB 执行的 SQL语句以及内存中过滤的OrderFilter(同一过滤条件,在不同场景下通过SQL直接过滤,或者内存中过滤,效率可能会不同,查询引擎会根据编译策略,选择将该过滤条件build进sql语句中,或者是生成对应的OrderFilter)。

 

五、改造完成后的成果

前面零零散散讲了很多细节,大家对改造效果可能没有很直观的认识,我们再来看一张图。

640?wx_fmt=png

这是我们在确认改造方案后,第一阶段的整体目标。

1)通过平台化改造以后,OI 不用再针对每一个业务线(订单业务类型)做定制开发,通过平台提供统一支持即可,整体复杂度降到了 O(1),即使不熟悉 OI 的订单接入方,或者组内同学,又或者测试的同学,凭着简单的文档,也可以直接上手了,不用业务线再提供 sql 和 db 字段说明,也不用再提供 db 字段到实际订单数据的业务逻辑。

2)改造完成后,新接入一种订单(数据源),或者下线一个数据源只需要通过配置管理配置好数据源的 MetaData 即可,无需修改代码,也无需重启服务,实现了热插拔和热更新。

3)通过标准详情接口,将溢出到 OI 的业务线订单业务彻底归还业务线,业务线业务发生变动的时候,直接同步修改详情接口实现即可,无需再拉上 OI 一起排期改造,效率大大增加。

4)结合1-3带来的效率提升,在 OI2.0 数据平台上进行业务变动,在业务线准备好的情况下,基本上都能实现T+0上线。

5)基于全新的标准化改造,我们可以针对不同运行环节增加统一的监控点,实现更灵活的监控扩展。

最后,来看一张图:

640?wx_fmt=png

这是之前,第一个里程碑完成时的 OI2.0交付情况。目前OI数据平台,已经能够多订单系统复用,支持携程订单体系和集团的某关联企业订单体系。

基于这还算坚实的第一步,我们会继续一步一个脚印,继续去完成我们所描绘的蓝图。

【推荐阅读】

640?wx_fmt=jpeg

携程开放平台API对接实战:签名机制、核心接口与订单同步全流程解析 在OTA分销与酒店管理系统集成中,开放平台API对接是串联产品上架、库存查询、订单确认等业务链路的关键技术环节。本文从接入模式选择与账号权限申请切入,解析直连、人工操作与第三方中间件三种方式的适用场景;随后深入拆解MD5签名算法的计算流程、JSON请求规范及沙箱联调要点,强调参数排序、空值处理和时间戳格式等细节。围绕酒店库存查询、订单创建、取消与状态同步机制,说明如何通过幂等设计和“异步回调+主动查询”双保险机制保障数据一致性。最后汇总高频错误码排查思路与上线安全自检清单,为开发团队提供一套可落地的携程接口 阅读详情

相关推荐

ScreenInk 0.0.1.exe

ScreenInk 0.0.1.exe

关于携程多玩对接-订单对接

关于携程玩乐开放平台对接订单api

沉闷萝卜的博客 2959

外盘期货历史高频tick数据涵盖CME、ICE等交易所的主要品种,包含能源、贵金属、农产品、股指和外汇期货 数据字段有交易日期、精确到毫秒的时间、成交价格、成交量、持仓量以及买卖方向标识 部分品种还提

外盘期货历史高频tick数据涵盖CME、ICE等交易所的主要品种,包含能源、贵金属、农产品、股指和外汇期货。数据字段有交易日期、精确到毫秒的时间、成交价格、成交量、持仓量以及买卖方向标识。部分品种还提供盘口五档或十档挂单数据。所有数据按交易日压缩打包,解压后为CSV格式,便于直接读取分析。 数据源:CMES金融数据库

干货 | 万字长文详解携程酒店订单缓存 & 存储系统升级实践

作者简介荣华,携程高级研发经理,专注于后端技术项目研发管理。军威,携程软件技术专家,负责分布式缓存系统开发 & 存储架构迁移项目。金永,携程资深软件工程师,专注于实时计算,数据分析工程。俊强,携程高级后端开发工程师,拥有丰富SQLServer使用经验。前言携程酒店订单系统的存储设计从1999年收录第一单以来,已经完成了从单一SQLServer数据库到多IDC容灾...

携程技术 2053

三相PWM整流器双闭环控制仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了三相PWM整流器双闭环控制的Simulink仿真模型,重点实现电压外环与电流内环的协同控制策略,通过仿真验证系统在稳态与动态工况下的运行性能。模型涵盖主电路拓扑结构、PWM调制技术、坐标变换(如abc/dq变换)、PI控制器设计及双闭环控制逻辑的实现,能够实现单位功率因数运行、直流侧电压稳定控制以及网侧电流正弦化等目标。同时,文档进一步拓展至VOC(虚拟同步发电机控制)与SVPWM调制相结合的高级控制策略,提升了系统的动态响应能力与控制灵活性。; 适合人群:具备电力电子技术与电力系统基础知识,熟悉Simulink仿真环境的电气工程及相关专业的本科生、研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解三相PWM整流器的工作原理及其双闭环控制策略的设计方法;②掌握基于Simulink的电力电子系统建模、仿真与控制系统调试技术;③为后续研究电压源换流器(VSC)、虚拟同步控制(VOC)、微电网并网控制等先进电力电子控制技术奠定理论与实践基础。; 阅读建议:建议结合经典电力电子教材与本仿真模型同步学习,重点关注PI控制器参数整定、坐标变换模块的搭建逻辑以及系统稳定性分析方法,有条件者可进一步将仿真结果对接实际硬件平台进行实验验证,以深化对控制策略工程应用的理解。

【Telephony】APN配置及加载流程&项目实践(AOSP)

学习APN关键是学会明白apns-conf.xml文件各个参数的意思,然后熟悉TelephonyProvider是如何读取文件创建数据库的,譬如数据库表的约束、文件的读写顺序等,还有读取后的ApnSetting的二次定制以及显示(例如屏蔽xcap等)。虽然一般在项目中APN的需求很简单,就是按照客户提供的APN参数添加上配置,或者在显示屏蔽一些参数,但是项目维护的过程中APN的问题也是比较多的。

weixin_44513784的博客 5505

干货 | 降低复杂度提升效率,DDD在携程用车/租车订单系统重构中的实践

作者简介小白龙,携程资深后端开发工程师,关注架构落地、研发效能领域。随着历史业务不断迭代和业务场景越来越复杂,携程用车、租车(简称两车)面临历史技术债和系统复杂度越来越高带来的理解、维护、迭代困难等问题,我们开始寻求如何更有效的降低复杂度和提升效率的方法。本文描述了两车如何利用DDD(Domain-driven Design,领域驱动设计)方法论降低系统复杂度以及在重构历史系统中的取舍和思考。对于...

携程技术 2850

zabbix 监控EMC存储

经过搜索,找到了脚本地址,该项目应该是模板原作者创建的,该项目也有zabbix模板,和上面的应该是相同的,我用的是上面的模板。./unity_get_state.py --api_ip='X.X.X.X' --api_port='443' --api_user='zabbix' --api_password='PASSWORD' --storage_name="zabbix web前端配置的主机名" --discovery。修改权限,给zabbix用户执行权限,模板调用时以zabbix用户执行。

wangyfde的专栏 3753

干货 | 携程商旅订单系统架构设计和优化实践

作者简介Gavin, 携程技术专家, 致力于系统优化、重构和开发效率提升。概述携程商旅是一站式互联网差旅服务平台,为客户提供差旅管控、预订、出行、结算、成本、风控等服务的在线TMC(Tr...

携程技术 5317

scRNA-seq | 吐血整理的单细胞入门教程(从原理到代码实操)(二)

scRNA-seq | 吐血整理的单细胞入门教程(从原理到代码实操)(二)

m0_72224305的博客 4305

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

将指定文件夹下每张用LabelImg标注的图片中标注部分抠出来保存到指定文件夹下。

weixin_44119674的博客 438

秘密武器 | 看AnalyticDB如何强力支撑双十一

简介:第12个双11已圆满结束,但对技术的探索永不止步。每年双11,不仅仅是剁手族的狂欢节,更是数据人的“大考”,是检验阿里云数据库技术团队技术水平与技术创新实践的舞台。本站已陆续推出双11护航背后的数据库技术实践与经验分享系列干货文章,敬请关注!今天为云原生数据仓库AnalyticDB的技术解析。前言每年双十一购物狂欢节都是云原生数据仓库AnalyticDB MySQL版(原分析型数据库MySQL版)的一块试金石。今年AnalyticDB除了在阿里数字经济体内进入更多核心交易链路,全力支撑双十一以外,An

阿里云开发者 1001

手把手教你学Simulink——基于经典PID控制的电机系统场景实例:BLDC电机PID电流控制策略仿真

*无刷直流电机(Brushless DC Motor, BLDC)**因其高效率、长寿命和低维护成本,在众多领域如家用电器、工业自动化、电动汽车等得到了广泛应用。为了实现对BLDC电机的有效控制,通常采用基于霍尔传感器或反电动势检测的换相技术,并结合电流闭环控制以提高系统的动态响应和稳定性。本教程将带你使用构建一个基于PID控制的BLDC电机电流控制策略仿真模型BLDC电机建模PID控制器设计与应用系统仿真与调试控制效果分析本文介绍了如何使用构建一个。

MHD0815的博客 196

携程行程&订单团队敏捷之旅

转自本人运营的公众号“携程技术中心PMO”(ID:cso_pmo) Key:Trip.com,携程,携程PMO,携程技术,敏捷开发,PMO,PMI,PMP,Scrum,Agile 关于我们 我们面临的挑战 敏捷开发是以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。先把一个大项目分为多个相互联系、可独立运行的小项目,再分别完成,而在此过程中软件一直处于可使用状...

互联网PMO 669

【Codecs系列】x265编码器(十二):子像素运动搜索

在基于块运动补偿的视频编码框架中,运动搜索是最为重要的环节之一,同时也是编码端最为耗时的模块。运动搜索包括整像素运动搜索和子像素运动搜索,其中整像素运动搜索已经有很多快速算法,比如经典的三步搜索法、菱形搜索、六边形搜索以及TZSearch等等;但子像素搜索的快速算法却比较少,本文主要讲解x265编码器中的子像素搜索方法以及相关的快速搜索方法。

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 747

《Python星球日记》 第73天:情感分析与主题建模

《Python星球日记》 第73天:情感分析与主题建模,今天我们将探索两个自然语言处理领域的重要技术:情感分析和主题建模。这两项技术在社交媒体分析、用户反馈处理、市场研究等多个领域有着广泛应用。

Code_流苏:在代码中寻诗意,在实践中觅真知 919

干货 | 30+条业务线,携程微信小程序如何协同开发

作者简介携程前端框架团队,为携程集团各业务线在PC、H5、小程序等各阶段提供优秀的Web解决方案。产品涉及各类前端/Node端应用框架、研发工作台、前端中台化、静态资源发布系统等。当前主...

携程技术 2793

OTA 升级失败/回滚策略设计:打造安全可靠的双分区/断点续传/签名校验方案

双分区机制(A/B Partitioning)是OTA升级的“保险箱”。简单来说,设备存储分为两个分区:A分区(当前运行)和B分区(备用)。升级时,新固件写入B分区,A分区保持不变。如果升级成功,系统切换到B分区运行;如果失败,设备直接回滚到A分区,完全不受影响。这就像玩游戏存档:你打Boss前存了个档,万一挂了还能读档重来。双分区就是设备的“读档”机制,避免了变砖的尴尬。以Android设备为例,Google从Android 7.0开始强制引入A/B分区机制(Seamless Updates)。

大模型大数据攻城狮的专栏 1231

领域驱动设计之聚合与聚合根实例一

通过一个实例来说明如何划分聚合与聚合根 场景:一个下订单的业务,一个订单必须有相应的客户信息,订单下有订单项,每个订单项必须有相应的产品信息,产品有分类的信息。 1.根据这个基本的需求,我们初步确定的实体、值对象与关联关系为(这里采用EF的Model First): 2.经过业务深入分析,以及聚合与聚合根确定原则,最终我们确定的聚合与聚合根是(红色代表聚合根,蓝色代表聚合内的实体,灰色代...

weixin_30642561的博客 720

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

关于订单业务的一些思考

1、商品业务 业务思想: 一般的订单业务设计:主要分为3part, 主订单表, 子订单表, 订单详情表。 图(1) 售前:拿货 售中:卖货 履约:给货 售后:退换 1...

chutongg028083的博客 967

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

微服务:知识点梳理(SOA、服务拆分、服务治理、分布式事务)

微服务面面观 微服务基本 单体应用 单体应用的优点? --易于开发 --易于测试 --易于部署 存在的问题: --代码耦合,开发维护困难,提交代码频繁出现大量冲突 --主要业务和次要业务耦合,无法针对不同模块进行针对性优化 --单点容错率低,并发能力差,无法水平扩展 --技术选型成本高 --交付周期长,小功能要积累到大版本才能上线,上线开总监级别大会 微服务和SOA ...

琦彦 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

滴滴Elasticsearch多集群架构实践

作者 | 魏子珺编辑 | 小智Elasticsearch 是基于 Lucene 实现的分布式搜索引擎,提供了海量数据实时检索和分析能力。Elastic 公司开源的一系列产品组成的 Elastic Stack,可以为日志服务、搜索引擎、系统监控等提供简单、易用的解决方案。滴滴 Elasticsearch 简介 滴滴 2016 年初开始构建 Elasticsearch 平台,如今已经发展到超过 350...

weixin_34380296的博客 886

干货 | 多业务线亿级体量,携程是怎么做账务中台的

作者简介本文为联合撰文,作者团队负责携程集团支付账务系统、消费金融账务系统、清结算和对账等工作的的开发、设计和运维工作。一一、前言原先携程内部的各账务系统都是随着自身的业务发展而建立起...

携程技术 1460
上一篇: 干货 | 携程机票 React Native 整洁架构实践
下一篇: 干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案
携程技术
博客等级 码龄10年 3715粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值