第六届字节跳动青训营笔记篇(四) | 青训营

92 阅读3分钟

1.远程过程调用(RPC)需要解决以下关键问题:首先,它需要建立函数与远程服务的映射,以便客户端能够调用远程服务的特定函数。其次,数据必须转换为字节流,以便在网络上传输。最后,网络传输本身需要管理,确保数据安全且可靠地在客户端和服务端之间传递。

2.接口描述语言(IDL)通过一种中立的方式描述服务接口,使得不同平台上运行的对象和使用不同编程语言编写的程序能够相互通信。为了实现这一点,首先需要将IDL文件通过编译器工具转换为特定编程语言的代码库。然后,编解码步骤是将内存中的数据转换为字节序列(编码),或者将字节序列还原为内存数据(解码)。通信协议定义了数据在网络中传输的格式和内容,通常除了核心的请求和响应数据外,还会包含一些附加的元数据。最后,网络传输阶段通常基于成熟的网络库,使用TCP或UDP协议进行数据传输。

3.RPC的优势包括:a)它促使系统拥有清晰的单一职责,这有助于更好的分工协作和开发维护;b)它的可扩展性强,允许有效地利用资源;c)通过隔离故障,提高了整体服务的可靠性。

4.为确保系统稳定性,常见的保障策略包括:a)熔断机制,用于保护调用方,防止故障的服务影响整个系统;b)限流机制,用于保护被调用方,防止大量请求过载服务;c)超时控制,以防止资源浪费在不响应的节点上。

5.RPC框架的易用性体现在:a)提供合理的默认参数和丰富的文档,使其可以轻松上手;b)提供周边工具,如代码生成工具和脚手架,进一步简化开发流程。

6.观测性是监控系统运行的关键,其中包括日志记录、度量指标和分布式追踪。系统通常会内置观测性服务,以便开发人员更好地理解和监控系统的状态。

7.在高性能场景下,RPC的优化包括考虑单机多级架构、单连接多连接方式、不同规模的客户端和服务器、不同大小的请求等。为了实现高吞吐和低延迟,可以使用连接池、多路复用、高性能编解码协议以及优化的网络库等手段。

8.自研的网络库(如Netpoll)可以解决无法感知连接状态的问题,避免潜在的goroutine暴涨风险,并提升系统性能。

9.通过代码生成(Codegen)技术,可以预先计算和分配内存,减少内存操作次数,包括内存分配和拷贝。使用内联技术可以减少函数调用次数和避免不必要的反射操作。同时,自研的IDL解析和代码生成工具(如Thriftgo)可以支持丰富的IDL语法和语义检查,并提供插件机制。

10.使用基于JIT编译技术的动态编解码器(如Frugal)可以在提高性能的同时减轻用户维护生成代码的负担,从而改善用户体验。

11.在微服务架构中,由于传输和序列化开销逐渐增大,合并部署是一种策略。通过将具有亲和性的服务实例调度到同一物理机,可以将远程RPC调用优化为本地IPC调用,从而降低通信开销