我测试了 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

创建样本聊天应用程序

idea.png

匹配服务器

matching_server.png

客户端应用程序

client.png
    1. 当用户创建一个房间时,主持人就会被创建。

 

    用户可以选择已创建的房间并加入聊天。

第二个任务: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. 实际测量

measurement_scene.png

3. 尝试进行多播

multiplecast.png

测试结果

中央处理器和图形处理器的负载
image1.png
gRPC和REST的实测数据。
image8_fix.png
image5.png
gRPC的多播结果
image6.png

看起来实际测试值有相当大的差异呢。
似乎可以说,gRPC确实轻量快速。

总结

无论是数字上还是在感受上,结果本身都是良好的。

我认为虽然一开始提到了相关的好处,但实际上就像人们所说的那样。

    • gRPCとREST(Express)の処理速度には大きな違いがあると言える。

 

    • 他のプロトコルと比べて、3〜10分の1くらいコンパクトに開発ができる。

 

    様々なプログラミング言語をサポートしていて、クラスを簡単に生成できる。

看起来第三点,有一些库像GO等可以使用。
另外,虽然这次我们是在Unity中进行实验,但并不仅限于原生应用程序,似乎还有适用于Web的库,所以我们也想尝试在这方面进行实际测量。
grpc/rpc-web

广告
将在 10 秒后关闭
bannerAds