数据服务化在京东平台API接口接入的实践

news2024/11/28 0:35:49

数据服务化在京东的实践

导读 本次分享的主题为数据服务化在京东的实践,主要包含三个模块:数据服务化的缘起、成长、如何将系统做得更好。


01

缘起:数据服务化从 0 到 1

1. 缘起

京东数据智能部负责维护数据资产和对外提供数据服务,很多业务方要求我们尽快地提供开放的数据 API 供其使用,但开发一个 API 的平均周期在两周左右,遇到 618 大促时还要提供 80 个接口。在这样的情况下,数据开发工程师提出诉求,是否能只贴 SQL 就可以生成开放数据的 API 接口,同时又能保证接口的性能、支持传入动态的 SQL 参数。基于该诉求而开发了一套解决方案的框架:EZD 框架。

上图为解决方案的示意图,这是相对传统固定的 API 开发模式。最下面的JavaScript 和 Java 是 API 的消费方,上面为 API 的提供方,右边是所有 API 需要用到的数据源。将数据源通过 JDBC 从存储系统中读取出来,然后通过 HTTP 协议或者 RPC 协议开放给业务方使用。基于此套框架,数据开发工程师只需要填写 SQL 后点击发布,系统就会根据 SQL 的内容,通过热部署的方式生成 API 接口,达到一键发布的敏捷交付目标。

2. 接口性能

平台第一个版本的性能存在一些瓶颈,如上图最上面一行为数据库查找 API 的各个环节耗时。系统需要先去查找 SQL 的定义,如果 SQL 是存放在数据库里,那么每一个请求进来时,系统都要先去寻址找到 SQL 后再去数据库里查询,这样的效率并不高。后来把 SQL 都缓存到各个节点组成一张内存路由表来去查找 API 的定义,查找的过程就变得非常地快。后面连接池更换成性能更加高的 Hikari 连接池。最后经过一系列的调优,平台的耗时占比从优化前的 97% 下降到优化后的 1%。

3. 接口的灵活性

好多 API 希望能传入参数,比如查询某条 SQL 时传入部门的 ID,再比如使用 IN 关键字时能否传入一个集合。这些又怎么来处理呢?如上图右小角所示,通过使用冒号的语法将 API 传入的参数注入到 SQL 语句中。

一些查询条件是动态变化的,比如 WHERE 关键词后边到底是使用哪个条件?A、B、C 3 个条件构成的排列组合非常多,从而导致接口的数量较多,能否使用某种方式减少接口的数量?系统使用 SQL 与 FreeMarker 模板结合的方式来解决上述难题,从而减少 API 的数量,比如上图最左边使用 IF 模块判断,只有 IF 语句为 true 时系统才会使用其内部嵌套的 AND 语句。基于这种方法,所有的查询条件都可以是动态,同时它还支持 Switch Case、遍历集合等操作。通过这种形式,可以将原来的 80 个接口减少到 5 个接口。

02

扛鼎:数据服务化 – 从 1 到 10

京东 618 大促期间对外公布的成交额、热门品类、公关媒体的数据,各平台的实时销量,PV、UV、优惠券的发放情况都需要有看板去支撑,看板上特别多的指标数据都是通过上述提到的数据 API 展示出来的。

系统是如何在短期内迅速地支持这么多的指标呢?比如京东的年货节,需要在两周内完成几百个指标的开发。另外,一些响应比较慢的存储,能不能一键添加缓存?如何充分利用存量的 API?接口之间会形成一个特别复杂的请求链路,怎么来调试这个复杂的链路呢?一些业务方有自己的 elasticsearch、Redis、HBase,这些存储怎么去开放这个 API 呢?

1. NoSQL 存储生成 API

我们使用 elasticsearch-sql 组件执行 SQL 查询 ES 存储,该组件支持原生 painless 的 Script。对于 Redis 我们会让这个用户直接填好需要读写的 KV(系统支持添加通用的前缀),系统返回 list、map 等数据格式。对于 Hbase,用户填写需要查询的列簇和列,系统支持 get 和 scan 方式。

