1

我在 kubernetes 集群中部署了服务(都是用 scala 编写的),让我们将它们命名为外部服务和内部服务

  1. 外部服务 - 5 个 pod,暴露 REST API,通过 grpc 客户端使用内部服务 grpc API
  2. 内部服务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
    }

  }
}
4

0 回答 0