我测试了 gRPC 的通信速度
作者:阮清登
翻译:大草洋介
导演:大草洋介
首次发布日期:2020年9月3日
通信的话题 de
通常情况下,客户端到服务器或实例到实例的通信使用HTTP请求的REST API是常见的。但在需要低延迟和高速通信的项目中,如数据流传输,倾向于使用新的RPC框架”gRPC API”。
gRPC是什么?
GRPC API 是使用 Google 的协议缓冲区(缩写为“Protobuf” )和 HTTP/2 进行远程过程调用(RPC)的框架。
简单来说,它是RPC的升级版。
与传统的RPC框架类似,可以通过类似调用本地子程序的方式来调用远程子程序。
有时也会称其为“远程调用”或“远程方法调用(RMI)”等机制,类似于医疗设备的简称。
而且,通过使用gRPC,可以得到以下这些优点。
-
- XMLやJSONを使用するよりも、軽量で高速なので高効率。
-
- データ構造をプロトコルファイルとして定義し、使用言語と通信するファイルを自動的に生成してくれる。
- 様々な言語がサポートされている。(詳細はgRPCの公式ドキュメントを参照ください。)
在这篇文章中,我们将在Unity中运行gRPC和使用WebAPI(使用REST)来比较HTTP/2和HTTP的通信速度,然后进行调查和测量结果的比较。让我们一起来看看gRPC实际上是什么。
准备创建样本
为了进行测量,我们将使用自己准备的样本,兼顾公司内部培训。
这次我们制作了一个用户可以互相聊天的本地应用程序和服务器。
使用的库和框架:
-
- Protocol Buffers
-
- grpc_unity_package
-
- grpc (for C#)
-
- Node.js
- Express.js
参考链接:
-
- grpc/grpc
-
- gRPCとProtocol Buffersによるアプリケーション間通信 / Unity | npaka | note
-
- REST vs. gRPC: Battle of the APIs
-
- Authentication – gRPC
- gRPC + NodeJS = Chat Example | Fexco Tech Blog
创建样本聊天应用程序

匹配服务器

客户端应用程序

-
- 当用户创建一个房间时,主持人就会被创建。
- 用户可以选择已创建的房间并加入聊天。
第二个任务:gRPC和REST的比较。
1. 服务器通信测试:比较 JSON 数据(REST)和二进制数据(gRPC)。
我们按照以下方式创建proto文件。
syntax = "proto3";
option csharp_namespace = "Simple.Grpc";
package simple;
// Request
message SimpleRequest{
string username = 1;
string message = 2;
}
// Response
message SimpleResponse{
string username = 1;
string message = 2;
}
// RPC method
service SimpleService{
rpc SimpleSend (SimpleRequest) returns (SimpleResponse) {}
}
创建使用gRPC进行通信的服务器代码(NodeJS)
let grpc = require("grpc");
var protoLoader = require("@grpc/proto-loader");
const server = new grpc.Server();
const SERVER_ADDRESS = "10.11.21.231:5001";
// Load protobuf
let proto = grpc.loadPackageDefinition(
protoLoader.loadSync("protos/simple.proto", {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
})
);
function SimpleSend(call, callback) {
console.log(call.request);
callback(null, { username: call.request.username, message: call.request.message });
}
// Define server with the methods and start it
server.addService(proto.simple.SimpleService.service, { SimpleSend: SimpleSend });
server.bind(SERVER_ADDRESS, grpc.ServerCredentials.createInsecure());
server.start();
#endFile
# install node module `npm install`
# install grpc loader `npm install --save grpc @grpc/proto-loader`
node ./nodejs/gRPC/server.js
用ExpressJS创建服务器代码以进行通信
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json({ limit: '10mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '10mb' }));
app.use(bodyParser.json());
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With,Content-Type, Accept");
next();
});
app.listen(5002, '10.11.21.231', function () {
/***
* Router
***/
app.post('/', (req, res) => {
console.log({ response: req.body });
return res.send({ response: req.body })
});
});
#endFile
# install node module `npm install`
node ./nodejs/Express/server.js
2. 实际测量

3. 尝试进行多播

测试结果
中央处理器和图形处理器的负载

gRPC和REST的实测数据。


gRPC的多播结果

看起来实际测试值有相当大的差异呢。
似乎可以说,gRPC确实轻量快速。
总结
无论是数字上还是在感受上,结果本身都是良好的。
我认为虽然一开始提到了相关的好处,但实际上就像人们所说的那样。
-
- gRPCとREST(Express)の処理速度には大きな違いがあると言える。
-
- 他のプロトコルと比べて、3〜10分の1くらいコンパクトに開発ができる。
- 様々なプログラミング言語をサポートしていて、クラスを簡単に生成できる。
看起来第三点,有一些库像GO等可以使用。
另外,虽然这次我们是在Unity中进行实验,但并不仅限于原生应用程序,似乎还有适用于Web的库,所以我们也想尝试在这方面进行实际测量。
grpc/rpc-web