У нас есть устаревшее приложение, которое работает поверх WCF, поэтому мы пытаемся отказаться от него и найти другую технологию. Одна из проблем заключается в том, что нам нужна производительность по сети, поэтому часть оценки GRP C - это оценка того, как быстро он работает, а также сколько одновременных клиентов мы можем запустить.
Итак, с этой целью, мы моделируем множество вызовов с относительно небольшим объемом передаваемых данных, но большим количеством вызовов. В этом отношении WCF оказался значительно лучше, чем GRP C, что очень неожиданно. Возможно, что-то не так с тем, как тест был разработан и реализован?
Код сервера:
public override Task<TestReply> Test(TestRequest request, ServerCallContext context)
{
var ret = new char[request.Size];
var a = (int)'a';
for (var i = 0; i < request.Size; i++)
{
ret[i] = (char)(a + (i % 26));
}
return Task.FromResult(new TestReply { Message = new string(ret) });
}
Код клиента:
static void Main(string[] args)
{
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
using var channel = GrpcChannel.ForAddress("http://remote_server:8001", new GrpcChannelOptions { Credentials = ChannelCredentials.Insecure });
var client = new Greeter.GreeterClient(channel);
string TestMethod(int i)
{
var request = new TestRequest {Size = i};
return client.Test(request).Message;
}
var start = DateTime.Now;
for (var i = 0; i < 15625; i++)
{
var val = TestMethod(10);
}
var end = DateTime.Now;
}
Если мы запустим один экземпляр клиента, это занимает чуть менее 7 секунд. Если мы запустим 64 экземпляра одновременно, каждый займет в среднем 23 секунды. Частично проблема заключается в том, что запуск 64 экземпляров также требует большой нагрузки на ЦП как на клиенте, так и на сервере. С 64 клиентами клиент увидит использование ЦП 85-95%, а сервер - 70-80%.
Для сравнения, WCF запустит один экземпляр этого кода за 2,4 секунды, а 64 - за в среднем 9 секунд, и при этом никогда не будет значительной загрузки ЦП.
Неправильно ли мы используем GRP C? Что-то не так с тестом? Что мы можем сделать, чтобы GRP C работал немного быстрее / компактнее?