为业务系统赋能,携程机票最终行程系统架构演进之路

2024-03-16 09:12

本文主要是介绍为业务系统赋能,携程机票最终行程系统架构演进之路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、背景

携程机票订单系统是由多个业务子系统组成,包括出票、改签、航变等等,获取订单行程信息复杂度较高。

例如:用户预订了一个包含了2个乘客的机票订单,该订单发生了航变,其中用户A选择了退票,用户B选择了改签。

业务系统需要获得该订单最新的行程信息以及行程变化轨迹,以进行展示和进一步处理。

图片

上述例子用户的最新行程信息为:

  • 乘客1:航班号9C888,SHA-PEK,已退票
  • 乘客2:航班号9C999,SHA-PEK,已改签

历史的系统设计需要通过API对各业务子系统的数据进行实时的聚合和计算,如果要获取上述例子的最终行程与轨迹,需要至少调用订单、出票、改期、航变系统等,流程复杂且耗时高,并且针对一些复杂的业务场景还可能导致错匹配、漏匹配等问题。

图片

总结下来有如下几个问题:

  • 数据私有(分散),数据模型不统一
  • 按照时间线进行聚合的难度大,需要动态计算,耗时长
  • 数据存储周期不一致,完整性不高
  • 数据分析困难,报表逻辑复杂
二、目标

总的来说,我们需要设计一个用户行程系统来满足以下要求: 

  • 完整准确的行程信息
    信息丰富完整,并保证更新及时、准确
  • 使用便利
    一站式获取,使用方效率提升,方便使用方快速接入
  • 性能可靠
    系统性能良好,可靠性高
  • 提升业务系统自动化率
    提升自动化率,上线灵活
  • 快速实现复杂业务流程
    对于大量动态数据的分析与过滤需要快速实现并上线
三、实施方案

3.1 设计思路

Q1:系统需要提供什么样的能力?

1)提供准确的用户最新行程信息

用户和相关的业务系统需要及时和方便的获取到完整、准确行程信息

2)输出历史行程变化轨迹

对于退票等场景,需要了解用户完整的行程变化轨迹,以便于自动化处理相关数据

3)通过行程信息进行模糊匹配

对于航变场景,航司通知某个具体航班发生了变化,系统需要通过这些信息匹配到对应的订单并进行后续的处理

Q2:如何确保信息的丰富和准确?

1)在丰富性方面,可以接入大量的数据源并提供便捷的接入方式,及时有效的采集数据,提升系统数据的完整性

2)在准确性方面,可以采用主动 + 被动等方式,多维度的对数据进行校验、修复,提升数据的准确性

Q3:如何提升系统的稳定性和可扩展性?

1)通过分布式缓存、结构化并发等技术提升系统的性能与稳定性

2)通过数据库的sharding、数据仓库的赋能等方式提供在线和离线的数据处理能力,进一步扩充数据的应用场景

3.2 系统架构图

最终行程系统主要有以下几个方面组成:

1)最终行程数据通知与更新系统

即上图中的Data Collector API,通过收集各种来源,如订单库、出票系统、改签系统等的数据,更新或者落地在最终行程系统数据库中。同时在落地的时候也会进行被动 + 主动相结合的数据校验机制,保证数据的准确性。

2)最终行程查询系统,即上图中的Query API,其中包含三大功能与若干个模块

  • 最终行程查询,对外输出该订单的最终行程信息,该接口流量最高,包含有缓存组件、熔断器、限流器等,保障其性能的稳定;
  • 行程溯源轨迹查询,对外输出该订单下所有行程变化的历史轨迹,使用方可以通过该接口拿到这个订单的行程关系图,感知所有变化轨迹;并且整合了价格计算模块、错误数据修正模块;
  • 行程匹配查询,通过给定的行程要素条件,匹配能够对应上的最终行程记录,并支持批量查询;

3)数据存储架构,通过分库提升数据库的水平扩展能力,并且结合数据仓库为业务赋能

3.3 信息丰富性

支持多种更新机制,方便接入多种类型的通知方,提升信息的丰富度,目前已经接入了出、退、改、航变、票号中心等22个数据源。

