ich habe ein Problem mit gRPC in folgendem Setup:
Api-Gateway <-> gRPC-Server <-> Azure CosmosDB
Die API sowie den gRPC-Server lasse ich beide auf localhost laufen (mit tls). Das Problem nun: Selbst wenn beides Services hot sind dauert eine GetAll-Response (377 Byte response body) 2,08 Sekunden.
Hab jetzt die Dauer der einzelnen Schritte analysiert und hier die Bremse idenzifiziert:
public async Task<List<ToolDto>> GetAll()
{
return await GrpcCallerService.CallService(_urls.GrpcTools, async channel =>
{
var client = new ToolStore.ToolStoreClient(channel);
var response = await client.GetAllToolsAsync(new AllToolsRequest()); //dauert ~2000ms
return response.Tools.Select(x => _mapper.Map<ToolDto>(x)).ToList();
});
}
Auf der anderen Seite von AllToolsRequest antwortet braucht der gRPC-Server allerdings nur ~22ms zum verarbeiten:
public override async Task<MultipleToolReply> GetAllTools(AllToolsRequest request, ServerCallContext context)
{
try
{
var tools = await _toolRepository.GetAll();
var result = new MultipleToolReply();
result.Tools.AddRange(tools.Select(x => _mapper.Map<ToolReply>(x)));
return result;
}
catch (Exception ex)
{
throw new RpcException(new Status(StatusCode.Internal, ex.Message));
}
}
Das Problem muss im gRPC-Server verortet sein, da ich bei abrufen mit 3rd party tools wie bloomRPC auf die gleichen response Zeiten komme.
Sprich irgendwas in der Übertragung ist extrem langsam. Habt ihr irgendeine Idee woran das liegen kann?
gRPC-Server:
Program.cs
.UseKestrel(options =>
{
var ports = GetDefinedPorts(configuration);
var serviceName = Environment.GetEnvironmentVariable("service_name") ?? "localhost";
options.Listen(IPAddress.Any, ports.grpcPort, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
listenOptions.UseHttps($"/etc/certs/{serviceName}.p12", serviceName);
});
})
Startup.cs
services.AddGrpc();
//...
app.UseEndpoints(endpoints =>
{
GrpcEndpointRouteBuilderExtensions.MapGrpcService<ToolService>(endpoints);
});
Beste Grüße
emuuu