0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OSC开源社区 来源:百度Geek说 2024-01-16 10:27 次阅读

百度搜索exgraph图执行引擎设计重点分成三个部分:图描述语言、图执行引擎、对接扩展。 图描述语言是一种基于文本可读的图描述语言,用于描述任务中的算子以及算子之间的依赖关系,即让人可以理解,也可以被计算机理解并执行。 图执行引擎是exgraph的核心,负责根据图描述语言生成的图语法树进行高效执行。它支持如串行、并行、中断、选择等范式,以满足不同场景下的需求。 对接扩展则提供了与其他协议框架的接口,方便用户将exgraph集成到现有的系统中。 总之,exgraph图执行引擎设计的目标是实现高效、灵活的任务编排,以满足复杂逻辑处理需求。

01

背景

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

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

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

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

78d11e08-b396-11ee-8b88-92fbcf53809c.png

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

好像很完美~~

但似乎还有些问题:

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

2、简单意味着功能弱。

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

78dadae2-b396-11ee-8b88-92fbcf53809c.png

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

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

...

02

图执行引擎

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

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

78e4f496-b396-11ee-8b88-92fbcf53809c.png    

2.1 图描述语言

2.1.1 核心语法

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

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

78f04544-b396-11ee-8b88-92fbcf53809c.png

△串行组

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

78f7be0a-b396-11ee-8b88-92fbcf53809c.png

△并发组

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

7905bd3e-b396-11ee-8b88-92fbcf53809c.png

△属性

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

7912ba8e-b396-11ee-8b88-92fbcf53809c.png

△互相包含

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

1、执行a算子

2、并发地:

执行b算子,

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

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

3、最后再执行i算子

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

791e27e8-b396-11ee-8b88-92fbcf53809c.png

△主图引入sub_graph子图

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

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

扩展指令

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

7926b07a-b396-11ee-8b88-92fbcf53809c.png

△START指令

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

MIDWARE指令:包装含义。

793830ac-b396-11ee-8b88-92fbcf53809c.png

△MIDWARE指令

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

SWITCH指令:选择执行分支。

7945c0dc-b396-11ee-8b88-92fbcf53809c.png

△SWITCH指令

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

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

2.2图执行引擎

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

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

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

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

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

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

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

它的执行过程近似于:

7950b7bc-b396-11ee-8b88-92fbcf53809c.png

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 = 2023
    ctx.RegisterInstance(&a)
    return nil
}


type b struct {}


func (o *b) DoImpl(ctx *Context) error {
    var a int
     // 通过类型获取值
    ctx.MutableInstance(&a)
     // 打印2023
    fmt.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 something
    }
    
    return 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"}。

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

03

场景案例

3.1 同路径不同逻辑

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

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

7945c0dc-b396-11ee-8b88-92fbcf53809c.png

3.2PHP策略迁移Go

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

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

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

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

795e76fe-b396-11ee-8b88-92fbcf53809c.png








审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RPC
    RPC
    +关注

    关注

    0

    文章

    102

    浏览量

    11423
  • PHP
    PHP
    +关注

    关注

    0

    文章

    452

    浏览量

    26454
  • DAG
    DAG
    +关注

    关注

    0

    文章

    16

    浏览量

    8106