2. 一键添加缓存

作为通用的数据服务平台,目标是希望做到添加缓存的机制与业务解耦。即无论是什么样的业务,进行一键添加缓存的操作时,数据开发工程师只需要填写 SQL,系统都会自动地增加缓存。基于这些考虑,我们设计了两种缓存的机制,一种是被动缓存,一种是主动缓存。

被动缓存的更新是由用户来触发的,或者说是接口请求时触发的。当系统收到一个请求时,如果缓存的条目没有击中,那么就会去创建缓存条目,它的优点是传入的参数是可以动态变化的。比如有三个请求进来,分别传入了参数 A、参数 AB、参数 ABC,那么这三个不同的参数组合会分别生成不同的缓存条目。被动缓存的缺点是 QPS 有毛刺,因为当条目不存在时,第一次请求接口时需要查询数据库。

为了解决被动缓存的毛刺问题,我们提出了主动缓存的机制,将缓存更新的逻辑托管给平台,由平台定时地去更新缓存。另外,针对传入参数动态变化的情况,数据开发工程师只需要提前填好缓存的参数,当平台定时更新缓存时就会取这些参数去加载数据。主动缓存的优点是不会出现缓存失效的情况,所有的请求都会命中缓存,所以它的 QPS 是没有毛刺的,缺点是需要提前填好入参的排列组合。

平台不支持缓存全量的数据,缓存存储的不应该是全量数据,而是高热的数据。如果是业务方的需求是想要使用内存数据库提高查询效率,那么我们建议他们使用专门的内存数据库。

3. 服务编排

一些特别复杂的需求,需要大量的 API 来通过编排、组合,甚至中间的进行二次加工,然后加上一些条件判断来形成一个复杂 API。如何来完成这样的挑战呢?比如在 618 大促遇到如下挑战,618 活动是从 17 号晚上 8 点钟开始到 19 号 0 时,这 28 小时内的不同时间段的统计逻辑是不一样的,使用的接口也是不一样的。我们希望把这些不同的统计逻辑都封装到 API 里,屏蔽掉这些复杂的业务逻辑。

如上图左侧是一个线上运行的编排图,整个编排链路中存在好多节点和分支,通过条件判断选择分支,调试的时候输入参数便可以直接看到接口请求的执行的链路(图中绿色的点),一目了然且方便排查问题。系统的编排的底层逻辑是一个工作流引擎,它与审批工作流不一样,它是自动流,无需人工介入。内部的好多指标都是通过这种形式来迅速的搭建 API。

03

静思:数据服务治理

早期的服务简单,直接使用单体应用提供服务,后面随着业务越来复杂,会将服务拆分成多个层级和模块,从而导致系统的复杂性急剧上升,如何对数据服务进行有效治理呢?

抛开业务和技术,治理无非是包含人员、政策、流程等因素,通过这些因素的组合,使组织达到一个期望的行为。上图左下角展示的环状图就是一个流程,其中包含了政策的创建、管控、治理、宣讲、执行。比如交通治理,驾驶员为客体,执法部门制定交通规则,交警执法进行约束,从而使整个流程正常运转。

数据服务由提供数据的生产方、使用数据的消费方以及治理方组成。服务市场将数据服务分层,由最底层的订单、商品、用户实体提供服务,中间存在实体交互的过程,比如交易、广告投放,最上面是具体的应用场景,比如分析、交易、营销。

经过治理方的规则贯宣,服务查重,服务分级,服务评价,质量控制,发布卡点等一系列前置操作后,才能将服务提交到服务市场中。通过生产方、消费方、治理方互动的形式来完成数据服务治理的过程。

04

问答环节

Q1:数据服务的灵活性非常地高,但这种灵活性是否会带来安全或者性能等的冲击挑战?

