У нас возникают проблемы со скоростью при использовании Azure Service Bus Relay с netTcpRelayBinding
и basicHttpRelayBinding
. При небольших размерах сообщений (10 КБ) реле работает с низкой задержкой (100 мс), но по мере увеличения размера сообщения (100 КБ) мы наблюдаем кажущееся случайное время отклика (600 мс-1000 мс). Мы хотели бы улучшить стоимость задержки для больших сообщений.
Использует сжатие сообщения (gzip, protobuf-net и т.д.), поддерживаемых через реле служебной шины? Кто-нибудь имел успех с включением как сжатия запроса/ответа через реле? тривиально поддерживать сжатие ответов через IIS, но мы хотели бы поддержать сжатие запросов для улучшения наших латентных затрат. Поскольку мы не можем профилировать реле с помощью Fiddler, как мы знаем, что сообщение все еще сжато, когда оно проходит через реле?
Интересным моментом, который мы обнаружили, является то, что введение задержки между последующими сообщениями (2 с) мы получаем более высокую производительность (100 КБ - 200 мс). Может ли быть, что большие сообщения автоматически затухают? Было бы неплохо узнать об уменьшении размера сообщения, которое вызывает условие дросселирования.
Для нашего теста - мы просто отправляем случайную строку сообщения в сервисное реле и эхо возвращаем строку запроса с сервера. Мы пробовали этот клиент/сервер из нескольких географических местоположений (чтобы исключить проблемы с файерволом/веб-фильтром) и испытывали такое же латентное поведение.
Сторона сервера
public class ServiceRelayProfiler : IServiceRelayProfiler
{
public string HelloProfiler(string name)
{
return string.Format("Hello {0}", name);
}
}
Сторона клиента
ChannelFactory<IServiceRelayProfiler> channelFactory = new ChannelFactory<IServiceRelayProfiler>("helloProfilerTcp");
IServiceRelayProfiler channel = channelFactory.CreateChannel();
string message = RandomString(100000); // 100K
for (int i = 0; i < 100; i++)
{
DateTime start = DateTime.Now;
string response = channel.HelloProfiler(message);
DateTime end = DateTime.Now;
TimeSpan duration = end - start;
Console.WriteLine("Response is: {0} at {1}\tDuration: {2}ms", response.Substring(0, 20) + "....", end, duration.Milliseconds);
//Thread.Sleep(2000); // delay makes response times more consistent
}