【问题标题】:ASP.NET Core Distributed Redis Cache: DisconnectASP.NET Core 分布式 Redis 缓存:断开连接
【发布时间】:2021-07-01 07:13:11
【问题描述】:

我在 ASP.NET 应用程序中使用 Redis 缓存作为分布式缓存。 它一直有效,直到 Redis 服务器变得不可用,问题是: 如何正确处理断线问题?

Redis 是这样配置的(Startup.cs):

services.AddDistributedRedisCache(...)

选项 AbortOnConnectFail 设置为 false

通过构造函数注入服务:

...
private IDistributedCache _cache

public MyService(IDistributedCache cache)
{
  _cache = cache;
}

当 Redis 关闭时,以下代码会引发异常(StackExchange.Redis.RedisConnectionException: SocketFailure on 127.0.0.1:6379/Subscription ...):

var val = await _cache.GetAsync(key, cancellationToken);

我不认为使用反射来检查 _cache 对象内的连接状态是一个好方法。那么是否有任何“正确”的选择来处理它?

【问题讨论】:

    标签: c# asp.net-core redis stackexchange.redis


    【解决方案1】:

    也许您可以查看Polly Project。它有 Retry/WaitAndRetry/RetryForever 和可以方便的断路器。所以你可以捕捉到RedisConnectionException 然后重试或回退到其他方法。

    您有 Microsoft DistributedCache Provider 插件。

    检查一下。

    【讨论】:

    • 谢谢,但实际上我想过尝试/捕获解决方案,但我希望有一些更优雅的方式。
    • Polly 很健壮,看起来是解决连接失败的一种优雅方法。并且你可以在连接失败后等待并重试,这是一件好事,或者你可以回退到特定的操作。
    【解决方案2】:

    首先,为什么您的 Redis 服务器不可用?并且持续多久?您应该尽量减少此类情况。您是否将 Redis 用作 AWS 的服务,即 ElasticCache?如果是这样,您可以将其配置为在第一个主服务器失败时将一个新的 Redis 从 /read-replice 服务器升级为主服务器。

    为提高容错能力并减少写入停机时间,请为您的 Redis(集群模式)启用具有自动故障转移功能的多可用区 已禁用)具有副本的集群。有关详细信息,请参阅最小化 ElastiCache for Redis 与多可用区的停机时间。

    https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/AutoFailover.html

    除此之外,对于无响应的 Redis 服务器的后备解决方案将只是在 Redis 服务器关闭时从数据库中检索您在 Redis 中缓存的对象/实体。您可以重试 Redis 调用两次,每次重试之间间隔 5 秒,如果服务器仍然关闭,您应该只查询数据库。这会导致性能下降,但它是比引发错误更好的解决方案。

    T val = null;
    int retryCount = 0;
    
    do 
    {
          try 
          {
              val = await _cache.GetAsync(key, cancellationToken);
          }
          catch(Exception ex) 
          {  
             retryCount++;
             Thread.Sleep(retryCount * 2000)
          }
     }
     while(retryCount < 3 && val == null);
     
     if (val == null) 
     {
        var = call to database
     }
    

    【讨论】:

    • redis 不可用的原因并不重要,关键是当它关闭时,应用程序本身应该运行,尽管性能不足。
    • 好吧,你必须解决:要么在 Redis 服务器关闭时从数据库中查询缓存的对象/数据,要么尝试实现类似于 ElasticCache AWS 服务中的故障转移功能,即读取数据如果主服务器关闭,则从只读副本中获取。
    猜你喜欢
    • 2020-03-24
    • 2017-07-01
    • 2017-09-28
    • 2019-02-02
    • 2017-03-15
    • 1970-01-01
    • 2020-01-06
    • 2014-10-26
    • 2018-11-23
    相关资源
    最近更新 更多