我用kotlin实现了一个简单的grpc演示项目。演示流程由几个部分组成:预处理两个请求、许多后续的预热请求和最后一个请求。我已经用java实现了相同的演示来比较性能。完整代码可在此处找到:https://github.com/frame17/grpc-demo . 原型定义:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "application";
package grpc;
message Request {
string name = 1;
}
message Response {
string message = 1;
}
service PingService {
rpc Ping (Request) returns (Response) {}
}
客户端代码如下所示:
class TestClient(private val channel: ManagedChannel) {
private val stub: PingServiceGrpcKt.PingServiceCoroutineStub = PingServiceGrpcKt.PingServiceCoroutineStub(channel)
suspend fun ping() {
val request = Request.newBuilder().build()
stub.ping(request)
}
}
fun main() {
val port = 8080
val channel = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext().build()
val client = TestClient(channel)
measureNanoTime {
runBlocking {
client.ping()
}
}.also {
println("Connecting: $it")
}
measureNanoTime {
runBlocking {
client.ping()
}
}.also {
println("Before warm up: $it")
}
val n = 100_000
measureNanoTime {
runBlocking {
IntRange(0, n).map {
async {
client.ping()
}
}.awaitAll()
}
}.also {
println("Warm up: ${it / n}")
}
measureNanoTime {
runBlocking {
client.ping()
}
}.also {
println("After warm up: $it")
}
}
我得到以下测量值(以纳秒为单位):
Connecting: 5923889409
Before warm up: 14580037
Warm up: 259311
After warm up: 20627192
关于它的性能,我有几点担心:
第一个请求通常需要5秒钟左右。我假设,它建立了一个实际的连接,随后的请求正在重用它。能做些什么来改善这一点吗?
预热后的请求可能需要20毫秒。java客户机的度量有很大的不同:
Connection: 5560394651
Before warm up: 6416257
Warm up: 358423
After warm up: 307845
预热后的请求不超过0.5毫秒。代码中是否有问题,原因是什么,如何解决?
暂无答案!
目前还没有任何答案,快来回答吧!