关于后端:短视频go研发框架实践

84次阅读

共计 7517 个字符,预计需要花费 19 分钟才能阅读完成。

导读:hulk 是短视频研发部研发的基于 GDP2(Go Develop Platform)的 go 服务开发框架。它是⼀款⾯向业务的 Web 开发框架,提供了诸多开箱即⽤的组件和性能,能够⽤来疾速开发 Web 服务。同时,依靠于 hulk 框架并联合⼚内 / 业界优良的开发实际,初步构建了⼀个合乎业务应⽤场景的 go ⽣态体系。

全文 7330 字,预计浏览工夫 12 分钟。

===

一、产生背景

hulk 框架是在“难看视频”服务端的 go 服务化架构降级背景下产生的。

1.1 为什么要做架构降级?以后架构面临哪些问题?

难看视频初期因业务须要疾速、灵便的开发迭代,采⽤ PHP 作为开发语⾔实现后端服务,后期获得了⽐较好的开发迭代成果。但随着难看业务疾速倒退,服务端的项⽬ (接⼝、代码等) 急速收缩,类单体的 PHP 架构在多个⽅⾯遇到了瓶颈和问题,次要体现在以下⼏个⽅⾯:

1. 开发效率:对于主代码库,所有服务端同学都会在这同一个代码空间开发,此外还有依赖的第三方团队也会批改,频繁的批改 / 合并升高了开发效率,同时也加大了代码的保护老本和难度;

2. 上线效率:多用户开发同一代码库的另一个弊病就是上线期待,因为同一个时刻只能有一个分支上线(分级上线),导致相连的上线需要要排队期待。这也导致咱们的同学摸索出“搭车上线”的模式,尽管放慢了上线效率,但也加大了上线的危险,没有从根本上解决问题;

3. 运行效率:PHP 在开发效率和灵便度方面的确有肯定劣势,但当所撑持的业务达到几千万 DAU 及以上时,咱们必须要思考服务的运行效率和资源老本等问题。PHP 语言在多线程 / 多协程的反对上,弱于 Java、C/C++、Go 等语言,基于物理机部署的类单体服务部署架构,在资源利用率和服务扩缩容等方面也很难满足需要;

4.SRE 效率:在呈现稳定性问题时,咱们冀望可能做到疾速感知、疾速定位、疾速止损。目前基于 sia 的监控 / 报警,基于日志的问题定位形式间隔现实指标还有肯定的间隔:一是同学要奔走于各个平台 / 零碎获取问题线索,二是获取到的线索及信息维度很多时候也无奈满足疾速、精确定位问题的需要;

这些问题须要通过“4 化”,从总体业务架构、部署架构、基础设施等多方面去解决:


1.2 为什么不间接基于 GDP2?

难看的 go 服务化降级工作发展时,GDP2 还未正式公布,这也是其中一个因素。


1.3 hulk 与 gdp2 能⼒对照

下⾯从三个⽅⾯与 gdp2 做⼀个简略的对照,初步理解 hulk 的整体能⼒及与 gdp2 的⼀些差别。

1.3.1 web server 能⼒

hulk ⽬前次要服务于 web 应⽤,⾸先理解⼀下 hulk 的 web server 能⼒。

1.3.2 性能 / 组件

性能 / 组件的丰盛度及⾃身能⼒,很⼤水平上影响了框架对业务服务的⽀持能⼒。

1.3.3 框架周边及基础设施

框架从来不是“单打独⽃的”,它须要有周边⼯具和基础设施来⽀持。

NOTE:

1. 难看在做 go 化时,也调研了开源社区⾥⽐较优良的⼀些⼯具零碎和⽅案并引⼊,hulk 中默认增加了对这些基础设施的集成;

1.3.4 对照总结

本节次要站在 hulk 能力角度与 GDP2 做了一些方面的参考对照。以上对照,能够概括为 4 点:

1. 很多根底能⼒,hulk 是复⽤ gdp 的,如:bns、net、codec 等;

