#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();
}
И вызываете правильное полное доменное имя для кэша, так как это важно, если вы подписаны на премиум-уровень, но указали только на один экземпляр в кластере.
Если вы исследуете эту проблему и обнаружите, что наблюдаете проблемы с таймаутом или несколькими отключениями, в следующем документе есть некоторые рекомендации по этой конкретной проблеме.