策略1: 系统主动通知,适用于对于数据新鲜度要求较高的场景,查询性能较好

策略2: 消息通知消费,适用于数据新鲜度要求不太高的场景,通过反查保证数据最终一致,方便系统解耦

策略3: 实时查询,适用于数据变化非常频繁,新鲜度要求高的场景;减少了数据冗余,但是在查询和使用上存在依赖

策略4: 动态数据的过滤通知,适用于存在规则变更,但变化维度和订单维度不同,需要扫描海量数据来获取更新记录的场景

3.4 便利度增加和业务提升

3.4.1 降低溯源接口接入复杂度

溯源轨迹接口对于行程关系图的输出形式,对于使用方的便利度影响非常大,比如如下的行程关系图。

图片

历史的输出形式为一种无限层级的树形结构,这样的结构虽然能对向下的溯源查询以及对一变多的行程变化关系提供支持,但是对于向上的溯源查询、多变一、多变多的行程变化关系不友好,许多使用方都需要使用DFS等算法来解析数据,不够简洁易用,容易出错;并且树形结构已经不能直观的反映出类似二变一(中转变直飞)的行程变化场景,而且这样的结构还会出现数据的冗余,如下图所示:

图片

基于以上的情况,新溯源接口选择了类似图的邻接矩阵来表述行程溯源变化关系,通过TripInfo节点来表示顶点数组,平铺出行程溯源关系图中各个节点的行程信息;通过ChangeInfo节点来表示边数组,主要描述行程变化关系。这样的描述更加通用、结构清晰并且对使用方更友好。

图片

3.4.2 支持大量动态数据的扫描与过滤

在实际的业务场景中需要维护这样一部分数据,它会发生变化,但引起变化的规则维度与订单维度不一致,所以需要扫描海量数据来获取需要被更新的记录。同时,扫描依赖的数据可能还需要跨库才能拿到,按照现有的数据库结构实现起来非常复杂。通过调研,最终采用数仓并结合业务SDK过滤的动态数据主动更新机制,实现了业务场景主动更新与通知的功能,该流程有如下几个特点:

图片

  • 轻松整合所有依赖数据项,通过数据仓库的大数据分析能力,可以轻松整合所有依赖的数据项
  • 对数据进行筛选,在数据仓库处理的流程中,添加了业务SDK的过滤机制进行数据的初筛,将海量数据进行过滤,并结合Double Check机制进行进一步的筛选,得到真正受影响的记录
  • 触发消息的聚合机制,同时考虑到了业务误操作后又修改一次的情况,所以增加了消息聚合机制,聚合一段时间的消息后再真正触发数仓进行处理

该流程具有很强的通用性,通过简单替换不同的SQL语句,切换不同的SDK,就可以轻松将该流程移植到其他业务项目中,实现了功能的快速上线。

3.5 性能优化

3.5.1 提升数据库的水平扩展能力

最终行程系统在之前使用的是单库存储,但是随着数据量的不断增加,当业务信息扩充时,新增数据字段在数据库层面上变的难以操作;并且如果按照业务期望的存储时间,硬盘使用率会过高,造成了存储瓶颈。

经过调研,决定对最终行程数据库做 Sharding 处理,将数据平均分配到多个分片就可以满足存储要求并兼顾性能指标。

1)数据切分,基于最终行程数据特性,即订单号访问占比较高,同时在订单号分布均匀的前提下,最终采用了订单号对数据库总分片数取模的方式,以保证数据分布的均匀性。

2)数据兼容,对于sharding库和非sharding库双写新数据的操作,并考虑数据库存在异常的情况,需要增加异常补偿处理机制;并且对于历史存量数据,也进行了分批次的数据迁移以及补偿功能,同时为了保证数据一致性,在迁移完成后也进行了多批次的数据对比与接口对比工作,保证 Sharding 数据的准确性和可靠性。

3)查询性能,多分库的查询性能是分库存在的典型问题,对于最终行程来说,采用非订单号查询操作,分库后就涉及到多个分片的 All Shard 查询,极大地增加了数据库压力和影响查询性能。经过数据统计,分析得到特定的业务字段查询其实就涵盖了非订单号查询的大多数,从而增加其二级索引表就可以有效解决 All Shard 查询性能的问题。