2. ⼀些通⽤ / 扩大组件,hulk 依照业务需要场景,进⾏⼆次封装和加强,如:httpserver、ral、redis、mysql 等;

3. 对于 gdp ⽬前没有⽀持的⼀些业务需要,进⾏开发集成,如:定时工作、配置中⼼、服务治理等;

4. 参考业界开源实际,引入了一些新的基础设施:如 prometheus+grafana 集群、sentry 集群、故障定位系统等;

GDP2 由几十个模块独特形成,因为工夫无限,可能个别性能点的对照有偏差。

===

二、理解 hulk

2.1 设计思路


2.2 框架结构

从性能上来看,hulk 的整体能力能够划分为四层:

2.2.1 根底组件

提供了绝大部分我的项目都应该须要的根底能力,也是其余下层性能组件很可能依赖的组件。hulk 框架通过这些根底组件,使下层利用能够无感的与基础设施进行集成:

  • 日志组件:默认反对与 PHP 兼容的打印格局(用于配置 sia 监控和报警),同时也兼容 ftrace 接入的格局(日志查问和问题定位);
  • 云原生监控:默认反对 prometheus,对所有接口申请、redis、ral 等近程调用进行多维度的 metrics 采集,并通过 grafana 展现;
  • 配置核心:通过配置核心,能够实时下发并失效配置。目前反对 Apollo/iConf,反对性能包含 - 版本治理、热公布、灰度公布、权限治理、审核与审计等;
  • 事件追踪 / 定位:借助 sentry,对于一些故障,咱们能够秒级感知。hulk 在异样信息中保留了比拟残缺的现场信息 - 如调用栈、request、集群和实例信息等,通过这些信息,能够间接定位问题的起因;

2.2.2 通用组件

这一层的组件能力是通用的,提供了一些管理控制和切面能力:

  • ral 组件:hulk 的 ral 模块封装了 GDP2 的 ral 主体性能,同时,对 ral 进行了加强 - a) 提供了通过字符串而非文件来进行 ral 初始化和 ral 懒加载性能;b) 提供了多个 hook 能力,如 prometheus 的监控信息采集,熔断、降级等;
  • 服务治理:框架的服务治理能力是基于 Sentinel(阿里开源的高可用流量防护组件)和配置核心来构建的,次要以流量为切入点,从限流、流量整形、熔断、降级等多个维度来帮助保障微服务的稳定性,并提供动态控制能力;
  • 协程池:a) 能够主动调度海量协程,复用 goroutines,缩小 gc,b) 能够优雅解决 panic,避免程序解体 c) 提供了:工作提交、获取运行中的 goroutine 数量、封装了 WaitGroup 反对协程工作编排等性能;
  • 事件告诉:框架与如流做了集成。用户将 robot token 配置在我的项目里,就能够间接应用 ruliu 组件向指定的如流群发送报警 / 通告。如流组件联合 sentry,能够让咱们第一工夫晓得程序出了问题并疾速定位到问题;

2.2.3 扩大组件

前两层性能对间接的业务解决逻辑参加较少,这一层的组件其能力多是为了解决某一类特定业务逻辑和场景,如 redis/mysql/ 定时工作等:

1.redis 组件:基于 GDP2 redis 模块的封装并作了性能增,提供了:

a) metrics hook,对所有的 redis 申请进行监控 (prometheus) 打点(latency/p99/qps/ 错误码散布等);

b) sentry hook,反对将 redis 谬误在记谬误日志同时发送到 sentry;

c) 降级 hook,反对按集群 / 实例 / 百分比维度降级 redis 拜访;

d) 熔断 hook,反对按集群 / 实例 / 错误率 / 慢申请率对依赖的服务进行熔断设置;

2.mysql 组件:mysql 组件是基于 GDP2 mysql 和 gorm\_adapter 的封装,在已有能力之上,进行了以下性能扩大:

a) 提供了 metrics hook,对所有的 mysql 申请进行监控 (prometheus) 打点(latency/p99/qps/ 错误码散布等);

b) 提供了 sentry hook,反对将 mysql 谬误在记谬误日志的同时发送到 sentry;