原文标题:百度搜索exgraph图执行引擎设计与实践

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [分享]最强山寨版搜索引擎震惊世界-熊熊搜索

    日前,一款名为“熊熊搜索”(Bearsou.com)的搜索引擎引起了不少网友的关注,这个搜索引擎一眼看去和普通搜索引擎区别不大,但仔细一看,这款搜索
    发表于 11-22 18:58

    [灌水]如何提升网站在百度的排名

    搜索引擎!第一,关键词的优化我想这是最基本的要求了,特别注意在title、description标签中包含关键字对网站优化具有非常显著的效果,可以参考关键词百度前十名的网站的关键词,页面的内容要围绕
    发表于 11-09 16:55

    [原创]怎样提升网站在百度的排名??

    搜索引擎!第一,关键词的优化我想这是最基本的要求了,特别注意在title、description标签中包含关键字对网站优化具有非常显著的效果,可以参考关键词百度前十名的网站的关键词,页面的内容要围绕
    发表于 12-01 17:01

    发现百度搜索页的网站前加了图标

    `发现百度搜索页的网站前加了图标今天在搜索内容时,发现很多知名网站都在网站名前加了ICO图标。如下图:再看了一下我们的bbs.elecfans.com,发现并没有此图标,看来这个得研究一下。感觉百度
    发表于 01-05 23:16

    百度浏览器1.2 beta版发布

    和IE保护模式的优点,创造出更加安全的上网环境。4、智能地址栏依托百度搜索亿万级数据,给您提供最贴心建议、为您打造最智能的地址栏。 5、无需调用其他下载程序,使用浏览器内建的下载就可以完成大多数下载任务
    发表于 07-19 09:01

    下载百度到桌面_把百度下载到桌面

    。 安全浏览模式融合了沙箱技术和IE保护模式的优点,将您与病毒木马完全隔离,还您“无菌的上网环境”。依托百度搜索亿万级数据,给您提供最贴心建议、为您打造最智能的地址栏。 下载地址:百度浏览器`
    发表于 10-26 17:16

    想组装一台电脑,无意间在百度搜索 yxokjob ,原来是个......

    本帖最后由 gk320830 于 2015-3-9 13:48 编辑 之前买了一台笔记本,但现在感觉还是台式比较好用。经过多方比较,还是组装好,所以最近去百度搜索一些电脑组装配置清单。突然QQ闪动,叫去百度一下yxokjob就知道了,我就糊里糊涂百一下,点击进去看,
    发表于 03-05 17:35

    百度地图离线API调用教程

    API下载地址: 2、制作过程2.1下载瓦片打开水经注百度电子地图下载器,将地图缩小至全球可见,框选上全球(1),双击左键,弹出“新建任务”,设置下载名称和选择下载级别,这里我选择的是1到6级(2
    发表于 01-24 09:42

    百度VS谷歌?不要开玩笑了!

    AlphaGo都赢了李世石百度还是在做新闻的载体欢迎大家百度一下“谷歌技术发展”我们不拿百度和谷歌比就百度和谷歌的搜索比技术层面上说1.
    发表于 03-16 10:44

    百度总裁:百度在人工智能领域已有重大突破

    上接受记者采访时说,百度大脑是百度在人工智能领域的核心。百度此前发布的诸多人工智能产品,如无人驾驶、智能搜索等,都是基于百度大脑的能力。ww
    发表于 07-01 15:22

    百度绿萝算法

    百度绿罗计算方法是百度搜索引擎在二月份上作弊计算方法。计算方法主要与超级链作弊作斗争,例如超链接代理,销售链接和购买链接。 计算方法的推出不无效果阻止恶意交换链接,发表外部链接的行为,不无效果清理
    发表于 10-10 09:47

    百度、英伟达联合举办搜索创新大赛 搜索引擎变革 搜索+AI

    近日,百度文心一言宣布向全社会开放,首日,百度搜索就有超3亿次需求由生成式智能引擎解决;百度搜索“AI伙伴”当日访问用户数突破400万。 在这样的背景下,9月7日,以“新
    的头像 发表于 09-07 19:32 722次阅读

    百度携手 NVIDIA 举办“第二届百度搜索创新大赛”火热进行中,五大赛道等你挑战!

    百度搜索携手 NVIDIA 共同发起的第二届百度搜索创新大赛,今年以「新搜索 · 新奇点」为主题,正火热进行中! 作为一项全国性的科技竞赛,百度搜索创新大赛被誉为
    的头像 发表于 09-28 18:25 502次阅读
    <b class='flag-5'>百度</b>携手 NVIDIA 举办“第二届<b class='flag-5'>百度搜索</b>创新大赛”火热进行中,五大赛道等你挑战!

    百度搜索推出AI拜年新能力 AI春节仪式感拉满

    春节AI拜年新体验,百度搜索春节期间推出AI拜年大礼包!
    的头像 发表于 02-05 10:38 2w次阅读

    百度搜索推出AI拜年新能力

    随着人工智能技术的迅猛发展,百度搜索始终站在技术前沿,致力于为用户提供更加智能化、便捷的服务。百度搜索重磅推出了AI拜年新能力,在春节期间,让用户能够更加轻松地表达祝福、传递情感。
    的头像 发表于 02-05 10:54 5596次阅读