241125学习日志——[CSDIY] [ByteDance] 后端训练营 [18]

news2024/11/26 7:21:30

CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!!
第一弹:Cpp零基础学习【30 DAYS 从0到1】
第二弹:Cpp刷题文档【LeetCode】
第三弹:Go开发入门【字节后端青训营】
第四弹:Cpp简单项目开发【黑马Rookie】
第五弹:数据结构绪论【数据结构与算法】
第六弹:Go工程实践【字节后端青训营】
第七弹:高质量编程和性能调优【字节后端青训营】
第八弹:Linux 基础知识【书生大模型训练营】
第九弹:Python 基础知识【书生大模型训练营】
第十弹:Git 基础知识【书生大模型训练营】
第十一弹:玩转HF/魔搭/魔乐社区【书生大模型训练营】
第十二弹:书生大模型全链路开源体系【书生大模型训练营】
第十三弹:玩转书生「多模态对话」与「AI搜索」产品【书生大模型训练营】
第十四弹:浦语提示词工程实践【书生大模型训练营】
第十五弹:HTTP 框架修炼之道【字节后端青训营】
第十六弹:打开抖音会发生什么【字节后端青训营】
第十七弹:将我的服务开放给用户【字节后端青训营】
第十八弹:InternLM + LlamaIndex RAG 实践【书生大模型训练营】
第十九弹:深入浅出 RPC 框架【字节后端青训营】

241125——[ByteDance] [06] 深入浅出 RPC 框架

01. 基础概念

1.1 本地函数调用

压栈…弹栈…等等操作

基于 Go 语言的实现。

1.2 远程函数调用(RPC - Remote Procedure Calls)

RPC 需要解决的问题

  1. 函数映射
  2. 数据转换成字节流
  3. 网络传输

1.3 RPC 概念模型

1.4 一次 RPC 的完整过程

IDL 文件:Interface description language

生成文件

编解码

通信协议

网络传输

1.5 RPC 的好处

  1. 单一职责,有利于分工协作和运维开发
  2. 可扩展性强,资源使用率更优
  3. 故障隔离,服务的整体可靠性更高

1.6 RPC 带来的问题

  1. 服务宕机,对方如何处理?
  2. 在调用过程中发生网络异常
  3. 请求量徒增导致服务无法及时处理

👇

RPC 框架应运而生

02. 分层设计

编解码层|协议层|网络通信层

2.1 分层设计 - 以 Apache Thrift 为例

用户编写的业务逻辑代码

👇

通过代码生成工具转化为 lib 代码

👇

框架的编解码层

👇

框架的协议层

👇

框架的网络通信层

2.3 编解码层 - 生成代码

IDL 生成不同语言的 CodeGen

2.4 编解码层 - 数据格式

  • 语言特定格式
    • 许多编程语言都内建了将内存对象编码为字节序列的支持
  • 文本格式
    • JSON、XML、CSV 等文本格式,具有人类可读性
  • 二进制编码
    • 具备跨语言和高性能等优点,常见有 Thrift 的 BinaryProtocol,Protobuf 等

2.5 编解码层 - 二进制编码

  • TLV编码

    • Tag:标签(类型)
    • Length:长度
    • Value:值

2.6 编解码层 - 选型

  • 兼容性
    • 支持自动增加的字段,而不影响老的服务,提高系统的灵活度
  • 通用性
    • 支持跨平台、跨语言
  • 性能
    • 从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长

2.7 协议层

约定的通信协议

2.8 协议层 - 概念

  • 特殊结束符
    • 一个特殊字符作为每个协议单元结束的表示
  • 变长协议
    • 以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度

2.9 协议层 - 协议构造

LENGTH:数据包大小

HEADER MAGIC:标识版本信息

SEQUENCE NUMBER:表示数据包的 seqID

HEADER SIZE:头部长度

PROTOCOL ID:…

TRANSFORM ID:…

INFO ID:…

PAYLOAD:…

2.10 协议层 - 协议解析

2.11 网络通信层

2.12 网络通信层 - Sockets API

2.13 网络通信层 - 网络库

  • 提供易用 API
    • 封装底层 Scoket API
    • 连接管理和事件分发
  • 功能
    • 协议支持:tcp、udp 和 uds 等
    • 优雅退出(高级功能…)、异常处理等
  • 性能
    • 应用层 buffer 减少 copy
    • 高性能定时器、对象池等

03. 关键指标

3.1 稳定性 - 保障策略

  • 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
  • 限流:保护被调用方,防止大流量把服务压垮
  • 超时控制:避免浪费资源在不可用节点上

均会导致 👉 降级

3.2 稳定性 - 请求成功率

负载均衡、重试

3.3 稳定性 - 长尾请求

Backup Request

设计Backup request的关键是要防止服务器繁忙时期的请求风暴。在服务器繁忙时期client容易发生等待超时,倾向于发送backup request。大量的backup request会进一步让服务器更繁忙,于是请求风暴诞生了。防止请求风暴的要点是区分普通超时和风暴期超时。