3. 分布式锁:hulk 提供了基于 redis 的分布式锁实现。其中 redis 连贯是基于 GDP2 的 redis 模块的革新,分布式锁性能是封装了开源我的项目 redsync;

4. 定时工作:反对两种定时工作模式;

a) 带分布式锁的运行形式:对于多实例部署的定时工作,如果工作不是幂等的,则须要应用分布式锁对工作的调度运行进行管制;

b) 不带分布式锁的运行形式:此模式下,如果部署了多实例,则所有实例上同一时刻的定时工作,会同时执行;

2.2.4 http server

hulk(目前只提供了 http server 能力)提供了很多通用且高效的 http middleware,并对外裸露了一些管理控制接口,在一些非凡状况下,能够通过这些治理接口,在运行时干涉服务的运行:

  • logger\_middleware:用于记录 http 的申请、响应、耗时等信息,同时反对实时批改日志打印策略 - 如按 idc/ip/ 百分比 /uid/cuid 等维度打印;
  • timer\_middleware:用于 http 申请的监控埋点,能够输入可用性、tp99、流量、平响、错误码等 metrics,维度包含服务级 /idc/instance 等;
  • recover\_middleware:用于捕捉 http 申请链路中的 painc 事件,并可自定义 panic handler 逻辑,如通过联合 sentry 和如流,能够实时感知并定位 panic 事件;
  • flow\_control\_middleware:接口限流组件,能够通过配置核心或治理接口,对接口按 idc/instance 维度进行限流;
  • timeout\_middleware:通过该 middleware 或与配置核心联合应用,能够对接口按 idc 维度进行超时管制;
  • 其余 middleware 能够查看 hulk 文档

    (如 -internal\_user\_middleware、jager\_opentracing\_middleware、thirdparty\_auth\_middleware、b2logger\_middleware 等)

  • 管理控制接口:如健康检查接口,服务治理 - 熔断、限流、降级接口,metrics 接口,线上实例性能调试接口等;

2.3 框架生态

通过近一年的建设,咱们初步构建了一个以 hulk 框架为核心的、合乎难看业务场景的 go 生态体系,包含:

  • 规范目录标准:防止各个我的项目构造不对立,缩小我的项目保护难度和工作量;
  • 代码生成器:基于 hulk 框架、规范目录标准、组件应用标准的代码生成器,目标是缩小通用模块 / 组件应用不标准,解决通用流程编码、解决不统一的问题;
  • hklib:难看的通用 lib 库,提供了一些的通用性能(也蕴含了很多 PHP 转 go 过程中的一些 orp 通用 / 根底的函数 / 性能),也提供了 50+ 对中台服务的调用 client,缩小反复代码,晋升研发效率,晋升可维护性;
  • 基础设施:prometheus+thanos 集群、sentry 服务、apollo 集群、pyroscope 性能剖析平台等;
  • iconf:难看自研配置核心,能力在对齐开源的 Apollo 之外,还减少 / 加强了一些性能,如 -key 维度的公布、更平安的配置获取、更简洁的操作页面、类分级公布等;
  • artemis:服务可视化与故障智能定位系统,能够在该零碎中看到服务的部署架构、服务外部调用链、多维度细粒度的近实时监控和要害日志。在产生可用性故障时,一些故障问题能够秒级的定位到起因和具体代码;

2.4 框架利用状况

目前短视频所有 go 服务都是基于 hulk 构建的,在资源、接口性能和可用性等方面都有一些阶段性产出和收益。

hulk 框架利用现状:

资源和性能收益:

资源和性能收益,很大一部分要归属于 PHP->Go 的技术栈切换;而框架为服务利用相应技术栈个性提供了便捷和高效的形式。

2.4 hulk 服务架构


下图形容了一个微服务(基于 hulk)的架构全景图:

  • 框架中个各性能组件都是围绕业务各个场景和需要的,在业务逻辑中可能比拟便捷的应用相干性能组件;
  • 这些组件在启用后,也会与相应的基础设施进行交互交融,独特撑持服务的高效、可控和稳固的运行;

