gRPC远程调用协议

简介: gRPC远程调用协议

gRPC

简介

gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2+PB 保证了的高性能。

HTTP2.0

grpc采用HTTP2.0,相对于HTTP1.0 在更快的传输和更低的成本两个目标上做了改进。有以下几个基本点:

  • 引入帧、流的概念,在TCP连接中,可以区分出多个request/response
  • 一个域名只会有一个TCP连接,借助帧、流可以实现多路复用,降低资源消耗
  • 引入二进制编码,降低header带来的空间占用

HTTP1.1核心问题在于:在同一个TCP连接中,没办法区分response是属于哪个请求,一旦多个请求返回的文本内容混在一起,则没法区分数据归属于哪个请求,所以请求只能一个个串行排队发送。这直接导致了TCP资源的闲置。

HTTP2为了解决这个问题,提出了流的概念,每一次请求对应一个流,有一个唯一ID,用来区分不同的请求。基于流的概念,进一步提出了帧,一个请求的数据会被分成多个帧,方便进行数据分割传输,每个帧都唯一属于某一个流ID,将帧按照流ID进行分组,即可分离出不同的请求。这样同一个TCP连接中就可以同时并发多个请求,不同请求的帧数据可穿插在一起,根据流ID分组即可。HTTP2.0基于这种二进制协议的乱序模式 (Duplexing),直接解决了HTTP1.1的核心痛点,通过这种复用TCP连接的方式,不用再同时建多个连接,提升了TCP的利用效率。

gRPC的异步通信

不管是 Client 还是 Server,异步 gRPC 都是利用 CompletionQueue API 进行异步操作。基本的流程:

  • 绑定一个 CompletionQueue 到一个 RPC 调用
  • 利用唯一的 void* Tag 进行读写
  • 调用 CompletionQueue::Next() 等待操作完成,完成后通过唯一的 Tag 来判断对应什么请求/返
    回进行后续操作

gRPC 的 CompletionQueue(CQ)是一个事件队列,用于处理 gRPC 异步操作的完成事件。它是 gRPC 实现异步通信的核心机制之一。

CompletionQueue 可以理解为一个事件循环,它会不断地从网络层接收到来自服务端的响应或客户端请求的完成事件,并将这些事件加入到队列中。在客户端代码或服务端代码中,我们可以通过异步 API 来向 CompletionQueue 注册我们感兴趣的事件,然后等待 CompletionQueue 返回这些事件的完成状态。

在客户端,我们可以通过 CompletionQueue 来实现异步的 gRPC 调用。当我们调用 gRPC 的异步 API 时,会向 CompletionQueue 注册一个请求完成事件。当服务端响应到达时,CompletionQueue 会将该事件放入队列中,并通知客户端代码请求已完成。此时客户端可以从 CompletionQueue 中取出该事件,获取响应数据,并进行后续处理。

在服务端,我们可以通过 CompletionQueue 来实现异步的 gRPC 处理。当服务端接收到客户端的请求时,会向 CompletionQueue 注册一个请求完成事件。当处理完成时,服务端将该事件放入队列中,并通知 CompletionQueue 请求已完成。此时服务端可以从 CompletionQueue 中取出该事件,获取请求数据,并进行后续处理。

总之,CompletionQueue 是 gRPC 实现异步通信的核心机制,它可以帮助我们实现高效、低延迟的 gRPC 应用程序。

grpc网络模型

grpc同步模型

grpc会启动多个线程的epoll来处理描述符,不管异步还是同步,每个epoll都对应一个线程。

其中监听scceptfd会被轮询地放在所有线程的epoll中,保证线程上的负载均衡。目前grpc的分配策略是轮询(round-robin)

grpc异步模型

异步处理的epoll方式和同步是类似的,但对于rpc函数的响应提供了更灵活的处理机制,可以将一些耗时的处理逻辑放到外部的线程池进行处理。

grpc四种模式

一元RPC模式

服务器 流RPC模式

客户端流RPC模式

双向流RPC模式

目录
相关文章
|
Java 测试技术 Apache
Mac 下安装压力测试工具JMeter
Mac 下安装压力测试工具JMeter
1402 0
|
缓存 中间件 测试技术
SOME/IP协议实践指南:精选开发与测试工具解析
SOME/IP协议实践指南:精选开发与测试工具解析
1025 0
|
3月前
|
缓存 监控 算法
吃透 JVM 内存管理与调优:从底层原理到生产级落地实战(JDK17 专属)
本文深入解析JDK17 JVM内存管理与调优。首先剖析JVM内存模型核心架构,包括线程私有区域(程序计数器、虚拟机栈、本地方法栈)和共享区域(堆、元空间等)。通过可复现代码示例演示栈溢出、堆OOM等异常场景,并介绍jstat、jstack等排查工具。详细讲解垃圾回收算法(标记-清除、复制、整理)及JDK17主流收集器(G1、ZGC等)的适用场景。重点阐述生产级调优全流程:从监控定位问题到参数优化,提供常见问题排查方案和参数配置最佳实践。
491 6
|
1月前
|
存储 缓存 人工智能
当 Agent 从模型调用,走向系统工程:OpenAI 和 LangChain 的两种实践
OpenAI与LangChain最新实践揭示:AI Agent 正从“模型调用”迈向“系统工程”。前者以 WebSocket 优化API链路,提速40%;后者强调Feedback驱动Trace闭环,实现持续演进。效率与进化,缺一不可。
313 8
|
Java 开发者 索引
Netty基础—6.Netty实现RPC服务
本文详细介绍了RPC(远程过程调用)的相关概念及其实现细节,涵盖动态代理、Netty客户端和服务端处理、编码解码器以及超时功能的实现。
|
JSON 负载均衡 网络协议
gRPC知识归档
gRPC知识归档
|
机器学习/深度学习 缓存 人工智能
《DeepSeek在高并发下的性能秘籍:稳定性与速度保障》
DeepSeek是一款基于Transformer架构的大语言模型,专为高并发场景设计。通过自注意力机制、分布式系统和负载均衡技术,DeepSeek能高效处理多请求,确保稳定性和快速响应。其缓存机制加速数据获取,模型优化提升计算效率,动态资源调配灵活应对流量波动。这些技术共同作用,使DeepSeek在智能客服、内容推荐等场景中表现出色,成为高并发应用的理想选择。
1301 10
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
709 57
|
消息中间件 存储 NoSQL
RabbitMQ入门指南:初学者也能读懂的教程(四)
RabbitMQ入门指南:初学者也能读懂的教程
434 0
|
Java Apache
Java解压rar5兼容rar4
【8月更文挑战第2天】在Java中解压rar5并兼容rar4格式文件通常需借助第三方库,如JUnrar。示例代码展示了如何利用JUnrar库解压rar文件:首先确保已添加JUnrar依赖,然后通过`Archive`类读取rar文件,并逐个提取非目录条目到指定路径。实际使用时需替换文件路径。也可考虑使用Apache Commons Compress库,但可能需额外配置以支持rar5和rar4。
1766 2