A1:平台包含 MySQL、ClickHouse 等数据来源,每个数据源都有所有者或者负责人,数据源的负责人要对自己数据源的安全性进行把关。由负责人将数据源授权给某个 API 的分组,只有被授权的分组才能使用该数据源。对于系统性能这个问题,平台的负载仅仅占到 1%,对于 API 而言,其最大的性能瓶颈在于数据库,性能优劣完全取决于数据库的性能以及 SQL 语句,针对这个情况我们引导用户直接与数据库团队进行沟通协调、压力测试,通过这样的协作模式来保证服务的质量和稳定性。另外,系统拥有分布式限流的能力,在请求量超过系统能承受的最大负载时进行快速熔断,从而保护系统。

Q2:写了一个 MySQL 数据源的 API,能否可以把数据源更换成ClickHouse 或者其他的 SQL 数据源?

A2:如果 SQL 语句能够在新的数据源上执行,那么是可以的。如果 SQL语句中存在某些特定关键词或者函数只能在原有数据库引擎上执行,那么就不能直接将数据源修改成其它数据库。

今天的分享就到这里,谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1218763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

类BERT模型蒸馏原理

如果你曾经训练过 BERT 或 RoBERTa 等大型 NLP 模型,就就会知道这个过程非常漫长。 由于此类模型规模庞大,训练可能会持续数天。 当需要在小型设备上运行它们时,可能会发现你正在为当今不断提高的性能付出巨大的内存和时间成本。 幸运的是&a…

单片机语音芯片在工业控制中的应用优势

单片机语音芯片,这一智能化的代表产品,不仅在家庭和消费电子领域发挥着重要的作用,更为工业控制领域注入了新的活力。将单片机语音芯片与语音交互技术相结合,为工业设备的控制和监测提供了前所未有的解决方案。 首先,…

【Hello Go】Go语言运算符

Go语言运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符运算符优先级 算术运算符 如果之前没有其他语言基础的小伙伴可以参考下我之前写的C语言运算符讲解 这里主要讲解下Go和C运算符的不同点 – 运算符 Go语言中只有后置 和后置– var a int 5a--fmt.P…

宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三)

来源:宏集科技 工业物联网 宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三) 教程背景 通过之前的教程,我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装,并创建了一个计数器项目。在本期教…

小型内衣洗衣机什么牌子好?性价比高的迷你洗衣机推荐

现在洗内衣内裤也是一件较麻烦的事情了,在清洗过程中还要用热水杀菌,还要确保洗衣液是否有冲洗干净,还要防止细菌的滋生等等,所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的,专门的内衣洗衣机可以最大程度减少…

用护眼灯到底好不好?适合小学生用的五款护眼台灯推荐

如果不想家里的孩子年纪小小的就戴着眼镜,从小就容易近视,那么护眼灯的选择就非常重要了,但是市场上那么多品类,价格也参差不齐,到底怎么选呢?大家一定要看完本期内容。为大家推荐五款护眼台灯。 一、书客护…

几种典型的深度学习算法:(CNN、RNN、GANS、RL)

以下是几种典型的深度学习算法: 1、卷积神经网络(Convolutional Neural Network,CNN):主要用于图像和视频等视觉任务。通过使用卷积层、池化层和全连接层等不同类型的神经网络层,CNN 可以学习图像中的特征并…

Apache DolphinScheduler在通信行业的多集群统一建设与管理实践

背景介绍 为什么我们考虑构建统一的调度平台? 主要原因是:我们公司的大数据中心目前拥有七个大数据集群,这些集群分布在不同的机房,例如内蒙、南京、苏州和广州。而且,这些机房之间的网络并不互通。如果每个集群都独立…

校园跑腿小程序源码系统+多校园版+取快递+食堂超市跑腿+外卖 带完整的搭建教程