3.4 稳定性 - 注册中间件

3.5 易用性

  • 开箱即用

    • 合理的默认参数选项、丰富的文档
  • 周边工具

    • 生成代码工具、脚手架工具

简单易用的命令行工具…

3.6 扩展性

  • Middleware
  • Option
  • 编解码层
  • 协议层
  • 网络传输层
  • 代码生成工具插件扩展

3.7 观测性

  • Log、Metric、Tracing
  • 内置观测性服务

3.8 高性能

场景

  • 单机多机
  • 单连接多连接
  • 单/多 client 单/多 server
  • 不同大小的请求包
  • 不同请求类型:pingpong streaming

目标

  • 高吞吐
  • 低延迟

手段

  • 连接池
  • 多路复用
  • 高性能编解码协议
  • 高性能网络库

04. 企业实践

4.1 整体架构 - Kitex

Kitex Core 核心组件

Kitex Byted 与公司内部基础设施集成

Kitex Tool 代码生成工具

4.2 自研网络库 - 背景

  • 原生库无法感知连接状态
    • 在使用连接库时,池中存在失效连接
  • 原生库存在 goroutine 暴涨的风险
    • 一个连接 一个 goroutine 的模式,由于连接利用率低下,存在大量 goroutine 占用调度开销,影响性能

4.3 自研网络库 - Netpoll

  • 解决无法感知连接状态问题
    • 引入 epoll 主动监听机制
  • 解决 goroutine 暴涨风险

4.4 扩展性设计

支持多协议,也支持灵活的自定义协议扩展

4.5 性能优化 - 网络库优化

  • 调度优化
  • LinkBuffer
  • Pool
    • 引入内存池和对象池,减少 GC 开销

4.6 性能优化 - 编解码优化

  • Codegen
    • 预计算并预分配内存,减少内存操作次数,包括内存分配和拷贝
    • Inline 减少函数调用次数和不必要的反射操作
    • 自研 Go 语言实现的 Thrift IDL 解析和代码生成器
  • JIT
    • Frugal

4.7 合并部署

微服务过微,传输和序列化开销越来越大

  • 中心化的部署调度和流量控制
  • 基于共享内存的通信协议
  • 定制化的服务发现和连接池实现

碎碎念:八股文选手养成日记,只是一位复制PPT上的文字,其实根本没有进入脑子,如此懒惰作风什么时候能改掉?但其实我也不想烂。只是真的没有时间。

与君共勉。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【抓包专题】burpsuitProxifier小程序抓包

抓包系列文章 burpsuit&Proxifier&小程序抓包 抓包系列文章前言一、工具下载二、获取证书并安装到本地三、抓包测试 前言 抓包是进行渗透的第一步,包都抓不到,渗透就不要谈了,废话少说,开干 一、工具下载 Proxifier安装使…

springboot 异步 @Async 的日常使用及失效场景

文章目录 springboot 异步 Async 的日常使用引言一、Async 使用位置二、Async 使用三、注解 Async 失效的情况(1)调用同一个类中的异步方法(内部调用)(2)未使用 EnableAsync 注解(3)…

WebGIS技术汇总

WebGIS系统通常都围绕地图进行内容表达,但并不是有地图就一定是WebGIS,所以有必要讨论下基于Web的地图API分类及应用场景。 Web上的Map API主要分类如下几类: Charts:以D3.js,Echarts等为代表。LBS:以高德…

使用Vue3来实现一个倒计时器以及倒计时任务

本内容使用Vue3,以及element-plus辅助开发。 首先展示倒计时器的功能: 手动设置倒计时器的倒计时时间开始倒计时按钮暂停倒计时按钮重新开始倒计时按钮 其次展示倒计时任务管理界面功能: 创建倒计时任务选择任务并进行倒计时删除任务 目录 一…

VMware Workstation 虚拟机运行卡顿解决方案

前言 由于我们网站主力是模拟器多开,VMware虚拟机纯属我个人使用的经验,仅供参考。顺带一提:多开鸭的系统精简掉的是Hyper-V,跟VMware完全没有任何关系,Hyper-V跟雷电这些模拟器会冲突,但是移除之后不会影…

GitLab|应用部署

创建docker-compose.yaml文件 输入docker-compose配置 version: 3.8 services:gitlab:image: gitlab/gitlab-ce:15.11.2-ce.0restart: alwayscontainer_name: gitlab-ceprivileged: truehostname: 192.168.44.235environment:TZ: Asia/ShanghaiGITLAB_OMNIBUS_CONFIG: |exter…

ssm182在线作业管理系统的设计与实现+vue(论文+源码)_kaic

设计题目:在线作业管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所…

LeetCode-632. Smallest Range Covering Elements from K Lists [C++][Java]