3.5.2 接入Redis缓存提升系统性能

总体上采用先操作数据库,后删除缓存;先查询缓存,查询不到缓存则查询数据库,并回填缓存的方式进行处理。

1)提升新鲜度,在行程更新流程时、接收BinLog消息时、接收业务变更消息时都会将缓存删除。

2)采用分级储存查询的模式,查询时根据调用方所需的数据级别进行获取,缩小Redis获取数据的大小,减少网络开销。

3)异步回填,启用专用的线程对缓存数据进行异步回填,这样可以不拖累查询请求本身的耗时。

4)优化缓存容量,对Json序列化器定制规则,不输出值为null的字段;将序列化对象中的字段通过@JsonProperty注解取一个简短的别名,来简化Json字符串Key的大小;使用Zstd压缩算法对序列化后的数据进行压缩;通过前期调研命中率和生存时间的关系,得出达到预期命中率的最小缓存生存时间,从而进一步减少Redis的容量。

3.5.3 结构化并发在匹单接口中的探索

最终行程匹单接口允许使用方传入多组条件进行匹配,接口内部对于这多组条件采用的是for循环的方式顺序执行的,存在并发改造的空间;且匹单接口操作数据库存在多shard查询的情况,对于多shard查询,Dal底层会使用线程池并发调用,对线程的开销较大。综合上述问题,并结合近期发布的新的长期支持版本JDK21,发现了其预览功能中的结构化并发比较适用于匹单场景的优化。

1)简化多线程编程,增强可观察性。

一般而言,如果我们想要实现并发操作,需要使用异步编程的方式来实现,但是使用这样的方式对于代码阅读性和调试来说都比较差。在目前的多线程开发中,常用的方式是使用CompletableFuture的级联方式编写。与单线程的代码相比,这样的写法并不直观,并且“任务终止不干净”和“等待超过必要时间”的问题仍然存在,如果要解决这些问题还需要自己实现一系列模版代码,费力度大大增加。

而结构化并发的一大特点就是让开发人员以类似单线程的方式来编写多线程代码,他引出了一个结构化任务作用域(Scope)的概念,在这个作用域中创建并执行任务,这些任务的生命周期都由作用域来负责管理,开发人员可以不用关系细节问题。对于作用域的任务使用try-with-resources块,如果在执行中出现错误,会自动调用StructuredTaskScope的shutdown方法来终止执行,调用shutdown方法会阻止新任务的执行,同时取消正在运行中的任务。

图片

2)使用虚拟线程解决阻塞问题。

StructuredTaskScope底层默认采用了虚拟线程进行实现,在我们原来的认知中,线程的使用都是昂贵的,而虚拟线程是JVM中Thread类的实现,它是轻量级的,当使用虚拟线程进行代码执行时,如果遇到阻塞操作,便会释放掉载体线程;并当该阻塞操作可用时,虚拟线程又将被安排在载体线程上去继续处理执行。即在虚拟线程中,阻塞不是问题,因为阻塞时底层的载体线程已经被释放了

虚拟线程和结构化并发的组合将非常强大,虚拟线程使阻塞不再是一个问题,而结构化并发为我们提供了更简单的多线程编写方案,以更直观的方式处理异步编程。

3.6 优化前后数据支撑

  • 数据库QPS降低30%
  • 数据库CPU平均利用率下降20%
  • 平均响应时间降低40%,P95降低30%
  • 减少机器线程数41%,CPU利用率降低25%,显著减少机器压力
  • 快速支持了业务功能,人力成本节约至少50%以上
四、后续规划

1)易用性优化

增加行程变化订阅通知机制,进一步提升易用性。

2)可靠性与性能提升

  • 细化熔断和降级的策略
  • 和框架团队协作,积极推广新技术在生产系统上的规范化落地
  • 探索新的数据库结构与数据库选型,提升关系链路的存储能力

3)可视化

实现整体客人行程的可视化界面,依托最终行程数据的力量,帮助业务/产品开发更快了解到订单全貌,帮助提升问题解决效率。

  

这篇关于为业务系统赋能,携程机票最终行程系统架构演进之路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815005

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同