浅谈小程序开源业务架构建设之路
一、业务介绍
1.1 小程序开源整体介绍
百度从做智能小程序的第一天开始就打造真正开源开放的生态,我们的愿景是:定义移动时代最佳体验,建设智能小程序行业标准,打破孤岛,共建开源、开放、繁荣的小程序行业生态。百度智能小程序的生态玩家有三类,分别是:联盟合作伙伴、开发者和用户。对于联盟合作伙伴,满足合作伙伴的生态共建、流量共享、商业共赢诉求,使得合作伙伴App内缺失场景得到高效补充,拉动合作伙伴App用户使用时长,共享小程序的变现收入。对于开发者,满足了开发者一次开发,多端运行诉求,使得开发者流量获取更加便捷高效、并且增加开发者商业收入。对于用户,满足用户的无需跳出即可享受一站式服务诉求。百度搜索做为小程序的十分重要分发入口,通过构建统一的小程序行业生态, 提升百度的搜索生态中的用户体验、服务闭环。
百度智能小程序开源的架构是如何支撑起整个联盟生态运转的呢?
如图所示,小程序开源联盟的整个业务架构分位四层。包括:联盟宿主层、对外联盟赋能层、中间服务层、基础建设层。
-
联盟宿主层。百度智能小程序已经接入非常丰富的联盟宿主,包括OPPO浏览器、VIVO浏览器、小米浏览器、爱奇艺、百度极速版等等。
-
对外联盟赋能层,百度智能小程序开源联盟主要通过开源联盟平台对宿主提供入场能力、经营能力、资源输出能力,以支持开源生态成员的入驻、配置、集成、准入检测、小程序信息、物料信息、分佣、订单信息、运营等诉求。宿主通过资源输出模块拿到小程序以及物料的数据后,可以在自己的App内场探索可落地的场景并进行资源的分发。
-
内部中间服务层,主要是承上启下的服务,封装基础服务,并支撑对外联盟赋能层对基础业务数据的获取。主要包含:小程序开源宿主管理、能力资产管理、分发管理、订单及分佣管理、数据管理等。
-
基础建设层,主要包含小程序开源框架、数据服务、小程序/物料服务、包服务以及安全加固等方案的落地。
1.2 小程序开源与厂商合作介绍
随着百度小程序开源联盟的不断发展,也吸引了头部手机厂商。小程序开源与厂商共建了丰富的业务场景,不仅包含厂商的浏览器场景,还有桌面锁屏、负一屏、全局搜等多种场景。如此多样化的场景建设中,我们面临的共性挑战是:如何保障厂商线上分发质量、如何建设一条从厂商浏览器到百度搜索到小程序的全流程分发管控通路,从而可以精准、实时的管控厂商浏览器的小程序分发。
具体我们是如何考虑并建设的呢?下面将详细介绍下。
二、整体技术建设思路介绍
2.1小程序开源分发保障技术要点
1.背景介绍
开源保障核心围绕的对象为宿主与小程序,核心目的是为了保障小程序在宿主上的分发质量。
为什么会存在分发质量问题?宿主在入驻开源后需要集成开源SDK并进行相关能力的开发,在这些流程完成后宿主就获得了相应的宿主能力。小程序是基于swanjs开发框架进行的开发,swanjs这套运行时框架底层同样是依赖开源SDK运行,因此在小程序完成开发后小程序本身也获得或依赖了相关能力。因为不同的宿主能力支持情况不同,就会导致同一个小程序在不同宿主上分发时可能遇到某个宿主不支持小程序使用到的某个能力,进而导致该小程序无法在宿主上正常打开或者降级为H5打开,导致用户体验受损。
因此需要有一套开源保障方案来提前发现宿主与小程序之间能力不匹配情况,进而确保系统能够自由管控小程序在宿主上分发全过程。
2.技术要点
要实现小程序在宿主上分发通路建设,核心涉及端流程打通、能力与定级流打通及最终分发流打通三大板块,如下图所示:
1)端流程包含宿主端流程和小程序端流程打通
a、宿主端流程:
宿主入驻开源,入驻成功后宿主需要集成开源SDK与开发,宿主开发完成后即可打包发布宿主App;同时宿主包在发布前需要经过宿主能力测试,通过下载宿主工具进行CTS能力测试并产出宿主能力支持情况。
b、小程序端流程:
开发者进行小程序开发,开发完成后操作小程序包版本发布上线,之后小程序开源保障模块会订阅小程序发版动作,同时拉取小程序包信息执行小程序能力扫描测试,并产出小程序能力使用情况。
2)能力与定级流
在宿主与小程序分别完成接入与能力扫描后,开源保障系统就可以分别基于宿主与小程序能力扫描结果进行解析,产出最终的宿主和小程序能力使用情况并存储。同时开源保障系统可以基于宿主能力与小程序能力分别对宿主和小程序进行能力定级,计算出宿主与小程序当前能达到哪个等级,并给宿主和小程序分别打上等级标识。
3)分发流
主要由小程序分发端实现,主要根据用户在开源保障系统中配置的分发策略,基于策略计算小程序是否满足在宿主上分发条件。
3.名词解释
SWANJS:小程序前端运行时框架。
能力:能力指的是小程序开源系统中,对百度APP或者说开源SDK中所封装并支持的各种API、组件、框架等系统能力的统称,详细可参考小程序开发者文档https://smartprogram.baidu.com/docs/develop/api/apilist/进行了解,目前小程序开源共支持的能力有1000多个。
CTS测试:CTS即Compatibility Test Suite, 兼容性测试套件;是为了保障智能小程序在宿主APP稳定运行,提供了一套兼容性测试集合,宿主APP上线前,需先通过CTS测试。
AST扫描:抽象语法树(Abstract Syntax Tree)扫描,是小程序应用的一种源码扫描工具,通过抽象语法树的方式对小程序源码进行扫描分析,目前已支持小程序用到的能力、能力属性、能力参数、能力返回值、能力涉及的关键路径等多种维度的扫描功能。
L级:根据能力在小程序侧使用情况,区分出一些基础能力与特色能力和低频能力等,同时宿主可以根据这些能力标准进行按需实现,等级划分如下:
L1:小程序自带,不用宿主额外配合(框架实现)。
L2:能力建议端补齐,确保基础体验,内部矩阵必要实现(包含手百独有能力在内的必要能力)。
L3:特色能力,强依赖端能力满足,宿主按需实现。
L4:低频能力,不追求满足,宿主按需实现。
2.2 宿主能力检测机制
1.使用宿主工具进行CTS能力测试
宿主在集成开源SDK并完成开发后进行打包,可在开源宿主平台下载宿主工具,对包体进行CTS能力测。,CTS支持宿主进行全能力自动测试和补充测试,补充测试可以对全能力测试中未通过的能力进行批量测试,测试完成后上传自动测试报告。其中还存在部分能力无法实现CTS自动化测试,需进行手动测试,测试完成后宿主在手机上传手动测试报告。
2.宿主工具上传测试报告
在宿主执行完自动测试与手动测试后,需分别上传自动测试报告与手动测试报告至开源保障系统,同时因为同一个宿主版本可能存在多次重复测试过程,会产生多份测试报告,因此宿主需要分别选择一份最终的自动测试报告和手动测试报告,使得开源保障系统可以对最终确认的报告进行解析。
3.报告解析产出宿主能力
开源系统在收到宿主确认报告的操作后,开始执行报告解析,计算宿主能力支持情况,产出最终的宿主能力列表并存储下来;在宿主能力产出的同时同样会执行宿主能力定级,计算出宿主能力等级并进行标记;产出的宿主能力和宿主等级将在后续宿主分发小程序时分发策略中使用。
能力检测服务可用性保障:
当用户完成测试报告确认动作后,开源保障系统实时进行报告解析和能力解析相关操作,在一个进程中完成,如果因为系统执行异常导致的宿主能力检测失败,开源保障系统中设计重试任务进行兜底,保障所有宿主都能完成能力检测。
2.3 小程序能力检测机制:
1.小程序包发布及发版消息订阅
小程序能力检测通路依赖开发者在开发者中心完成小程序开发与发版全流程,之后开源保障系统负责订阅小程序发版行为并自动拉取小程序包体信息,最后推送给AST小程序能力扫描工具进行扫描操作。
2.小程序能力扫描
小程序能力扫描核心依赖AST小程序能力扫描工具完成,该工具主要通过抽象语法树方式实现对小程序包体代码进行扫描分析,共支持扫描小程序使用到哪些开源能力,能力对应的参数、返回值及属性,及能力涉及的小程序关键路径,以上信息扫描成功后的结果将回传给开源保障系统。
3.小程序能力解析
开源保障系统在接收到AST小程序能力扫描结果后,会进行扫描结果分析,提取出小程序使用的能力情况及其他关键信息并存储下来,同时会触发小程序定级任务来执行小程序等级计算,产出并存储当前小程序包版本的等级以便后续保障流程使用。
能力检测服务可用性保障:
当开源保障系统订阅到小程序发版信息后,开始走推送AST扫描及后续流程,整个流程过程均为实时流,但是中间存在跨系统交互等多个子流程,为了保证小程序能力检测过程一定能全部执行成功,开源保障系统中设计重试任务进行兜底,对能力检测失败的小程序记录进行重推AST扫描及能力解析等,同时中间步骤保证幂等,保障所有小程序都能完成能力检测。
2.4 分发匹配机制:
为了得到宿主App与小程序的兼容情况,小程序开源业务系统建设了分级机制。将小程序与宿主App从低到高分别评定为 L1 至 L4 级,并基于L级确定可以分发哪些小程序。具体步骤包括:
1.宿主App与小程序的能力分析:将待匹配的宿主App进行能力测试得到宿主App所支持的全部能力;将待匹配的小程序进行能力扫描得到小程序运行需要的全部能力。
2.宿主App与小程序的等级评定:根据能力的重要性,对宿主App与小程序的能力进行等级映射、等级聚合来评定App与小程序的等级。
3.宿主App与小程序的分发匹配:根据宿主App等级确定匹配的小程序集,其中L1级的宿主App仅能匹配到L1级的小程序,L2级的宿主App可以匹配到L1与L2的小程序,宿主App的最高级别为L4,即具备运行全部小程序的能力。
2.5 分发干预机制:
为了得到宿主App上可分发的小程序,小程序开源业务系统结合内部分发匹配机制与管理员干预机制,来确定宿主App可以打开的小程序集。具体步骤包括:
1.小程序管理员管控:第一级小程序分发管控,基于管理员对小程序的私有化、App黑名单,以及小程序下线的诉求,确保App上无法打开私有、被拉黑、下线的小程序。
2.L级匹配机制管控:第二级小程序分发管控,通过L级匹配机制得到App可正常运行的小程序集合,使默认情况下宿主App只能打开L级相匹配的小程序。
3.宿主App管理员干预:匹配机制的补充,App管理员可根据小程序运行的数据、App应用场景等需求,提交想分发的小程序名单,来表达分发诉求。
三、总结与思考
打破孤岛,共建开源、开放、繁荣的小程序行业生态 一直是小程序开源联盟努力的目标。基础能力框架的完善、各行各业数据的互通以及开发者、宿主和百度友好积极的合作模式是完成这样目标的关键。技术架构的规划一定是围绕着共同的目标和伙伴们的诉求展开,切实的跟踪和服务为理念,用合理的技术手段赋能产品和生态,这样才可以体现生态价值。在小程序开源业务架构建设道路中对服务化结构以及全流程的问题排查有如下总结和思考:
3.1服务化架构的设计思路
1.基础数据的内聚和服务的收敛
数据是服务的基础,无论是开发者平台、tp平台还是宿主平台,都会对基础数据的使用场景,统一管理基础数据可以很好的保证基础信息在各个平台的统一性,而统一收敛的基础数据提供服务,可以有效的管理和运维。
2.自研rpc框架赋能微服务架构和治理
微服务的架构往往离不开的组件就是rpc框架,整体框架中的内部服务调用使用rpc框架,在提高网络交互的效率同时,使用rpc框架的运维功能,有效提高服务稳定性。
3.单一职责原则拆分原有的重模块,切实落地架构微服务化
随着开源业务逐年快速发展,很多模块原有的功能聚合和边界划分已经不太符合现有场景,基于业务发展的趋势和微服务单一职责理念,对服务进行拆解,不仅可以有效降低服务的耦合度,而且衍生出更易扩展和更健壮的服务。
4.日志收集、监控报警 服务稳定性保障
分布式的日志收集和全面的监控报警是保证服务稳定性的重要手段,也是问题排查和解决的常用方式,但也并不是所有的地方都要日志收集和监控报警,合理有效的的日志上报和监控报警指标可以有效的在第一时间发现问题和解决问题。
3.2全流程问题排查
小程序开源的链路比较长,在遇到线上badcase的时候,如果核心日志数据不完善,日志数据链路没打通,上下游数据链路情况就无法查询,排查问题周期长,甚至排查不了问题,继而导致稳定性问题得不到很好的解决和处理,基于这样的问题,在线日志建设十分重要。
1.http请求日志链路
-
trace维护:基于 server mesh 理念,使用 java agent 能力和 openTrace 标准,发布平台统一管理trace生成和传递,不仅无侵入,而且对于业务只需要很少的接入成本即可完成。
-
trace链路:发布平台提供想用的trace链路拓扑,有效的排查traceId下调用场景和花费时间,帮助开发同学及时发现问题和排查问题。
-
trace日志:统一分布式日志收集服务将收集业务方提交日志,兼容发布平台统一管理的trace信息,保留trace链路的具体日志详情,方便在具体问题场景上面更详细排查问题。
2.物料消息日志链路
-
物料唯一标识:物料服务将统一管理和存储物料数据,对于不同场景的物料都有各自的唯一标识体系,使用物料唯一表示进行物料消息的链路日志串联。
-
日志收集检索:公司统一的收集服务提供业务标识定义、检索和排序功能,对于长链路的物料消息传递分发场景,可以很好的串联起整个异步链路。
相关文章:

