总结一下在使用gRPC的过程中踩过的那些坑, 一定要仔细看官方文档!!!
参考文档:
Language Guide (proto3)
Python Generated Code
1.前言
出于项目需要,使用Python对gRPC进行二次开发。以前从没有接触过相关的概念,对于RPC、xml、json的了解也只限于听过名字的程度。初步接触gRPC的推荐阅读资源:
gRPC官方(基本上所有资料都在这里,但全英文和一些专有名词看得我头疼)
Protobuf3语言指南(中文翻译版)
gRPC | Python视频教程
grpc| python 实战 grpc
python grpc框架之一 简单示例
Carson带你学序列化:手把手带你分析 Protocol Buffer使用源码
2.开发流程
使用如下命令将proto文件编译为两个可供二次开发使用的python文件(文件具体内容不用管,也不是很看得懂)
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. xxx.proto
xxx_pb2.py —— 和gRPC通信时双方交互的数据格式有关
xxx_pb2_grpc.py —— 和gRPC通信双方有关
使用Python进行二次开发的时候直接调用这两个文件里的方法就行了。
3.proto具体语法
proto3语法的官方文档
中文翻译版本
Generated-code reference(go语言版本中文翻译)
4.Python二次开发
在使用Python进行gRPC的二次开发的时候,我们一般会自定义client和server,两者的主要目标如下:
5.gRPC拓展
1.gRPC自定义Resolver(地址解析器)和Balancer(负载均衡器),不过好像是客户端做的,服务器端可以做吗?可以再看看。
2.gRPC基于Http2.0,支持流式通信,多路复用。
Http2.0多路复用:
多个流复用一个TCP连接;
一个流代表了一个完整的请求-响应过程,流中的数据被分为具有同一ID的多个帧进行传输;
一个域名只建立一条TCP连接。
3.gRPC使用protobuf定义接口数据,二进制编码,减少需要传输的数据量(protobuf轻量:与json比较,json为key-value,每个key都占用多个字节,int类型固定字节数。protobuf使用tag,编号标记key,仅占一字节,支持Varint,数据按实际长度存储)
6.踩过的坑
bytes
使用bytes()将变量转换为bytes类型时,有以下三种情况:
如果是数字,则不需要指定编码方式;
如果是string,则需要指定编码方式;
如果是数组,则数组里的数字需要在0-256之间。
序列化/反序列化
实际上转换为bytes类型时,应该使用SerializeToString()方法
相应的,反序列化的时候使用ParseFromString()方法
bytes&序列化/反序列化示例
6.线程池和并发RPC请求
server方法里有两个和并发有关的参数,thread_pool和maximum_concurrent_rpcs。
如果thread_pool中workers的数量小于maximum_concurrent_rpcs,则server能同时处理workers个RPC请求,其他的请求将进入等待队列,超过maximum_concurrent_rpcs数量的请求将直接被reject(参考链接)。
以上图中的参数为例,虽然有4个worker,但server最多能同时处理2个并发RPC请求,其他的将直接被reject。
如果不指定maximum_concurrent_rpcs的情况呢?是否可以处理无穷多个并发RPC请求?等待队列存储的并发请求有数量限制吗?超过此数量的并发请求是否会被直接reject?
python gRPC有自己的并发api——Asyncio api,但是目前还处在测试阶段(2022年06月),双向流模式下连个example都没有。而且使用Python这种解释型语言进行gRPC开发的性能基本上是垫底的,当时被python迷了心窍吧,现在只能重新换其他语言进行开发了(go/java)。
比较不同技术的 gRPC 性能
gRPC性能比较
7.kafka消息队列
原来打算使用消息队列提升服务器在高并发情况下的性能,但后来发现还是想得太简单了。
Kafka基本概念
topic——类似于数据库的表名,存储的是同一个topic的数据;
partition——将数据分区,分别位于多个broker(服务器)上,实现负载均衡;
win下运行kafka的流程
官网下载,二进制版本;
解压,cmd(bash会出错)进入解压后的文件夹;
输入下列命令,启动zookeeper和kafka。
.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
.\bin\windows\kafka-server-start.bat .\config\server.properties