Тысячи исключений TaskCanceledException

#asp.net #azure #exception #redis #stackexchange.redis

#asp.net #azure #исключение #redis #stackexchange.redis

Вопрос:

В течение ~ 24 часов мы получили тысячи ошибок на одном конкретном сервере при всех загрузках страниц. Ошибки принимают вид:

 Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 4/20/2019 1:43:47 PM 
Event time (UTC): 4/20/2019 1:43:47 PM 
Event sequence: 554231 
Event occurrence: 12592 
Event detail code: 0 

Process information: 
    Process ID: 6888 
    Process name: w3wp.exe 
    Account name: IIS APPPOOLDefaultAppPool 

Exception information: 
    Exception type: TaskCanceledException 
    Exception message: A task was canceled.
   at StackExchange.Redis.ConnectionMultiplexer.Wait(Task task) in C:projectsstackexchange-redissrcStackExchange.RedisConnectionMultiplexer.cs:line 543
   at StackExchange.Redis.RedisSubscriber.StackExchange.Redis.ISubscriber.Subscribe(RedisChannel channel, Action`2 handler, CommandFlags flags) in C:projectsstackexchange-redissrcStackExchange.RedisRedisSubscriber.cs:line 471
   at C3.Code.Controls.Application.Caching.Redis.PubSub.PubSubController.SubscribeToCacheKey(RedisChannel cacheKey, Action`2 onMessageReceived) in C:Construct.netSourceC3Alpha2CodeControlsApplicationCachingRedisPubSubPubSubController.cs:line 45
   at C3.Code.Controls.Application.Caching.Manager.Manager.Callbacks.OnGotten[T](String cacheKey, CacheType fromType, T objectGot) in C:Construct.netSourceC3Alpha2CodeControlsApplicationCachingManagerCallbacks.cs:line 99
   at C3.Code.Controls.Application.Caching.Manager.Manager.Get[T](String key, Func`1 getFromExternFunction, Boolean skipLocalCaches) in C:Construct.netSourceC3Alpha2CodeControlsApplicationCachingManagerManager.cs:line 131
   at C3.PageControls.Forums.TopicRender.Page_Load(Object sender, EventArgs e) in C:Construct.netSourceC3Alpha2PageControlsForumsTopicRender.ascx.cs:line 42
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

     Thread information: 
    Thread ID: 448 
    Thread account name: IIS APPPOOLDefaultAppPool 
    Is impersonating: False 
    Stack trace:    at StackExchange.Redis.ConnectionMultiplexer.Wait(Task task) in C:projectsstackexchange-redissrcStackExchange.RedisConnectionMultiplexer.cs:line 543
   at StackExchange.Redis.RedisSubscriber.StackExchange.Redis.ISubscriber.Subscribe(RedisChannel channel, Action`2 handler, CommandFlags flags) in C:projectsstackexchange-redissrcStackExchange.RedisRedisSubscriber.cs:line 471
   at C3.Code.Controls.Application.Caching.Redis.PubSub.PubSubController.SubscribeToCacheKey(RedisChannel cacheKey, Action`2 onMessageReceived) in C:Construct.netSourceC3Alpha2CodeControlsApplicationCachingRedisPubSubPubSubController.cs:line 45
   at C3.Code.Controls.Application.Caching.Manager.Manager.Callbacks.OnGotten[T](String cacheKey, CacheType fromType, T objectGot) in C:Construct.netSourceC3Alpha2CodeControlsApplicationCachingManagerCallbacks.cs:line 99
   at C3.Code.Controls.Application.Caching.Manager.Manager.Get[T](String key, Func`1 getFromExternFunction, Boolean skipLocalCaches) in C:Construct.netSourceC3Alpha2CodeControlsApplicationCachingManagerManager.cs:line 131
   at C3.PageControls.Forums.TopicRender.Page_Load(Object sender, EventArgs e) in C:Construct.netSourceC3Alpha2PageControlsForumsTopicRender.ascx.cs:line 42
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  

Впоследствии исключения, по-видимому, устранялись сами по себе. Я теряюсь в том, что может быть причиной этих ошибок. Кто-нибудь знает причину?

Все наши пакеты nuget обновлены, как и наши веб-серверы.

Ответ №1:

Вы подписаны или используете Azure Cache для Redis на базовом, стандартном или премиальном уровне ценообразования (Сравнение уровня обслуживания)? Я полагаю, что вы столкнулись с прерыванием службы кэша. Премиум-уровень предлагает кластеризацию Redis, которая уменьшит любые перерывы в обслуживании. Стандартный уровень предлагает репликацию для аварийного восстановления, но любые перебои в обслуживании должны быть устранены с помощью retry механизма в вашем приложении. Базовый уровень предлагает только один узел и не имеет возможностей репликации или кластеризации.

Кроме того, пожалуйста, убедитесь, что вы реализуете HomeController класс с помощью аналогичного метода, согласно этому руководству.

 public ActionResult RedisCache()
{
    ViewBag.Message = "A simple example with Azure Cache for Redis on ASP.NET.";

    var lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
    {
        string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"].ToString();
        return ConnectionMultiplexer.Connect(cacheConnection);
    });

    // Connection refers to a property that returns a ConnectionMultiplexer
    // as shown in the previous example.
    IDatabase cache = lazyConnection.Value.GetDatabase();

    // Perform cache operations using the cache object...

    // Simple PING command
    ViewBag.command1 = "PING";
    ViewBag.command1Result = cache.Execute(ViewBag.command1).ToString();

    // Simple get and put of integral data types into the cache
    ViewBag.command2 = "GET Message";
    ViewBag.command2Result = cache.StringGet("Message").ToString();

    ViewBag.command3 = "SET Message "Hello! The cache is working from ASP.NET!"";
    ViewBag.command3Result = cache.StringSet("Message", "Hello! The cache is working from ASP.NET!").ToString();

    // Demonstrate "SET Message" executed as expected...
    ViewBag.command4 = "GET Message";
    ViewBag.command4Result = cache.StringGet("Message").ToString();

    // Get the client list, useful to see if connection list is growing...
    ViewBag.command5 = "CLIENT LIST";
    ViewBag.command5Result = cache.Execute("CLIENT", "LIST").ToString().Replace(" id=", "rid=");

    lazyConnection.Value.Dispose();

    return View();
}
  

И вызываете правильное полное доменное имя для кэша, так как это важно, если вы подписаны на премиум-уровень, но указали только на один экземпляр в кластере.

Если вы исследуете эту проблему и обнаружите, что наблюдаете проблемы с таймаутом или несколькими отключениями, в следующем документе есть некоторые рекомендации по этой конкретной проблеме.