Проблемы с утечкой памяти в приложении SignalR / .NET 6

После размещения приложения на IIS или AKS linux pod, когда мы устанавливаем соединение с определенным хабом SignalR, мы замечаем, что его память автоматически увеличивается после выполнения той же операции, например, при обращении к списку пользователей. Если мы выполняем одну и ту же операцию несколько раз, то каждый раз видим увеличение памяти. После установки соединения с сигнальными хабами мы также используем Rebus для оставшейся связи.

private static BuiltinHandlerActivator _adapter = new BuiltinHandlerActivator();

private readonly ILog _logger = LogManager.GetLogger(typeof(RebusWeb<THub>));

public RebusWeb(IHubContext<THub> hub)
{
    try
    {
        var configuration = new ConfigurationBuilder().AddJsonFile($"appsettings.json");
        var config = configuration.Build();
        RebusConfigSettings.AppSettingsConfigure(config);
        _adapter.Register(() => new HubHandler<THub>(hub));
        var configurer = Configure.With(_adapter)
                 .Options(o =>
                 {
                     o.SetNumberOfWorkers(RebusConfigSettings.Workers);
                     o.RetryStrategy(maxDeliveryAttempts: RebusConfigSettings.RetryAttempts);
                 })
                .Logging(l => l.Log4Net())
                .Serialization(s => s.UseNewtonsoftJson(JsonInteroperabilityMode.PureJson))
                 .Routing(r =>
                 {
                     var routing = r.TypeBased();
                     var routers = config.GetSection("AppRouting").Get<List<AppRouting>>();
                     //routers.ForEach(sub => routing.Map(sub.Message.GetType(), sub.Endpoint));

                     foreach (var router in routers)
                     {
                         if (router.Message.Contains(","))
                         {
                             var message = Type.GetType(router.Message);
                             routing.Map(message, router.Endpoint);
                         }
                         else
                         {
                             var assembly = Assembly.Load(router.Message);
                             var types = assembly.GetTypes();

                             foreach (var type in types)
                             {
                                 if (type.IsSubclassOf(typeof(MessageModel)))
                                 {
                                     routing.Map(type, router.Endpoint);
                                 }
                             }
                         }
                     }
                 })
                 .Events(x =>
                 {
                     x.BeforeMessageSent += (bus, headers, message, context) =>
                     {
                         if (RebusConfigSettings.TimeToBeReceived != "-1")
                         {
                             headers.Add(Headers.TimeToBeReceived, RebusConfigSettings.TimeToBeReceived);
                             headers.Add(Headers.Express, "rebus-express");
                         }
                     };
                 });

        string azureServiceBusUrl = EnvironmentVariablesManager.GetEnvironmentVariable("AzureServiceBusUrl");
        if (!string.IsNullOrWhiteSpace(azureServiceBusUrl))
        {
            var enableCompression = EnvironmentVariablesManager.GetEnvironmentVariable("EnableMessageCompression");
            if (!string.IsNullOrEmpty(enableCompression) && string.Compare(enableCompression, "true", StringComparison.OrdinalIgnoreCase) == 0)
                configurer = configurer.Options(o => o.EnableCompression(RebusConfigSettings.MessageCompressionSize));
            configurer.Transport(t => t.UseAzureServiceBus(azureServiceBusUrl, RebusConfigSettings.InputQueue).AutomaticallyRenewPeekLock()).Start();
        }
    }
    catch (Exception ex)
    {
        _logger.Error(ex);
    }
Митофан
Вопрос задан23 мая 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.