我在 kubernetes 集群中部署了服务(都是用 scala 编写的),让我们将它们命名为外部服务和内部服务
- 外部服务 - 5 个 pod,暴露 REST API,通过 grpc 客户端使用内部服务 grpc API
- 内部服务1个pod,暴露grpc API
问题 - 当我使用某些 grpc 客户端(例如 BloomRPC)通过端口转发调用内部服务 grpc API 时,延迟在 1 秒(平均 300 毫秒)内非常好,但是当我使用 grpc 客户端(用 scala 编写)使用相同的 grpc API 时,它总是平均 > 2 秒。我知道由于 TPC 连接处理,第一次调用需要时间,但即使在 JVM 预热之后也总是需要 2-4 秒。我只在服务启动时创建一次 grpc 通道(在主方法中,异步存根)并重复使用相同的通道,没有启用客户端 grpc 负载平衡。如何改善延迟?
class MyServiceGrpcClient(val channel: ManagedChannel) {
val myServiceStub = MyServiceGrpc.stub(channel)
def this(host: String, port: Int) {
this(ManagedChannelBuilder.forAddress(host, port).usePlaintext().build())
}
@throws[InterruptedException]
def shutdown(): Unit = {
channel.shutdown.awaitTermination(5, TimeUnit.SECONDS)
}
}
object ExternalServiceApp extends App {
val host = sys.env.getOrElse("HOST_NAME", "internal-service-name") //Its k8s ClusterIP service name
val port = sys.env.getOrElse("PORT", "1234")
val internalGrpcClient = new MyServiceGrpcClient(wesHost, wesPort).myServiceStub
val routes = new ExternalRoutes(internalGrpcClient)
//Akka http routes logic, route API calls grpc API
}
class ExternalRoutes(grpcClient: MyServiceGrpcClient){
override def getResponse(request: Request): Future[Response] = {
grpcClient.internalGrpcApi(request).map { resp =>
resp
}
}
}