hulk 组件初始化及与周边基础设施的集成,根本都能够通过环境变量 / 配置文件来实现。

===

三、框架能力与利用

上面咱们从日常开发遇到的一些痛点,来介绍框架的能力,并配以示例来阐明这些能力是如何缩小或解决痛点的。

3.1 如何晋升代码品质?

代码品质会间接或间接的产生以下影响:

  • 代码品质会间接影响代码保护老本;
  • 代码品质会影响程序出 bug 的概率;
  • 代码品质会影响程序运行效率;

hulk 框架从以下三方面别离来晋升代码品质。

3.1.1 标准代码组织构造

升高我的项目保护老本,晋升研发效率。

  • 通过规范目录标准 ,定义通用(http 服务) 的我的项目 layout,避免出现每人一种或多种 layout,最终我的项目构造“百花齐放”的景象;
  • 通过代码生成器,帮忙开发者生成我的项目模板,对初始化流程,各目录 / 文件的应用进行潜在约定;

3.1.2 编码标准和动态查看

晋升代码可读性,缩小低级代码 bug

  • 遵循百度 Go 编码标准 + 业务编码补充标准;
  • 应用 GDP 的代码查看工具:go\_fmt、goc;

3.1.3 配套的压测和性能剖析平台

确定服务的压力边界,发现潜在的性能问题。

  • 压测和性能测试平台(测试环境):nGrinder

  • 程序性能剖析平台:pyroscope。能够通过 hulk 自集成的治理接口,实时关上或敞开线上实例的“continuous-prof”性能,定位线上性能问题:

3.2 如何晋升开发迭代速度?

  • 如何让开发者专一于业务逻辑与实现?
  • 如何让开发者疾速响应并实现产品需要?

hulk 框架为晋升迭代速度,提供了以下反对。

3.2.1 丰盛的实用组件 / 性能

晋升研发效率,防止试错,缩小出错。

  • 程序加强组件:加强的 redis/mysql 性能,加强的 ral 调用等。例 - 下图中的 redis 监控,其监控指标是由 hulk redis 组件主动采集计算的:

  • 优良的开源组件:sentry、prometheus+grafana、apollo、协程池等。例 -prometheus+grafana:hulk 框架默认反对 prometheus,能够对服务的可用性、QPS、耗时、错误码等 metrics 主动计算收集:

  • 丰盛的 http middleware。

3.2.2 配置化、低代码反对

缩小代码的批改和上线,晋升需要的响应和实现速度。

  • hulk 框架中大部分组件能够通过环境变量 / 配置文件来初始化;
  • 业务逻辑中的可变数据与配置,能够通过 apollo/iconf 实时下发和失效,无需代码批改和长流程上线。例 - 能够通过开箱即用的配置核心性能,实时下发并失效配置:


3.3 如何疾速感知并定位问题?

  • 开发者如何疾速感知服务中的问题,重大问题如何实时感知?
  • 开发者如何能从监控、日志、报警中取得具体的问题信息,以疾速定位问题?

hulk 为晋升 SRE 效率,从以下几个方面提供反对。

3.3.1 欠缺的事件追踪定位与通告能力

可能实时追踪开发者自定义的谬误并通告

  • 实时事件追踪组件:sentry。hulk 提供了开箱即用的 sentry 组件性能,能够像打印日志一样应用,sentry 中的信息蕴含代码调用栈、上下文、自定义要害信息等:

  • 通告组件:ruliu。一行 token 配置就能够开启如流性能,能够将一些须要立刻关注的信息实时打到如流群里,同时还能够和 sentry 联合,实现异样问题实时感知和定位:

3.3.2 prometheus+sia 监控反对

通过 prometheus 与 noah 的互补,反对多维度全方位监控,可能取得更多的服务稳定性相干信息

  • prometheus 为开发者提供灵便的多维度的业务监控信息;
  • sia 能够为开发者提供基于日志的采集的服务稳固指标和容器、网络等资源维度监控信息;

3.3.3 ftrace 日志查问与剖析性能

