Здравствуйте, takTak, Вы писали:
T>с целью интеграции сторонней старой дотнетовской dll решил написать сервер, который бы заворачивал вызов этой dll, так что из нового .net core приложения можно было бы по http или http/2 вызывать эту старую функциональность, хотелось сравнить старый web api с новым grpc, ну я выбрал gRPC-Web, ну так вот получилось, что вызов по gRPC-Web раза в два- три получается медленнее, чем asp.net web api; gRPC-server хостился во время измерений в обычной консоле, а web api в iis express, и то и другое компилировалось под .net 4.6.2, как такое вообще может быть, что gRPC-Web получился медленнее??
T>ещё хочу добавить: для сериализации использовал protobuf-net.Grpc: неужели там такие проблемы?
Здравствуйте, takTak, Вы писали:
T>с целью интеграции сторонней старой дотнетовской dll решил написать сервер, который бы заворачивал вызов этой dll, так что из нового .net core приложения можно было бы по http или http/2 вызывать эту старую функциональность, хотелось сравнить старый web api с новым grpc, ну я выбрал gRPC-Web, ну так вот получилось, что вызов по gRPC-Web раза в два- три получается медленнее, чем asp.net web api; gRPC-server хостился во время измерений в обычной консоле, а web api в iis express, и то и другое компилировалось под .net 4.6.2, как такое вообще может быть, что gRPC-Web получился медленнее??
T>ещё хочу добавить: для сериализации использовал protobuf-net.Grpc: неужели там такие проблемы?
MagicOnion allows primitive, multiple request value. Complex type is serialized by LZ4 Compressed MsgPack by MessagePack for C# so type should follow MessagePack for C# rules.
и солнце б утром не вставало, когда бы не было меня
T>>с целью интеграции сторонней старой дотнетовской dll решил написать сервер, который бы заворачивал вызов этой dll, так что из нового .net core приложения можно было бы по http или http/2 вызывать эту старую функциональность, хотелось сравнить старый web api с новым grpc, ну я выбрал gRPC-Web, ну так вот получилось, что вызов по gRPC-Web раза в два- три получается медленнее, чем asp.net web api; gRPC-server хостился во время измерений в обычной консоле, а web api в iis express, и то и другое компилировалось под .net 4.6.2, как такое вообще может быть, что gRPC-Web получился медленнее??
T>>ещё хочу добавить: для сериализации использовал protobuf-net.Grpc: неужели там такие проблемы?
VC>ничего не понятно. заверни поднятие сервера в [GlobalSetup]-метод, а вызов сервера в [Benchmark]-метод
VC>И выложи на github/gitlab
VC>сможеш?
с целью интеграции сторонней старой дотнетовской dll решил написать сервер, который бы заворачивал вызов этой dll, так что из нового .net core приложения можно было бы по http или http/2 вызывать эту старую функциональность, хотелось сравнить старый web api с новым grpc, ну я выбрал gRPC-Web, ну так вот получилось, что вызов по gRPC-Web раза в два- три получается медленнее, чем asp.net web api; gRPC-server хостился во время измерений в обычной консоле, а web api в iis express, и то и другое компилировалось под .net 4.6.2, как такое вообще может быть, что gRPC-Web получился медленнее??
ещё хочу добавить: для сериализации использовал protobuf-net.Grpc: неужели там такие проблемы?
Здравствуйте, takTak, Вы писали:
T>с целью интеграции сторонней старой дотнетовской dll решил написать сервер, который бы заворачивал вызов этой dll, так что из нового .net core приложения можно было бы по http или http/2 вызывать эту старую функциональность, хотелось сравнить старый web api с новым grpc, ну я выбрал gRPC-Web, ну так вот получилось, что вызов по gRPC-Web раза в два- три получается медленнее, чем asp.net web api; gRPC-server хостился во время измерений в обычной консоле, а web api в iis express, и то и другое компилировалось под .net 4.6.2, как такое вообще может быть, что gRPC-Web получился медленнее??
T>ещё хочу добавить: для сериализации использовал protobuf-net.Grpc: неужели там такие проблемы?
ничего не понятно. заверни поднятие сервера в [GlobalSetup]-метод, а вызов сервера в [Benchmark]-метод
S>MagicOnion allows primitive, multiple request value. Complex type is serialized by LZ4 Compressed MsgPack by MessagePack for C# so type should follow MessagePack for C# rules.
ну эта штука похожа в плане сериализации на protobuf-net.Grpc, просто по числу подписавшихся на проект выглядит поскромее, ты это использовал? сравнивал со скоростью через web api?
S>>MagicOnion allows primitive, multiple request value. Complex type is serialized by LZ4 Compressed MsgPack by MessagePack for C# so type should follow MessagePack for C# rules.
Здравствуйте, takTak, Вы писали:
T>да, сорри, я перепутал: т.е. я не gRPC-Web, а gRPC использовал, всё равно по сравнению с локальным вызовом как-то долго получается...
А ты хотел чтобы вызов через несколько процессов и через стек TCP/IP был сопоставим по скорости с локальным? Серьезно?
T>>да, сорри, я перепутал: т.е. я не gRPC-Web, а gRPC использовал, всё равно по сравнению с локальным вызовом как-то долго получается...
НС>А ты хотел чтобы вызов через несколько процессов и через стек TCP/IP был сопоставим по скорости с локальным? Серьезно?
что значит "несколько процессов" ? речь идёт о коммуникации без сетевого трафика между двумя процессами на одной и той же машине, прочём с использованием бинарной сериализации, у меня на боевой машине получается разница в 15 -40 раз, откуда такое берётся ?! ну раза в 2-3 ещё куда ни шло...
Здравствуйте, takTak, Вы писали:
T>>>да, сорри, я перепутал: т.е. я не gRPC-Web, а gRPC использовал, всё равно по сравнению с локальным вызовом как-то долго получается...
НС>>А ты хотел чтобы вызов через несколько процессов и через стек TCP/IP был сопоставим по скорости с локальным? Серьезно?
T>что значит "несколько процессов" ? речь идёт о коммуникации без сетевого трафика между двумя процессами на одной и той же машине, прочём с использованием бинарной сериализации, у меня на боевой машине получается разница в 15 -40 раз, откуда такое берётся ?! ну раза в 2-3 ещё куда ни шло...
Ну я так понял из кода, что SomeLegacyService вызывается из текущего процесса
public class SomeLegacyService: IService
{
public Result CalculateSomething(RequestDto request)
{
try
{
//Thread.Sleep(TimeSpan.FromMilliseconds(10));return FakeDataProvider.Instance.GetResult();
}
catch (Exception ex)
{
throw;
}
}
}
Здравствуйте, takTak, Вы писали:
T>>>ещё хочу добавить: для сериализации использовал protobuf-net.Grpc: неужели там такие проблемы?
V_G>>Может лучше таки просто gRPC, а не gRPC-Web?
T>да, сорри, я перепутал: т.е. я не gRPC-Web, а gRPC использовал, всё равно по сравнению с локальным вызовом как-то долго получается...
где ты взял это выражение "локальный вызов" Под локальным вызовом подразумевается вызов сервиса в другом процессе на том же сервере/ПК.
ты вместо "локальный вызов" пиши "in-process вызов", иначе тебя никто не поймёт
ну в примере же не стриминг (тогда бы и было постоянное соединение), и если заглянуть под капот, то клиентская сторона отправляет всё не по Tcp/Udp, а через обычный HttpClient, так что экономия -лишь на размере того, что через Http отправляется,
но всё равно я большего ожидал
через обычноe Web Api + http Client (json) получается разница с in-process где-то около 30 -40 раз, что тоже как-то imho сильно много
под конец gRpc вообще загнулся: то ли с firewall/microsoft defender и портами были какие-то проблемы, то ли админы опять с чем-то играются, так что localhost толком не разрешался, то ли gRpc с обычным .Net фреймворком не дружит, короче перестало работать, а причина- хз... короче, сыровато пока поделие
Здравствуйте, takTak, Вы писали:
T>что значит "несколько процессов" ?
Значит несколько процессов.
T> речь идёт о коммуникации без сетевого трафика между двумя процессами на одной и той же машине
Межпроцессное взаимодействие тоже не бесплатно. А уж если речь про полноценный сетевой стек, то и подавно.
T>, прочём с использованием бинарной сериализации, у меня на боевой машине получается разница в 15 -40 раз,
Это офигенно маленькая разница.
T> откуда такое берётся ?! ну раза в 2-3 ещё куда ни шло...
Ты реально не понимаешь в чем разница между одной инструкцией процессора и работой полноценного сетевого стека?
T>>что значит "несколько процессов" ?
НС>Значит несколько процессов.
два- это не несколько, два- это пара
T>> речь идёт о коммуникации без сетевого трафика между двумя процессами на одной и той же машине
НС>Межпроцессное взаимодействие тоже не бесплатно. А уж если речь про полноценный сетевой стек, то и подавно.
T>>, прочём с использованием бинарной сериализации, у меня на боевой машине получается разница в 15 -40 раз,
НС>Это офигенно маленькая разница.
это зависит от того, насколько быстро завершается in-process операция: если через час, то затраты на (де)сериализацию и отправку/получение может никто и не заметит
T>> откуда такое берётся ?! ну раза в 2-3 ещё куда ни шло...
НС>Ты реально не понимаешь в чем разница между одной инструкцией процессора и работой полноценного сетевого стека?
какая ещё одна инструкция? в одном случае идёт калькуляция результата, в другом же — просто завёртка и развертка полученного результата, это разные вещи
Здравствуйте, takTak, Вы писали:
НС>>Значит несколько процессов. T>два- это не несколько, два- это пара
Это все меняет.
НС>>Ты реально не понимаешь в чем разница между одной инструкцией процессора и работой полноценного сетевого стека? T>какая ещё одна инструкция?
А сколько, по твоему, надо инструкций для in-process call?
T> в одном случае идёт калькуляция результата, в другом же — просто завёртка и развертка полученного результата, это разные вещи
НС>>>Значит несколько процессов. T>>два- это не несколько, два- это пара
НС>Это все меняет.
это разные слова и сложность, отличающаяся во столько раз, во сколько раз "несколько" больше "двух": как минимум, это разы
НС>>>Ты реально не понимаешь в чем разница между одной инструкцией процессора и работой полноценного сетевого стека? T>>какая ещё одна инструкция?
НС>А сколько, по твоему, надо инструкций для in-process call?
я не говорил про какой-то там один call, я говорил о результате вычислительной операции, которая может состоять из миллиардов инструкций
T>> в одном случае идёт калькуляция результата, в другом же — просто завёртка и развертка полученного результата, это разные вещи
НС>Не распарсил.
T>это зависит от того, насколько быстро завершается in-process операция: если через час, то затраты на (де)сериализацию и отправку/получение может никто и не заметит
В межпроцессном взаимодействии кучу времени съедает передача данных между процессами, которая может быть в сотни раз больше чем затраты на сериализацию десериализацию и сжатие данных.
Это в Com проходили с внутренним сервером автоматизации (dll) и внешним (exe)
и солнце б утром не вставало, когда бы не было меня
T>>ну в примере же не стриминг (тогда бы и было постоянное соединение), и если заглянуть под капот, то клиентская сторона отправляет всё не по Tcp/Udp, а через обычный HttpClient, так что экономия -лишь на размере того, что через Http отправляется,
S> В примере как раз стриминг
тоже про свой пример говорил
просто проблемы начинаются тогда, когда надо прикручивать client factory, retry policy, timeout & error handling, server sessions, instancing, and concurrency: там где нестандартно, а это почти везде, где не http, поджидают самые разные пакости
T>>>ну в примере же не стриминг (тогда бы и было постоянное соединение), и если заглянуть под капот, то клиентская сторона отправляет всё не по Tcp/Udp, а через обычный HttpClient, так что экономия -лишь на размере того, что через Http отправляется,
S>> В примере как раз стриминг
T>тоже про свой пример говорил
T>просто проблемы начинаются тогда, когда надо прикручивать client factory, retry policy, timeout & error handling, server sessions, instancing, and concurrency: там где нестандартно, а это почти везде, где не http, поджидают самые разные пакости
Ну внутри того же HTTP/2 постоянное соединение плюс
Протокол HTTP/2 является бинарным[13][14]. По сравнению с предыдущим стандартом изменены способы разбиения данных на фрагменты и транспортирования их между сервером и клиентом.
В HTTP/2 сервер имеет право послать то содержимое, которое ещё не было запрошено клиентом. Это позволит серверу сразу выслать дополнительные файлы, которые потребуются браузеру для отображения страниц, без необходимости анализа браузером основной страницы и запрашивания необходимых дополнений.
Также часть улучшений получена (в первом черновике HTTP/2, который представлял собой копию спецификации SPDY) за счёт мультиплексирования запросов и ответов (для преодоления проблемы «head-of-line blocking» протоколов HTTP/1.x), а также за счёт сжатия передаваемых заголовков и введения явной приоритизации запросов.
Тот же Web Api тоже можно гонять через HTTP/2
и солнце б утром не вставало, когда бы не было меня
S> Ну внутри того же HTTP/2 постоянное соединение плюс S>
S>Протокол HTTP/2 является бинарным[13][14]. По сравнению с предыдущим стандартом изменены способы разбиения данных на фрагменты и транспортирования их между сервером и клиентом.
S>В HTTP/2 сервер имеет право послать то содержимое, которое ещё не было запрошено клиентом. Это позволит серверу сразу выслать дополнительные файлы, которые потребуются браузеру для отображения страниц, без необходимости анализа браузером основной страницы и запрашивания необходимых дополнений.
S>Также часть улучшений получена (в первом черновике HTTP/2, который представлял собой копию спецификации SPDY) за счёт мультиплексирования запросов и ответов (для преодоления проблемы «head-of-line blocking» протоколов HTTP/1.x), а также за счёт сжатия передаваемых заголовков и введения явной приоритизации запросов.
S> Тот же Web Api тоже можно гонять через HTTP/2
насколько я понял, это не для всего подходит: для стриминга хорошо подходит, наверное, если же надо время от времени просто выдёргивать какие-то данные, то могут возникать проблемы, во всяком случае, год назад народ ещё жаловался
с тем же хостингом — проблемы: если я хочу gRpc в обычном .NET захостить , то надо ведь своими ручками windows service писать, или?
Здравствуйте, takTak, Вы писали:
НС>>>>Значит несколько процессов. T>>>два- это не несколько, два- это пара НС>>Это все меняет. T>это разные слова и сложность, отличающаяся во столько раз, во сколько раз "несколько" больше "двух": как минимум, это разы
Не распарсил.
НС>>А сколько, по твоему, надо инструкций для in-process call? T>я не говорил про какой-то там один call,
Ты вообще ничего конкретно не говорил.
T> я говорил о результате вычислительной операции, которая может состоять из миллиардов инструкций
А может и не состоять, да? Замерь потери на вызов, тогда можно будет что то обсуждать. Иначе разговор ни о чем.
T>>> в одном случае идёт калькуляция результата, в другом же — просто завёртка и развертка полученного результата, это разные вещи НС>>Не распарсил. T>не благодари
Здравствуйте, takTak, Вы писали:
S>> Тот же Web Api тоже можно гонять через HTTP/2
T>насколько я понял, это не для всего подходит: для стриминга хорошо подходит, наверное, если же надо время от времени просто выдёргивать какие-то данные, то могут возникать проблемы, во всяком случае, год назад народ ещё жаловался