西瓜视频基于 Hertz 的微服务落地实践

# 1.  西瓜视频微服务架构设计

## 1.1 西瓜视频介绍

**西瓜视频**是一个开眼界、涨知识的视频 App(Informative Video Platform),作为国内领先的**中长视频**平台,它源源不断地为不同人群提供优质内容,让人们看到更丰富和有深度的世界,收获轻松的获得感,点亮对生活的好奇心。

同时,**西瓜视频**鼓励多样化创作,帮助人们轻松地向全世界分享视频作品,创造更大的价值。目前平台月活跃创作人超过 320 万,月活跃用户数超过 1.8 亿,日均播放量超过 40 亿,用户平均使用时长超过 100 分钟。

## 1.2 微服务架构设计时关注哪些方面

### 业务域划分

上面四张图分别对应我们的中视频、电商、长视频和作者侧的业务。当然我们的业务场景远不止这些,但是也反映出了C 端场景多,业务域划分较细的特点,因此我们在微服务架构设计的时候需要着重考虑服务划分与解耦,在设计期间我们主要遵循两个原则:

-   单一职责原则:确保每个微服务只负责一个特定的业务功能,避免职责混乱。
-   领域驱动设计:使用领域驱动设计方法来划分服务边界,确保各个服务独立、可复用。

这样设计之后,可以保证:

-   业务模块的独立性:每个微服务可以独立开发、测试、部署和扩展,提升了开发效率和系统的灵活性。
-   技术栈灵活性:不同的微服务可以使用最适合其业务需求的技术栈,不需要统一技术选型。
-   故障隔离:一个服务的故障不会影响其他服务的运行,提高了系统的可用性和稳定性。
-   按需扩展:可以根据每个服务的负载情况独立扩展,优化资源使用和成本。

### 性能

## 1.3 架构设计

上图是西瓜视频整体的微服务架构设计。

从上到下我们分为三层,分别是接入层,业务层和基础组件层。

### 接入层

-   不同的分端:包括西瓜app,西瓜pc,我们的TV端鲜时光以及M站。

-   负载均衡及网关

    -   使用公司内部组件来提供负载均衡和通用网关能力。

-   API服务:使用Hertz框架的服务。

### 业务层

-   消费侧业务,基础业务,和其他的一些互动社区等RPC业务,这些服务采用的是Kitex框架。

    -   消费侧业务主要面向C端用户的场景就是信息流和详情页。
    -   信息流:主要是西瓜APP的全部频道模块,包括进入西瓜视频后的首页看到的推荐精选都对应我们的信息流服务。
    -   详情页:我们知道推荐频道更多对应的是一个沉浸式的场景,但是我们的视频也会有其他的入口进入,比如个人主页等场景,这个时候点击一个视频就会进入详情页,相对于沉浸式那种更专注于视频本身播放的体验,详情页会包含更多的视频信息。
    -   推荐系统:这里是一些推荐、广告的服务,主要是提供底层的数据的id返回,包含广告混排,推荐排序,广告投放等功能。
    -   打包服务:公司的业务线会比较繁杂,所以随着发展抽象出了打包层,各个业务会有自己数据结构的打包服务,作为最终返回给客户端的数据。这里就包括小视频、中视频、长视频、直播等数据的打包。

-   互动模块

    -   在这些业务之外,我们还会有其他的一些互动和社区的功能模块。这种都是有公司专门的关系中台、评论中台去维护。同时,我们的业务还会依赖业务用到的存储,像mysql、redis等。

## 基础组件

基础组件,比如语言框架,像前面提到的hertz、kitex等框架,还有一些日志、监控,配置系统。

# 2.  Hertz框架介绍

## 2.1 背景

字节跳动从2014年开始使用Golang,2016年基于Gin框架封装了Ginex。但Ginex在迭代受开源Gin项目限制、代码混乱膨胀导致维护困难、无法满足性能敏感和功能扩展需求等问题。2020年部分业务线尝试魔改其他开源框架如Fasthttp,但带来了分散生产力和巨大维护成本的问题。为解决这些痛点,字节于2020年初立项开发自研高性能Go框架Hertz,经过两年多的迭代,Hertz于2022年6月正式开源,目前已广泛应用于字节内部逾1.4万个服务,支撑日峰值QPS超5000万,显著降低资源使用和服务延时,接替大量基于Gin的存量服务,助力公司降本增效。