hulk 默认反对 ftrace 平台的日志格局

  • 通过 ftrace,能够便捷高效的查问用户维度的日志信息;

  • 通过 pdo2 命令,能够检索查问自定义规定的日志信息;

3.4 基于 hulk 的服务可视化和故障智能定位系统

artemis 是咱们基于 hulk 研发的一款服务可视化与故障智能定位追踪零碎,它集服务部署架构可视化、近实时多维度监控、要害日志、服务调用链等多方面信息,能够疾速、高效、精准的发现和定位稳定性问题。

该零碎目前已接入难看 / 全民 / 度咔等多个后端服务,极大减速了故障定位效率。在一些故障场景,能够秒级定位问题,给出问题的代码行。

3.4.1 服务部署架构

通过实例列表,能够获取服务的 idc 列表、instance 列表和详情,并提供了便捷高效的调试入口和登录指令:

3.4.2 近实时多维度监控

artemis 提供的近实时监控,可能提供更多维度信息,这些维度是 sia 和 prometheus 无奈提供的,如:

  • 某个 URI 上面的某个上游(或上游实例)RAL 的 QPS、耗时、可用性;
  • 某个服务实例实例的 URI 或 RAL 的监控信息;

3.4.3 要害日志

因为与 hulk 的深度集成,在业务代码中打印 warning 级别以上的日志时,artemis 能拿到更多的日志信息,如 - 各维度信息、调用栈、上下文等:

3.4.4 服务调用链

在 hulk 框架的帮助下,artemis 还能够获取到 URI 及 URI 所依赖的 RAL 调用信息,由此能够构建出申请调用链,并实时展现调用链上的相干 metrics 信息:

不同色彩的链路代表不同的可用性:红色 - 1 个 9 及以下,黄色 - 2 个 9,蓝色 - 3 个 9,灰色 - 4 个 9。通过服务调用链,能够十分直观的看到服务里,哪个接口有问题,还能够看到哪些上游影响了这个接口的可用性。

3.4.5 应用案例

通过与报警零碎的联动,能够在产生报警的第一工夫,在 artemis 零碎中找到受影响的服务及 URI,确定是否是上游引起,谬误是什么,哪一行代码报了错等,以下是一个 artemis 的理论利用示例。

===

四、总结

===========

hulk 尽管是⼀个新的 go 语⾔ web 框架,但不是反复造轮,⽽是站在⼚内和开源软件的根底上,联合业务理论开发、部 署、运⾏、运维环境,对这些开源框架和⼯具进⾏取⻓补短、⼆次开发,最终切合实际的业务使⽤场景。同时,围绕 hulk 初步构建起的 go 生态,为服务在开发、部署、运行、运维等各个阶段都提供了无力反对。

最初,心愿短视频研发部在 go 服务化架构降级 / 研发框架上的⼀些实际、⽅案和教训,可能给有雷同架构降级需要、在 go 项⽬实际中遇到问题的其余业务线同学⼀些帮忙和参考。

招聘信息

短视频研发部,负责难看视频、全民小视频以及多款翻新 APP 的孵化研发工作。是公司级策略产品,承当百度系产品矩阵短视频内容供应工作,重点反对百度搜寻和信息流视频化,肩负百度内容生态视频化转型使命。仅用两年的工夫就实现用户规模从零到亿级增长,日活数千万。领有百亿级流量,亿级数据量,丰盛离奇和全面的产品玩法,多类型的技术零碎和当先的技术架构。

欢送退出短视频研发部,社招,实习,校招都要哦

简历投递邮箱:geektalk@baidu.com(投递备注【短视频】)

举荐浏览:

|千亿级模型在离线一致性保障计划详解

|如何疾速定位程序 Core?

|百度 BaikalDB 在同程艺龙的胜利利用实际分析

———- END ———-

百度 Geek 说

百度官网技术公众号上线啦!

技术干货 · 行业资讯 · 线上沙龙 · 行业大会

招聘信息 · 内推信息 · 技术书籍 · 百度周边

欢送各位同学关注

正文完
 0