我为最简单的情况编写了简单的基准测试:通过gRPC发送字符串Hello world并在ruby中休息:
# REST example
require 'sinatra'
set :bind, '0.0.0.0'
set :logging, false
get '/' do
'Hello, world!'
end
gRPC示例基于官方examples
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
class GreeterServer < Helloworld::Greeter::Service
def say_hello(hello_req, _unused_call)
Helloworld::HelloReply.new(message: "Hello #{hello_req.name}")
end
end
将此代码部署到远程服务器并运行1000个请求基准(ab
进行休息,并循环客户端对gRPC的请求,并获得51秒vs 53(REST与gRPS)的可比结果)
因此,我得出结论,在这种情况下(响应的数据量很少),gRPC没有任何好处。那么,它们什么时候出现?什么时候数据大小为千字节甚至兆字节?还是gRPC有本质上不同的用例,例如服务器和客户端之间的流式传输和双工数据?
此blog post表示gRPC的性能更好,但难于使用。
我认为改进的性能来自使用协议缓冲区进行数据传输;我认为这意味着数据以二进制格式传输,这意味着当您拥有更多数据(尤其是非字符串数据)时,性能会得到改善。