目录 题目描述 解题思路 【C】 【Java】 LeetCode-632. Smallest Range Covering Elements from K Listshttps://leetcode.com/problems/smallest-range-covering-elements-from-k-lists/description/ 题目描述 You have k lists of sorted integers in non-decreasing o…

指针的奥秘:深入探索内存的秘密

前言 在计算机编程的广阔天地中,指针作为一种独特的数据类型,它不仅是C语言的核心,也是理解计算机内存管理的基石。指针的概念虽然强大,但对于初学者来说,它常常是学习过程中的一个难点。本文旨在揭开指针的神秘面纱&a…

⭐ Unity 资源管理解决方案:Addressable_ Demo演示

一、使用Addressable插件的好处: 1.自动管理依赖关系 2.方便资源卸载 3.自带整合好的资源管理界面 4.支持远程资源加载和热更新 二、使用步骤 安装组件 1.创建资源分组 2.将资源加入资源组 3.打包资源 4.加载资源 三种方式可以加载 using System.Collections…

红日靶场-4

环境搭建 我们这里会拿到三台主机,一台web主机,一台win7主机,一台DC主机 机器密码 WEB主机 ubuntu:ubuntu WIN7主机 douser:Dotest123 (DC)WIN2008主机 administrator:Test2008 登陆后需修改密码,我这里修改为1qazWSX 网络配…

使用八爪鱼爬虫抓取汽车网站数据,分析舆情数据

我是做汽车行业的,可以用八爪鱼爬虫抓取汽车之家和微博上的汽车文章内容,分析各种电动汽车口碑数据。 之前,我写过很多Python网络爬虫的案例,使用requests、selenium等技术采集数据,这次尝试去采集小米SU7在微博、汽车…

具有多个表盘、心率传感器、指南针和游戏的 DIY 智能手表

在此,我们将使用所学到的知识,结合使用硬件和软件组件从头开始创建自己的智能手表。在项目的这一部分,您将被指导完成组装硬件组件、设置软件以及配置智能手表的设置和功能的过程。到本项目结束时,您将拥有一款功能齐全的智能手表…

Django+Nginx+uwsgi网站Channels+redis+daphne多人在线聊天实现粘贴上传图片

在DjangoNginxuwsgi网站Channelsredisdaphne多人在线的基础上(详见DjangoNginxuwsgi网站使用Channelsredisdaphne实现简单的多人在线聊天及消息存储功能-CSDN博客),实现在输入框粘贴或打开本地图片,上传到网站后返回图片路径&…

[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案

问题log /tmp/ccByifPx.o: In function main: read.c:(.text0x1a): undefined reference to shm_open read.c:(.text0xd9): undefined reference to shm_unlink collect2: error: ld returned 1 exit status 程序代码 #include <stdio.h> #include <stdlib.h> #…

Otter 安装流程

优质博文&#xff1a;IT-BLOG-CN 一、背景 随着公司的发展&#xff0c;订单库的数据目前已达到千万级别&#xff0c;需要进行分表分库&#xff0c;就需要对数据进行迁移&#xff0c;我们使用了otter&#xff0c;这里简单整理下&#xff0c;otter 的安装过程&#xff0c;希望对…

wsl2的Ubuntu18.04安装ros和anaconda

参考&#xff1a;超详细 WSL2 安装 ros 和 anaconda_wsl2安装anaconda-CSDN博客 一.安装ros 1. 更换系统源 输入 wget http://fishros.com/install -O fishros && . fishros 和上面的链接一样&#xff0c;依次输入5-2-1 2. 安装ros 输入 wget http://fishros.c…

鸿蒙NEXT开发案例:字数统计

【引言】 本文将通过一个具体的案例——“字数统计”组件&#xff0c;来探讨如何在鸿蒙NEXT框架下实现这一功能。此组件不仅能够统计用户输入文本中的汉字、中文标点、数字、以及英文字符的数量&#xff0c;还具有良好的用户界面设计&#xff0c;使用户能够直观地了解输入文本…

【经典】抽奖系统(HTML,CSS、JS)

目录 1、添加参与者 2、多次添加 3、点击抽奖 功能介绍&#xff1a; 使用方法&#xff1a; 完整代码&#xff1a; 一个简单但功能强大的抽奖系统的示例&#xff0c;用于在网页上实现抽奖。 1、添加参与者 2、多次添加 3、点击抽奖 功能介绍&#xff1a; 参与者添加&…

用树莓派Pico控制8×8 LED点阵屏:深入解析C++核心知识与动态显示实现

88 LED点阵屏是一种直观的硬件显示工具,广泛应用于嵌入式开发中。本项目结合树莓派Pico和HT16K33驱动芯片,通过C++编程实现动态图案和文字的显示功能。本文将全面解析项目中的C++核心知识点,帮助读者深入理解C++在硬件编程中的实际应用。 一、项目背景与硬件简介 1. 项目目…