Stackexchange.redis: Exceção do tipo 'System.OutOfMemoryException' foi lançada. em StackExchange.Redis.ConnectionMultiplexer.add_ConnectionRestored

Criado em 1 ago. 2019  ·  3Comentários  ·  Fonte: StackExchange/StackExchange.Redis

Olá

Eu tenho um erro "OutOfMemoryException" usando .NET CORE 2.2.

A descrição completa do erro é:

System.OutOfMemoryException:
em System.MulticastDelegate.CombineImpl (System.Private.CoreLib, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = 7cec85d7bea7798e)
em StackExchange.Redis.ConnectionMultiplexer.add_ConnectionRestored (StackExchange.Redis, Versão = 2.0.0.0, Cultura = neutra, PublicKeyToken = c219ff1ca8c2ce46)
em V1.Sdk.Infra.Repository.RedisRepository.RegisterEvent (V1.Sdk.Infra, Versão = 1.0.0.0, Cultura = neutra, PublicKeyToken = nulo)
em V1.Sdk.Infra.Repository.RedisRepository.get_ConnectionMultiplexer (V1.Sdk.Infra, Versão = 1.0.0.0, Cultura = neutro, PublicKeyToken = nulo)
em V1.Sdk.Infra.Repository.RedisRepository.GetDatabase (V1.Sdk.Infra, Versão = 1.0.0.0, Cultura = neutra, PublicKeyToken = nulo)
em Vix.V1.Application.Services.Motorista.MotoristaService +d__17.MoveNext (Vix.V1.Application, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = nullVix.V1.Application, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null: d: \ a \ 1 \ s \ Vix.V1.Application \ Services \ Driver \ DriverService.ObterLogado.csVix.V1.Application, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null: 31)
em System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = 7cec85d7bea7798e)
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = 7cec85d7bea7798e)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = 7cec85d7bea7798e)
em Vix.V1.Application.Services.Location.LocationService +d__2.MoveNext (Vix.V1.Application, Version = 1.0.0.0, Culture = neutro, PublicKeyToken = nullVix.V1.Application, Version = 1.0.0.0, Culture = neutro, PublicKeyToken = null: d: \ a \ 1 \ s \ Vix.V1.Application \ Services \ Location \ LocationService.UpdatePosition.csVix.V1.Application, Version = 1.0.0.0, Culture = neutro, PublicKeyToken = null: 27)

A classe que você usa para acessar o redis é:

public class RedisRepository
    {
        private static readonly object Locker = new object ();
        private static IConnectionMultiplexer _connMultiplexer;

        private static IConnectionMultiplexer ConnectionMultiplexer
        {
            get
            {
                if (_connMultiplexer == null ||! _connMultiplexer.IsConnected)
                {
                    lock (Locker)
                    {
                        if (_connMultiplexer == null ||! _connMultiplexer.IsConnected)
                        {
                            _connMultiplexer = Connection;
                        }
                    }
                }

                RegisterEvent ();

                return _connMultiplexer;
            }
        }

        private static readonly Lazy <ConnectionMultiplexer> LazyConnection = new Lazy <ConnectionMultiplexer> (() =>
        {
            var connection = StackExchange.Redis.ConnectionMultiplexer.Connect (AppContextSdk.Configuration.GetConnectionString ("RedisConnection"));

            return connection;
        });

        private static ConnectionMultiplexer Connection => LazyConnection.Value;

        public static IDatabase GetDatabase ()
        {
            return ConnectionMultiplexer.GetDatabase (0);
        }

        private static void RegisterEvent ()
        {
            _connMultiplexer.ConnectionRestored + = ConnMultiplexer_ConnectionRestored;
            _connMultiplexer.ConnectionFailed + = ConnMultiplexer_ConnectionFailed;
            _connMultiplexer.ErrorMessage + = ConnMultiplexer_ErrorMessage;
            _connMultiplexer.InternalError + = ConnMultiplexer_InternalError;
        }

        private static void ConnMultiplexer_ConnectionRestored (object sender, ConnectionFailedEventArgs and)
        {

        }

        private static void ConnMultiplexer_ConnectionFailed (object sender, ConnectionFailedEventArgs and)
        {

        }

        private static void ConnMultiplexer_ErrorMessage (object sender, RedisErrorEventArgs e)
        {
        }

        private static void ConnMultiplexer_InternalError (object sender, InternalErrorEventArgs e)
        {
        }
    }

O Redis usado é o Cache Redis Premium de 6 GB do Azure.

Alguma idéia do que pode ser ou o que você deve fazer para resolvê-lo? Até lá a solução é reiniciar o App Service

Comentários muito úteis

ConnectionMultiplexer é thread-safe e não requer um cadeado,
` Instância de ConnectionMultiplexer estática pública
{
pegue
{
return conn.Value;
}
}

    private static Lazy<ConnectionMultiplexer> conn = new Lazy<ConnectionMultiplexer>(
    () =>
    {
        _instance = ConnectionMultiplexer.Connect(RedisPath);
        //adds additional event registrations
        _instance.ConnectionFailed += MuxerConnectionFailed;
        _instance.ConnectionRestored += MuxerConnectionRestored;
        _instance.ErrorMessage += MuxerErrorMessage;
        _instance.HashSlotMoved += MuxerHashSlotMoved;
        _instance.InternalError += MuxerInternalError;
        return _instance;
    }
    );`

e você pode tentar usar minha ferramenta empacotada para pesquisar 'Banana.Utility' no nuget.

Todos 3 comentários

O problema é sua propriedade ConnectionMultiplexer . Cada vez que é acessado, ele adiciona registros de eventos adicionais . Eventualmente, isso vai explodir. Antes disso, é apenas uma péssima ideia. Então... não faça isso?

Perfeito! Foi exatamente neste ponto!
Obrigada!

ConnectionMultiplexer é thread-safe e não requer um cadeado,
` Instância de ConnectionMultiplexer estática pública
{
pegue
{
return conn.Value;
}
}

    private static Lazy<ConnectionMultiplexer> conn = new Lazy<ConnectionMultiplexer>(
    () =>
    {
        _instance = ConnectionMultiplexer.Connect(RedisPath);
        //adds additional event registrations
        _instance.ConnectionFailed += MuxerConnectionFailed;
        _instance.ConnectionRestored += MuxerConnectionRestored;
        _instance.ErrorMessage += MuxerErrorMessage;
        _instance.HashSlotMoved += MuxerHashSlotMoved;
        _instance.InternalError += MuxerInternalError;
        return _instance;
    }
    );`

e você pode tentar usar minha ferramenta empacotada para pesquisar 'Banana.Utility' no nuget.

Esta página foi útil?
0 / 5 - 0 avaliações