网易首页 > 网易号 > 正文 申请入驻

百度搜索exgraph图执行引擎设计与实践

0
分享至

作者 | 搜索Go研发组

导读

introduction

百度搜索exgraph图执行引擎设计重点分成三个部分: 图描述语言、图执行引擎、对接扩展。

图描述语言是一种基于文本可读的图描述语言,用于描述任务中的算子以及算子之间的依赖关系,即让人可以理解,也可以被计算机理解并执行。

图执行引擎是exgraph的核心,负责根据图描述语言生成的图语法树进行高效执行。它支持如串行、并行、中断、选择等范式,以满足不同场景下的需求。

对接扩展则提供了与其他协议框架的接口,方便用户将exgraph集成到现有的系统中。

总之,exgraph图执行引擎设计的目标是实现高效、灵活的任务编排,以满足复杂逻辑处理需求。

全4430字,预计阅读时间12分钟。

GEEK TALK

01

背景

搜索展现架构承载模版选择、实时摘要补充、展现数据适配、结果渲染等职责,当前由PHP开发、HHVM执行,对接数十个产品线,数百个精细化的展现策略由100+RD共同开发。随着搜索业务产品日益复杂和生成式大模型产品开发需要,展现架构面临以下难题:

1、HHVM基础设施停止维护,且不支持异步并行支持,架构升级难度大;

2、历史累计的多个展现策略框架分布在各个阶段,且各自参数不同,研发难度大。

通过调研,了解到DAG有向无环图,将DAG图中顶点描述为业务拆分后的一个个算子,边及其方向作为执行顺序,一对一作为串行执行,一对多作为并发执行,即使是很复杂的业务也可以用这套逻辑进行表达。且代码实现较简单,还能用graphviz将DAG图生成图片,将整个逻辑可视化。


△算子化后的逻辑执行视图

好像很完美~~

但似乎还有些问题:

1、对于简单逻辑,DAG图不复杂,用graphviz构建图也很简单,但一旦顶点数量爆发,可阅读性急速下降。而不幸的是,搜索的PHP模块几百个策略,如果迁移进来,预计会有几百个顶点,构建这个图以及这个图的可读性,依然很差;

2、简单意味着功能弱。

  • 比如搜索有多种版式:手百内、手百外、纯NA渲染等,下游顶点根据上游顶点的执行结果来选择不同的版式渲染。这种场景下只能呆呆的在每个版式顶点内自行判断是否执行,而不能由上游顶点直接选择一个版式分支执行。


  • 比如执行到某个顶点,发现后续不用执行了,逻辑执行没有好的退场机制。

  • 各个算子间传递数据怎么处理。

GEEK TALK

02

图执行引擎

DAG能满足大多数场景的需要,但依然不够。所以搜索设计了一套超集于DAG的图描述,并在这个描述上,添加逻辑执行的高级功能,与web框架进行融合,逐步诞生了exgraph图执行引擎。

exgraph图执行引擎设计重点分成两个三个部分:图描述语言、图执行引擎、对接扩展(用来对接协议框架)。


2.1图描述语言

2.1.1 核心语法

算子:业务执行的最小单位,通常一个单词就是一个算子(语法单独定义的关键词除外)。

串行组:即两个算子按照顺序执行,在图上表示为用箭头连接:


△串行组

并发组:即多个算子并发的执行,在图上用中括号[]包围:


△并发组

属性:图上所有用大括号{}包围的,都是属性。属性用于通过图描述传递参数给代码。


△属性

算子、串行组、并发组都是一个执行单元,意味着,他们可以互相包含(算子是最小的执行单元,不能包含别的执行单元)。比如:


△互相包含

上面的这个描述,用人话说就是:

1、执行a算子

2、并发地:

  • 执行b算子,

  • 执行c算子,然后执行d算子,然后执行e算子

  • 执行f算子,然后再并发地执行g算子和h算子

3、最后再执行i算子

子图:主图支持通过文件引入的方式,引入另一个图嵌入到主图


