Утечка памяти / потребление в концентраторах из-за больших сообщений? - PullRequest
0 голосов
/ 02 марта 2020

В настоящее время я пытаюсь использовать SignalR и RabbitMQ для циклического перебора / балансировки нагрузки json запросов веб-службы, и у меня возникают проблемы с использованием памяти одним из приложений, когда оно обрабатывает большие объемы (~ 300 - 2500 кб ) Сообщения.

У меня есть сервер IIS, на котором размещено веб-приложение (с именем «Backend»), которому необходимо запросить другое веб-приложение (имя «Pricing»), также размещенное на сервере IIS. Чтобы поддерживать соединение с моим сервером RabbitMQ, я разработал консольное приложение, которое подключено к Backend и Princing с помощью SignalR.

Поэтому, когда Backend необходимо запросить Princing, он просит свою консоль опубликовать sh сообщение в очереди и консоль, подключенная к Pricing, принимает сообщение и передает его Pricing (с помощью метода Invoke <>). Когда Pricing завершил свою работу, он просит консоль опубликовать sh ответное сообщение, а консоль, подключенная к Backend, принимает его и передает Backend.

Подводя итог: [Backend] -> [Console] -> [RabbitMQ] <- [Console] <- [Pricing] </p>

И у меня есть 2 Pricing, получающие сообщения из их консоли от очередь RabbitMQ.

Эта установка заменяет традиционный запрос веб-службы между двумя IIS и использует преимущества RabbitMQ (балансировщик нагрузки и асинхронный вызов в архитектуре микро / веб-служб)

Я добавил

  GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;

в Startup.cs в обоих IIS, чтобы принимать большие сообщения.

Когда я смотрю на потребление памяти Ценообразованием в Windows Диспетчере задач, он быстро растет от 500 МБ до 1500 МБ (через 5 минут, работая с бесконечными запросами от Backend для проверки настроек).

Я попробовал что-то еще, записав содержимое запросов в файлы в общей папке и просто опубликовав имя файла в сообщениях RabbitMQ и использование памяти Pricing (с изменением кода для загрузки файла) не перемещается и остается около 500 МБ.

Это связано с длиной сообщения, которое моя консоль передает в IIS.

Я пытался отключить консоль от концентраторов IIS, потому что думал, что она, возможно, освободит память, но нет.

Кто-нибудь сталкивался с проблемой потребления памяти большими сообщениями в хабах? Как я могу проверить, действительно ли в моем приложении есть утечка памяти?

Как насчет использования SignalR и RabbitMQ в среде веб / микро сервисов? Любой отзыв?

Большое спасибо,

Жан-Франсуа

.NETFramework : 4.5
Microsoft.AspNet.SignalR : 2.4.1

1 Ответ

0 голосов
/ 03 марта 2020

Таким образом, похоже, что версия SignalR, которую я использую (.NetFramework), позволяет настраивать количество сообщений на концентратор на соединение, сохраняемое в памяти. Я установил его в произвольном 50 в Startup.cs

GlobalHost.Configuration.DefaultMessageBufferSize = 50;

Его значение по умолчанию равно 1000, что означает (если я это ясно понял), что IIS хранит в памяти циклический буфер из 1000 сообщений. Некоторые из сообщений весили 2,5Mo, что означало, что используемая память могла go до 2500Mo на соединение.

Поскольку мой IIS имеет только одно соединение (консоль) и ему не нужно отслеживать сообщения (поскольку он работает как веб-сервис), кажется, что 1000 сообщений - это слишком много.

При ограничении в 50 сообщений память, используемая приложением в Windows Task Manager, остается на месте (около 500Mo).

Есть ли какой-то недостаток в том, как я его использую?

Спасибо!

...