大家好啊,又到了罗峰给大家分享源码的时间啦。今天要给大家分享的是一款校园跑腿小程序源码系统。这款系统功能十分强大,开发了多校园版。众所周知,校园跑腿的发展是从外卖配送一点点演变过来的,而校园跑腿的基础性服务项目就是帮…

智慧城市安全监控的新利器

在传统的城市管理中,井盖的监控一直是一个难题,而井盖异动传感器的出现为这一问题提供了有效的解决方案。它具有体积小、重量轻、安装方便等特点,可以灵活地应用于各种类型的井盖,实现对城市基础设施的全方位监控。 智能井盖监测终…

如何创建react项目

可以直接通过react脚手架进行创建 首先确保自己是否安装了create-react-app npm install -g create-react-app 如果安装不成功有可能是有缓存,可以先清除缓存再重新安装 npm cache clean --force 安装成功后就可以使用脚手架创建自己的项目,my-react就是我的项…

求臻医学:当MRD遇到肺癌 见招拆招,斩草除根

当MRD遇到肺癌→见招拆招,斩草除根 浅谈MRD在肺癌中的应用 新辅助治疗后,可以通过MRD来辅助评估预后,一般MRD阴性与新辅助治疗后的pCR (病理完全缓解)相关,达到MRD阴性或pCR的惠者预后更好. MRD在肺癌中可潜在解决的问题点1.术…

成都瀚网科技有限公司抖音带货是否靠谱

成都瀚网科技有限公司,作为一家专业的科技公司,近年来积极参与了抖音带货的浪潮,凭借其出色的产品和服务,赢得了广大用户的信赖。 在当今的数字化时代,抖音带货已经成为了一种非常流行的购物方式。消费者可以通过抖音平…

Linux中的进程等待(超详细)

Linux中的进程等待 1. 进程等待必要性2. 进程等待的方法2.1 wait方法2.2 waitpid方法 3. 获取子进程status4. 具体代码实现 1. 进程等待必要性 我们知道,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内…

抖音自动评论助手,其开发流程与需要的技术和代码分享

先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 在当今这个信息爆炸的时代,我们不难发现,无论是在线上还是线下,我们都无法忽视一个重要的信息传播工具——抖音。这款短视频平台以其强大的传播…

为什么选择CodeEase?

目录 为什么选择CodeEase核心功能后端前端 框架结构总结 为什么选择CodeEase CodeEase是一个标准化的低代码平台 愿景 我们励志开发一站式服务,缩短网站开发周期,降低程序bug率,减少开发人力和成本,推出了多租户SaaS平台开发模板…

集合贴——智能客服是什么

基础课1——智能客服的定义-CSDN博客文章浏览阅读166次。智能客服是一种采用人工智能技术的客户服务方式,它通过语音识别、自然语言处理、语义理解等技术,实现了与客户的自动交互。https://blog.csdn.net/2202_75469062/article/details/134406392?spm1…

基于STM32的温室自主灌溉系统(论文+源码)

1.系统设计 本课题为基于STM32的温室自主灌溉系统,通过查阅多种文献和的设计了如图2.1所示的温室自主灌溉系统总体架构,整个系统在器件上包括了主控制器STM32F103,温度传感器DS18B20,土壤湿度传感器YL-69,光敏电阻,显示器LCD1602…

js实现tab栏切换

目录 1、排他思想实现 2、事件委托实现 1、排他思想实现 思路: 需要点击谁,就先获取谁,获得的是一个伪数组 遍历数组,并给数组里的每个元素添加点击事件,写一个active类用于显示边框样式 每一个元素对应一张图片&…

系列六、JVM的初始内存和最大内存怎么配置?

一、JVM的初始内存和最大内存怎么配置? 可以通过虚拟机的-Xms、-Xmx来配置,而且这俩配置的大小一样,避免GC争抢内存导致的不稳定,忽高忽低。 二、如何查看JVM默认的堆内存大小 /*** Author : 一叶浮萍归大海* Date: 2023/11/16 14…