浅谈小程序开源业务架构建设之路
一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态,我们的愿景是:定义移动时代最佳体验,建设智能小程序行业标准,打破孤岛,共建开源、开放、繁荣的小程序行业生态。百度…...

git、gitee、github关系梳理及ssh不对称加密大白话解释
温馨提示:本文不会讲解如何下载、安装git,也不会讲解如何注册、使用gitee或GitHub,这些内容网上一大把,B站上的入门课程也很多,自己看看就好了。 本文仅对 git、gitee、github的关系梳理及ssh公钥私钥授权原理用白话讲…...

UDP协议详解
目录 前言: 再谈协议 UDP协议 比较知名的校验和 小结: 前言: UDP和TCP作为传输层非常知名的两个协议,那么将数据从应用层到传输层数据是怎样进行打包的?具体都会增加一些什么样的报头,下面内容详细介绍…...

Myb atis基础3
Mybatis注解开发单表操作Mybatis的常用注解Mybatis的增删改查MyBatis注解开发的多表操作MyBatis的注解实现复杂映射开发一对一查询一对多查询多对多查询构建sqlsql构建对象介绍查询功能的实现新增功能的实现修改功能的实现删除功能的实现Mybatis注解开发单表操作 Mybatis的常用…...

VHDL语言基础-时序逻辑电路-寄存器
目录 寄存器的设计: 多位寄存器: 多位寄存器的VHDL描述: 移位寄存器: 串进并出的移位寄存器的VHDL描述: 寄存器的设计: 多位寄存器: 一个D触发器就是一位寄存器,如果需要多位寄存器&…...