△主图引入sub_graph子图

通过上面简单的介绍,你已经掌握几乎全部图描述语言语法了,可以开始思考,将自己所负责的业务如何用图进行描述了。

另外,为了更好的适配业务场景,exgraph还设计了几种指令来处理特殊场景。

扩展指令

START指令:图开始的标记,用做给图设置属性。


△START指令

目前START指令用来指导创建HTTP的handler,直接让图引擎承接http处理、streaming rpc处理请求。

MIDWARE指令:包装含义。


△MIDWARE指令

可以在执行c算子前,先执行b算子,并控制是否执行c算子;也可以在执行c算子前后,执行一些通用的逻辑。

SWITCH指令:选择执行分支。


△SWITCH指令

可以在switch_pc_or_wise算子内,选择执行哪个分支。

基于图描述语言,用纯文本的方式就可以将业务整体描述,很好的解决了DAG图构图复杂性问题,并允许自定义一些高级用法。

2.2图执行引擎

上面介绍的图描述语言,让“人”可以更加简单的方式了解到程序的执行流程,但也仅仅只是个描述而已。

如何让其按照我们设定的描述将逻辑跑起来呢?

首先介绍一个重要的、执行单元必须实现的接口:


type Job interface{DoImpl(*engine.Context) error

其中*Context负责传递所有信息到各个算子,提供:算子选项(算子{}附带的内容)内容获取、数据传递等功能。

在上面的章节中讲到算子、串行组、并发组都是一个执行单元,其实就是说,它们都实现了Job接口

exgraph图执行引擎是:将图解析后的语法树作为入参,搭配全局算子注册,让算子按照预定的规则执行起来。

它的执行过程近似于:


em~~,简单的有点像把大象放冰箱的过程,但实际远不止如此。

想一下,如果你执行到a算子,发现没有必要执行b算子了,怎么办?又或者a有数据要传递到b算子,怎么办?

2.2.1 对象容器

exgraph中实现了一个并发安全的对象容器,用户可以通过*engine.Context提供的接口,方便的设置和获取对象,就像这样:


type a struct {}
func (o *a) DoImpl(ctx *Context) error {// 算子a,设置对象var a int = 2023ctx.RegisterInstance(&a)return nil
type b struct {}
func (o *b) DoImpl(ctx *Context) error {var a int// 通过类型获取值ctx.MutableInstance(&a)// 打印2023fmt.Println(a)return nil

对象容器再存入时,将其类型作为标识符,取值时也通过相同类型的变量,通过反射赋值。

2.2.2 依赖注入和对象导出

有了对象容器,exgraph设计了支持基于struct tag的对象依赖注入和导出功能,且采用脚本生成代码的方式实现:


type Operator struct {http.Request `inject:""`http.Response `inject:"canLost=true,canNil=true"`*Userinfo `extract:"canNil=true"`
type UserInfo struct {Name string
func (o *Operator) DoImpl(engine.Context) error {// 通过inject,算子内可以直接获取到Request对象if v, ok := o.Request.Header.Get("xx"); ok {// do somethingreturn nil

利用struct tag和生成的代码,用户在使用算子时,实现了以下功能:

1、inject tag可以直接通过算子属性获取对象,省去了繁琐的取值过程,并支持:canLost=true表示允许对象不存在,canNil=true表示循序对象值为nil。

2、extract tag则允许用户直接赋值为算子属性,由生成的代码赋值将对象导出到对象容器中,且支持:canNil=true表示允许导出对象值为nil,repace=true表示允许替换对象。

2.2.3 中断和跳过

为方便程序逻辑执行,exgraph内置了几种中断跳过逻辑:

1、全局错误中断


type a struct {}
func (o *a) DoImpl(ctx *Context) error {// 模拟业务执行遇到了不可兜底的错误err := errors.New("fatal error")// 调用Abort函数即可中断整个图执行引擎ctx.Abort(err)return nil

2、全局正常中断


type a struct {}
func (o *a) DoImpl(ctx *Context) error {// 发现没必要走后面的逻辑// 直接中断整个图执行引擎ctx.Exit()return nil

3、跳过串行组


type a struct {}
func (o *a) DoImpl (ctx *Context) error {// a算子执行跳过`a -> b`这个子集串行组// 即b算子不再执行,但c算子正常执行ctx.SkipSerialGroup()return nil

2.3 执行优化

exgraph执行的一个声明周期内,大部分对象都允许池化。

2.3.1 对象池

对于算子:exgraph内部对每个注册的算子,都是注册到一个sync.Pool中,算子对象在执行完成后,执行reset后返回到对象池内。

对于放入对象容器的对象:在exgraph执行引擎结束时,会循环对每个对象检测是否实现了Release接口,如果实现接口就会调用,用户就可以在Release时将对象reset后返回对象池内。

2.3.2其他优化

exgraph在执行每个算子时默认在当前goroutine执行,除非用户显示的给算子设置了超时时间a{timeout="1s"}。

依赖注入和对象导出,是基于脚本生成代码的,而非反射。

GEEK TALK

03

场景案例

3.1同路径不同逻辑

背景:搜索PC和wise(移动端)同模块执行,检索路径都为/s

方案:可以用SWITCH选择模式,通过一个算子来判断使用哪个分支:


3.2PHP策略迁移Go

背景:搜索展现架构当前逐步由PHP迁移到Go。在过渡期,PHP代码迁移到Go之后,需要通过抽样验证Go代码逻辑无误,即:命中抽样,执行Go代码,否则执行PHP代码。而且需要迁移的PHP策略很多,如果没有统一的机制来支持,成本很高。

方案:用MIDWARE指令,用CommonDealPhpOrGoStrategy算子作为判断包装,判断命中抽样时,允许执行DemoStrategy1算子,并带标识到PHP,不执行PHP相应逻辑。

否则不执行DemoStrategy1而执行PHP相应逻辑。

关键的是,迁移后的Go算子都不需要做特殊处理,正常迁移代码加上MIDWARE就能支持以上功能。


AI 领域大佬欢聚一堂 跳起科目三

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
美国前防长卡特突然身亡,任内对华很强硬,死因:突发心脏病

美国前防长卡特突然身亡,任内对华很强硬,死因:突发心脏病

爱钓鱼的超哥呀
2024-06-04 10:59:10
鹏华美女基金经理萧嘉倩赌博式投资!重仓押注致5月收益倒数第一

鹏华美女基金经理萧嘉倩赌博式投资!重仓押注致5月收益倒数第一

机构之家
2024-06-04 11:08:41
36岁,社区打电话催生三胎,我答:没空生,对方一句话差点气死我

36岁,社区打电话催生三胎,我答:没空生,对方一句话差点气死我

婉秋聊育儿
2024-06-03 11:16:04
一干部被查,涉嫌严重违纪违法

一干部被查,涉嫌严重违纪违法

锡望
2024-06-04 11:14:49
张康阳出局第13天,国米宣布:CEO当主席!苏宁系6人被除名

张康阳出局第13天,国米宣布:CEO当主席!苏宁系6人被除名

小豆豆赛事
2024-06-04 18:43:17
贝克汉姆拥抱哈珀看球赛,却被网友质疑太过亲密,女儿大了要避嫌

贝克汉姆拥抱哈珀看球赛,却被网友质疑太过亲密,女儿大了要避嫌

麦大人
2024-06-03 13:30:19
官方正式表态定性!铁头也说已安全回国,但有3个细节很不对劲!

官方正式表态定性!铁头也说已安全回国,但有3个细节很不对劲!

李大娱乐糊涂
2024-06-04 11:46:11
Shams:詹姆斯已经公开表示 他不会参与球队的选帅工作

Shams:詹姆斯已经公开表示 他不会参与球队的选帅工作

直播吧
2024-06-05 06:09:06
朝鲜副国级高官叛逃脱北,曝光金家秘闻:酒池肉林、80万买轩尼诗

朝鲜副国级高官叛逃脱北,曝光金家秘闻:酒池肉林、80万买轩尼诗

猫眼观史
2024-03-25 14:31:14
最脆弱卫冕冠军!欧洲杯未开打损失7员大将,蓝衣军团还有戏吗?

最脆弱卫冕冠军!欧洲杯未开打损失7员大将,蓝衣军团还有戏吗?

体坛老球迷
2024-06-04 21:42:49
南宁地摊经济疯狂泛滥的5个根本原因!现在制止还来得及么?

南宁地摊经济疯狂泛滥的5个根本原因!现在制止还来得及么?

华庭讲美食
2024-06-04 12:01:03
拜登不参加“和平峰会”,乌克兰失落

拜登不参加“和平峰会”,乌克兰失落

环球时报国际
2024-06-05 07:23:12
詹姆斯:也许独行侠今年能夺冠因他们有欧文 没什么词能赞扬他了

詹姆斯:也许独行侠今年能夺冠因他们有欧文 没什么词能赞扬他了

直播吧
2024-06-05 02:36:07
重创?曝德约右膝半月板撕裂!基本无缘温网,难参加最后1届奥运

重创?曝德约右膝半月板撕裂!基本无缘温网,难参加最后1届奥运

我爱英超
2024-06-04 23:45:26
心虚了?穿马面裙进教堂遭群嘲后,女博主连夜删视频,网友不买账

心虚了?穿马面裙进教堂遭群嘲后,女博主连夜删视频,网友不买账

水泥土的搞笑
2024-06-04 22:16:49
女人在过夫妻性生活时,为什么总发出声音?医生:大多数人不了解

女人在过夫妻性生活时,为什么总发出声音?医生:大多数人不了解

皮皮讲文
2024-01-02 10:36:17
余承东不用嘲笑了,180万特斯拉车主,能扔掉手机支架了

余承东不用嘲笑了,180万特斯拉车主,能扔掉手机支架了

互联网.乱侃秀
2024-06-04 12:24:53
34岁男子应聘墓地巡逻员,月薪18000,每天喝茶遛狗。网友羡慕了

34岁男子应聘墓地巡逻员,月薪18000,每天喝茶遛狗。网友羡慕了

扶苏聊历史
2024-06-03 11:49:59
0-0,意大利受挫,同时还付出了1主力伤退的代价,欧洲杯埋隐患

0-0,意大利受挫,同时还付出了1主力伤退的代价,欧洲杯埋隐患

侧身凌空斩
2024-06-05 06:43:09
中菲两国海军快艇在仁爱礁海域爆发“激战”!

中菲两国海军快艇在仁爱礁海域爆发“激战”!

头条爆料007
2024-06-04 18:33:40
2024-06-05 08:52:49
开源中国
开源中国
每天为开发者推送最新技术资讯
6310文章数 34222关注度
往期回顾 全部

科技要闻

马斯克把特斯拉5亿美元AI芯片提前调拨给X

头条要闻

大选结果揭晓 印媒:莫迪浪潮崩溃 印度发生重大转变

头条要闻

大选结果揭晓 印媒:莫迪浪潮崩溃 印度发生重大转变

体育要闻

从英国联赛到NBA,两个美国人相爱相杀

娱乐要闻

杨幂留言为热巴庆生,姐妹情深惹人羡

财经要闻

六年四换帅,茅台到底经历了什么?

汽车要闻

2.0T+云辇-P+天神之眼 方程豹豹8还配软包内装

态度原创

本地
艺术
旅游
公开课
军事航空

本地新闻

我和我的家乡|踏浪营口,心动不止一夏!

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

旅游要闻

去年中国156人死于户外探险

公开课

近视只是视力差?小心并发症

军事要闻

俄车臣特种部队已转至哈尔科夫 指挥官:进入决战阶段

无障碍浏览 进入关怀版