stackexchange.redis

StackExchange.Redis timeout y "No hay conexión disponible para el servicio de esta operación"



(0)

Tengo los siguientes problemas en nuestro entorno de producción (Web-Farm - 4 nodos, además de equilibrador de carga):

1) Timeout performing HGET key, inst: 3, queue: 29, qu=0, qs=29, qc=0, wr=0/0 at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor``1 processor, ServerEndPoint server) in ConnectionMultiplexer.cs:line 1699 Esto sucede 3-10 veces en un minuto

2) No connection is available to service this operation: HGET key at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor``1 processor, ServerEndPoint server) in ConnectionMultiplexer.cs:line 1666

Intenté implementar lo que Marc sugirió (tal vez lo interpreté incorrectamente): es mejor tener menos conexiones a Redis que a múltiples. Hice la siguiente implementación:

public class SeRedisConnection { private static ConnectionMultiplexer _redis; private static readonly object SyncLock = new object(); public static IDatabase GetDatabase() { if (_redis == null || !_redis.IsConnected || !_redis.GetDatabase().IsConnected(default(RedisKey))) { lock (SyncLock) { try { var configurationOptions = new ConfigurationOptions { AbortOnConnectFail = false }; configurationOptions.EndPoints.Add(new DnsEndPoint(ConfigurationHelper.CacheServerHost, ConfigurationHelper.CacheServerHostPort)); _redis = ConnectionMultiplexer.Connect(configurationOptions); } catch (Exception ex) { IoC.Container.Resolve<IErrorLog>().Error(ex); return null; } } } return _redis.GetDatabase(); } public static void Dispose() { _redis.Dispose(); } }

En realidad, no se está utilizando ahora mismo. También tengo algunos detalles de la implementación que podrían causar dicho comportamiento (solo uso hashes): 1. Agregar, eliminar hashes - async 2. Get -sync

¿Podría alguien ayudarme a evitar este comportamiento?

¡Muchas gracias por adelantado!

SOLUCIONADO: Aumento del tiempo de espera de la conexión del cliente después de evaluar las capacidades de la red.

ACTUALIZACIÓN 2 : En realidad no resolvió el problema. Cuando el volumen de la memoria caché comienza a aumentar, por ejemplo, desde 2 GB. Luego vi el mismo patrón en realidad, estos tiempos de espera se produjeron aproximadamente cada 5 minutos. Y nuestros sitios se congelaron por un período de tiempo cada 5 minutos hasta que se completó la operación de la horquilla. Luego descubrí que hay una opción para hacer un fork (guardar en disco) cada x segundos:

save 900 1 save 300 10 save 60 10000

En mi caso, fue "guardar 300 10": guardar cada 5 minutos si ocurrieron al menos 10 actualizaciones. También me enteré de que "tenedor" podría ser muy caro. La sección "guardar" comentada resolvió el problema en absoluto. Podemos comentar la sección "guardar" ya que estamos usando solo Redis como "caché en la memoria", no necesitamos ninguna persistencia. Aquí está la configuración de nuestros servidores de caché "Redis 2.4.6" puerto de Windows: https://github.com/rgl/redis/downloads

Tal vez se haya resuelto en las versiones recientes de Redis Windows Port en MSOpentech: http://msopentech.com/blog/2013/04/22/redis-on-windows-stable-and-reliable/ pero todavía no he probado .

De todos modos StackExchange.Redis no tiene nada que ver con este problema y funciona bastante estable en nuestro entorno de producción, gracias a Marc Gravell.

ACTUALIZACIÓN FINAL: Redis es una solución de un solo subproceso: en última instancia, es rápida, pero cuando se trata de liberar la memoria (eliminar elementos obsoletos o caducados), los problemas surgen debido a que un subproceso debe recuperar la memoria (es decir, operación rápida (sea cual sea el algoritmo que se use) y el mismo hilo debe manejar las operaciones GET, SET. Por supuesto, esto sucede cuando estamos hablando de un entorno de producción de carga media. Incluso si utiliza un clúster con esclavos cuando se alcanza la barrera de la memoria, tendrá el mismo comportamiento.