## 2.2 为什么选择Hertz

-   **极致的性能**

    -   Hertz的性能指标是作为一个核心指标开展设计和实现的。Hertz 默认使用自研的高性能网络库 Netpoll,在一些特殊场景相较于 go net,Hertz 在 QPS、时延上均具有一定优势。关于性能数据,大家可以看以下benchMark,可以看到hertz的QPS和时延指标已经在和其他三个知名框架对比中已经全面占优,对比gin更是遥遥领先。
    -   并且,框架整体的持续优化会贯穿框架的整个生命周期,持续不断地进行下去。

-   **易用性,开发者友好**

    -   在开发过程中,快速写出正确的代码往往是重要的。[Hertz](https://github.com/cloudwego/hertz) 在设计 API 时,考虑到用户的使用习惯,参考业界主流框架使用 API 的方式,并加以优化。在 [Hertz](https://github.com/cloudwego/hertz) 在迭代过程中,积极听取用户意见,持续打磨框架, 比如很多用户希望 Client 也有 Trace 的能力,为此,[Hertz](https://github.com/cloudwego/hertz) Client 支持了中间件能力。[Hertz](https://github.com/cloudwego/hertz) 也提供了命令行工具,一键生成代码,提高框架的易用性。
    -   Hertz 提供了一个简单易用的命令行工具 Hz,用户只需提供一个 IDL,根据定义好的接口信息,Hz 便可以一键生成项目脚手架,开箱即用使用 Hertz;Hz 也提供更新能力,用户的 IDL 如果发生改变,Hz 可以更新脚手架。 目前Hz支持了 Thrift 和 Protobuf 两种 IDL 定义。命令行工具内置丰富的选项,可以根据自己的需求使用。

-   **丰富的文档体系**

    -   即使是从来没有使用过相关框架的新同学,都能够通过相应的文档,快速上手 Hertz,体验 Hertz 所带来的极致的开发体验。

-   **稳定性**

    -     Hertz对内对外支撑了大量的业务服务,业务选择hertz的一个重要考量就是稳定性。Hertz也制定了各种措施来保证框架的稳定性:
    -   基于线上流量特征的随机模拟。hertz会根据线上真实的流量曲线,通过模拟和重放的方式,在测试环境中复现各种极端的高并发场景,从而验证系统的承载能力和容错能力。
    -   核心API全覆盖。Hertz所有对外提供服务的API接口,无一例外都要经过完备的性能测试、压力测试和负载测试,确保在各种极限情况下也能保持稳定和高效。
    -   适配不同的线上部署环境。针对hertz服务的不同场景,会准备不同的线上环境,。这些环境硬件资源配置不尽相同,通过在不同环境中反复测试和验证,可以全面评估系统的稳定性和可扩展性。
    -   7*24小时监控大盘。全天候实时监控系统的各项核心指标,一旦发现异常,能够第一时间定位并通知值班人员介入处理。
    -   严格的发布流程。Hertz对系统的每一次上线升级都有特别严格的流程要求,必须经过线下测试、验证、代码review等多个环节,避免出现变更带来的风险。

-   **低廉的迁移成本**

    -   西瓜早期的api服务都是基于Ginex框架开发的。而Hertz 立项之初,就将针对存量 Ginex 服务的迁移作为一个高优需要照顾的环节。在一些业务常用API上做了许多兼容性的设计。
    -   同时,Hertz 也为存量项目提供了一键迁移的方案Ginex 项目快速迁移 Hertz 1.x 指南 ,使用一键迁移工具,用户可能无需/只需改动少量代码即可完成 Gin —> Hertz 项目的迁移。

-   丰富的扩展能力

    -   [Hertz](https://github.com/cloudwego/hertz) 采用了分层设计,提供了较多的接口以及默认的扩展实现,用户也可以自行扩展。Hertz目前支持了日志、监控、服务注册与发现、网络库和协议等扩展能力,未来有望为用户提供更多的扩展能力。

# 3.  Hertz迁移过程、踩坑经验

## 3.1 迁移过程

1.  选择要迁移的服务

迁移的第一步就是要先选择要迁移的服务,根据帕累托原则,我们优先找出占据最大比例的成本来源,并处理这些高成本项目,以最大化资源利用效率。根据性能分析平台,我们选择了目前西瓜CPU资源消耗最大的两个api服务进行迁移,分别对应我们的观看历史、点赞和弹幕的有关服务。

2.  SDK库适配

西瓜业务线对 Ginex 做了封装,提供一个SDK 给其他 api 服务使用,比如在获取观看历史的接口中,我们会先使用sdk中的newRequestContext方法来做一些请求上下文的初始化操作。在这个请求上下文中我们会有ab实验、设备信息、地理位置信息等上下文的初始化。所以我们第一步就是针对SDK库中相应的代码进行适配。在这个适配过程中有一些三方的SDK库的依赖,可以直接升级 SDK 对应的Hertz 版本。

3.  执行一键迁移脚本

hertz同学提供了一键迁移脚本,只需在当前服务目录下执行脚本即可完成大部分重复性的改造工作。

脚本通过正则匹配的方式完成大部分重复性替换工作,对于一些gin ginex字样会替换为hertz中的相应的实现。

4.  手动修改

Hertz中间件的设计采用了洋葱模型,洋葱模型是一种中间件流程控制方式,做到核心逻辑和通用逻辑分离。

中间件可以做日志记录、性能统计、安全控制、事务处理、异常处理等场景。

Hertz预置了几款中间件:

•Recovery中间件:负责处理链路上的panic

•Metrics中间件:负责请求相关指标上报

对于业务自己实现的特殊中间件需要进行迁移,关于如何实现一个中间件Hertz也给出了实例。

以西瓜业务自己的特殊中间件default_stable为例,我们会在header中将stable设置为1,用于做SLO数据统计。这种中间件我们就需要做一些适配工作,这里的话就会面临接口不匹配的问题,可以参考[参考 Gin —> Hertz API 对照表 ](https://github.com/hertz-contrib/migrate/blob/main/gin_to_hertz.md)进行修改。

## 3.2 踩坑经验

-   **Query tag 缺失导致请求参数解析失败**

    -   表现

        -   Query 请求参数在服务端没有解析成功,调用 RequestContext 进行参数绑定的时候报错。

    -   原因

        -   参考**[Hertz 支持的参数绑定与校验相关功能及用法](https://www.cloudwego.io/zh/docs/hertz/tutorials/basic-feature/binding-and-validate/)**,不通过 IDL 生成代码时若字段不添加任何 tag 则会遍历所有 tag 并按照优先级绑定参数,添加 tag 则会根据对应的 tag 按照优先级去绑定参数。
        -   请求参数有关的结构体未设置 query tag,导致 query 请求参数在服务端没有解析成功。

    -   解决方式

        -   结构体添加 query tag
        -   通过单元测试提前规避

-   **未配置looseZero模式导致绑定数值类型报错**

    -   表现

        -   在一些场景下,前端有时候传来的信息只有 key 没有 value,这会导致绑定数值类型的时候报错。

    -   原因

        -   未配置looseZero模式

    -   解决方式

# 4.  落地Hertz后的收益

上线前后对比发现CPU使用率下降约10%,优化效果明显,详细的性能收益如下:

-   平均CPU核数从2730降为2443
-   单核QPS处理能力提升:10.7%
-   内存占用率变化—优化前:31.1% ,优化后: 29.3%
-   核心接口LatencyPct99下降:10.15%

**项目地址**

GitHub:https://github.com/cloudwego

官网:www.cloudwego.io

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始搭建一个酷炫的个人博客

效果图 一、搭建网站 git和hexo准备 注册GitHub本地安装Git绑定GitHub并提交文件安装npm和hexo,并绑定github上的仓库注意:上述教程都是Windows系统,Mac系统会更简单! 域名准备 购买域名,买的是腾讯云域名&#xf…

【web1】标签,css,js

文章目录 1.标签:input1.1 html:HTML(用于创建网页结构),CSS(对页面进行美化),JavaScript(用于与用户交互)1.2 文本标签:字体属性1.3 a标签&#…

win32API(CONSOLE 相关接口详解)

前言: Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程式达到开启视窗、描绘图形…

解析JSON字符串

QJsonDocument类用于解析JSON字符串,

android studio 模拟器文件查找

android studio 模拟器文件查找 使用安卓模拟器下载文件后通常无法在系统硬盘上找到下载的文件,安卓 studio studio 其实提供了文件浏览工具,找到后可以直接使用 Android studio 打开 打开 Android studioview 菜单view > Tool Windows > Device…

智慧校园的作用是什么?

在近几年,智慧校园以其独有的姿态,悄然改变着教育的面貌。想象一下,当物联网、大数据、人工智能这些前沿技术与传统校园深度融合,教育空间不再局限于实体教室,知识获取也不再受制于时间与地点,一个更加开放…

物联网系统运维——数据库部署,Linux环境下MySQL安装,使用phpMyAdmin管理MySQL,实验CentOS 7安装MySQL

一.MySQL 1.概要 MySQL是一种关联数据库管理系统,关联数据:而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性库将数据保存在不同的表中。性能高、成本低、可靠性好,已经成为最流行的开源数据库。 二.MySQL安装与配置 1. …

P1223 排队接水

题目描述 有 𝑛 个人在一个水龙头前排队接水,假如每个人接水的时间为 𝑇𝑖,请编程找出这 𝑛 个人排队的一种顺序,使得 𝑛个人的平均等待时间最小。 输入格式 第一行为一个整数 &a…

python 字符串驻留机制

偶然发现一个python字符串的现象: >>> a 123_abc >>> b 123_abc >>> a is b True >>> c abc#123 >>> d abc#123 >>> c is d False 这是为什么呢,原来它们的id不一样。 >>> id(a)…

OOM日志分析

目录 1. 日志分析2. MAT 工具2.1 日志打印方式2.1.1 HeapDumpOnOutOfMemoryError(推荐)2.1.2 jmp 命令 2.2 MAT分析方式2.2.1 饼图分析2.2.2 树形图分析2.2.2 泄漏疑点 3. 优化 首先说一下结论:通过MAT工具分析才是最精准的,直接通…

Java程序之简单“记事本”

要求:如下图所示,记事本具有新建、打开文本、保存、关闭等功能。 算法思路: 这是一个使用Java Swing库创建的简单文本编辑器。它包含一个菜单栏,其中包含“文件”菜单以及四个子菜单项:“新建”、“打开”、“保存”和…

【Web APIs】DOM 文档对象模型 ⑤ ( 获取特殊元素 | 获取 html 元素 | 获取 body 元素 )

文章目录 一、获取特殊元素1、获取 html 元素2、获取 body 元素3、完整代码示例 本博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/APIgetElementById 函数参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/API/Document/getE…

torchinfo这个包中的summary真的很好用

1.安装直接使用 pip 进行安装即可: pip install torchinfo 2.导入该模块 from torchinfo import summary 3.使用模块 summary(model)#这里的model是你自己的model,可以添加参数进去 4.效果图: 第一个图片是直接打印model吗,…

华为某员工爆料:三年前985本科起薪30万,现在硕士起薪还是30w,感慨互联网行情变化

“曾经的30万年薪,是985本科学历的‘标配’,如今硕士也只值这个价?” 一位华为员工的爆料,揭开了互联网行业薪资变化的冰山一角,也引发了不少人的焦虑:互联网人才“通货膨胀”的时代,真的结束了…

【docker1】指令,docker-compose,Dockerfile

文章目录 1.pull/image,run/ps(进程),exec/commit2.save/load:docker save 镜像id,不是容器id3.docker-compose:多容器:宿主机(eth0网卡)安装docker会生成一…

【Git】win本地 git bash:Connect reset by 20.205.243.166 port22报错问题解决

win10 git bash 控制台 reset 22端口拒绝连接问题: Connection reset by 20.205.243.166 port 221、22端口 无法连接 ssh -T gitgithub.com2、尝试用443端口 仍然无法连接 ssh -T -P 443 gitgithub.com3、重写 git clone 地址 url,全局添加 https 前缀…

国产大模型技术创新分析

国产模型百舸争流,技术创新百花齐放 2023年下半年起,国内大模型领域迎来“百模大战”,各大厂商纷纷加速生成式AI的研发与突破,模型持续迭代升级,展现了人工智能技术的蓬勃发展与无限潜力。 中国大模型市场迅猛发展&am…

MapReduce程序设计2

要求 1、数据集stock-daily,包含A股近4000只股票的今年以来的日数据;数据集stock-daily-30d仅包含最近30个交易日数据,根据自己计算机性能选择。 数据来源:https://www.joinquant.com/help/api/help?nameJQData 2、数据集stoc…

每日签到页面模板组件,简单好用,用了会上瘾的那种

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。 今日给…