高通开发系列 - linux kernel更新msm-3.18升至msm-4.9
By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 linux kernel更新msm-3.18升至msm-4.9第一周处理的内容:第二周处理的内容第三周处理的内容linux kernel更新msm-3.18升至msm-4.9 第…...
【Tensorflow2.0】tensorflow中的Dense函数解析
目录1 作用2 例子3 与torch.nn.Linear的区别4 参考文献1 作用 注意此处Tensorflow版本是2.0。 由于本人是Pytorch用户,对Tensorflow不是很熟悉,在读到用tf写的代码时就很是麻烦。如图所示,遇到了如下代码: h Dense(unitsadj_di…...
PyTorch学习笔记:data.RandomSampler——数据随机采样
PyTorch学习笔记:data.RandomSampler——数据随机采样 torch.utils.data.RandomSampler(data_source, replacementFalse, num_samplesNone, generatorNone)功能:随即对样本进行采样 输入: data_source:被采样的数据集合replace…...

设计模式(七)----创建型模式之建造者模式
1、概述 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。 由于实现了构建和装配的解…...

DCGAN
DCGAN的论文地址[https://arxiv.org/pdf/1511.06434.pdf]。DCGAN是GAN的一个变体,DCGAN就是将CNN和原始的GAN结合到一起,生成网络和鉴别网络都运用到了深度卷积神经网络。DCGAN提高了基础GAN的稳定性和生成结果质量。DCGAN主要是在网络架构上改进了原始的…...

【速通版】吴恩达机器学习笔记Part3
目录 1.多元线性回归 a.特征缩放 可行的缩放方式: 1.除以最大值: 2.mean normalization: 3.Z-score normalization b.learning curve: c.learning rate: 2.多项式回归 3.classification logistics regression 1.多元线性回归 其意义很…...
【leetcode】跳跃游戏
一、题目描述 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输入:nums [2,3,1,1,4] 输出:true 解释&#x…...

论文投稿指南——中文核心期刊推荐(冶金工业 2)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...

【GPLT 二阶题目集】L2-044 大众情人
人与人之间总有一点距离感。我们假定两个人之间的亲密程度跟他们之间的距离感成反比,并且距离感是单向的。例如小蓝对小红患了单相思,从小蓝的眼中看去,他和小红之间的距离为 1,只差一层窗户纸;但在小红的眼里…...

SpringBoot整合(二)MyBatisPlus技术详解
MyBatisPlus详解 一、标准数据层开发 MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率 MyBatisPlus的官网为:https://mp.baomidou.com/ 1.1 标准CRUD 1.2 新增 int insert (T t)T:泛型,…...
导入importk8s集群,添加node节点,rancher agent,Rancher Agent设置选项
curl方式: Rancher在每个节点上部署代理以与节点通信。 此页面描述了可以传递给代理的选项,要使用这些选项,您需要采用创建自定义集群 ,并在docker run添加节点时将选项添加到生成的命令中。 常规选项 参数环境变量描述—serve…...

C++11--右值引用与移动语义
目录 基本概念 左值与右值 左值引用与右值引用 右值引用的使用场景和意义 左值引用的使用场景 右值引用和移动语义 移动构造和拷贝构造的区别 编译器的优化 移动赋值和赋值运算符重载的区别 右值引用的其他应用场景 完美转发 万能引用 完美转发保持值属性 完美转…...
Python SQLAlchemy入门教程
本文将以Mysql举例,介绍sqlalchemy的基本用法。其中,Python版本为2.7,sqlalchemy版本为1.1.6。 一. 介绍 SQLAlchemy是Python中最有名的ORM工具。 关于ORM: 全称Object Relational Mapping(对象关系映射࿰…...

你是真的“C”——操作符详解【下篇】+整形提升+算术转换
你是真的“C”——操作符详解下篇😎前言🙌操作符详解【上篇】内容:操作符详解【下篇】内容:1、 条件操作符2、逗号表达式:3、下标引用、函数调用和结构成员3、访问一个结构的成员表达式求值1、隐式类型转换:…...

文本匹配SimCSE模型代码详解以及训练自己的中文数据集
前言 在上一篇博客文本匹配中的示例代码中使用到了一个SimCSE模型,用来提取短文本的特征,然后计算特征相似度,最终达到文本匹配的目的。但是该示例代码中的短文本是用的英文短句,其实SimCSE模型也可以用于中文短文本的特征提取&a…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...