Отсутствует поведение роли кеша в Windows Azure Caching 2.1 в эмуляторе вычислений
Я работаю над размещенной службой, в которой кэш Windows Azure развернут на экземплярах веб-роли. Кеш включен в работе, но в эмуляторе вычислений мы отключаем его, поскольку мы часто испытываем замедления и исключения с помощью эмулятора кеша. В частности, в эмуляторе вычислений мы не загружаем модуль кэширования в csdef
и во время выполнения мы определяем, включен ли кэш, создавая DataCacheFactory
и перехватывает конкретное исключение, которое выдается, когда роль, указанная в конфигурации клиентской библиотеки, не найдена в csdef
,
Это работало корректно до Windows Azure Caching 2.0 - при обновлении до Windows Azure Caching 2.1 (и Azure SDK 2.1) поведение изменилось:
- у нас нет исключения на
DataCacheFactory
конструктор; когда мы пытаемся создать экземпляр
DataCache
отDataCacheFactory
похоже, что роль зависает и через 3 минуты возвращается со следующим исключением (полный текст можно найти здесь):Microsoft.ApplicationServer.Caching.DataCacheException was unhandled by user code Message=ErrorCode<ERRCA0017>:SubStatus<ES0006>:There is a temporary failure. Please retry later. (<snip>). Additional Information : The client was trying to communicate with the server: net.tcp://WebRole:24233. InnerException: System.Net.Sockets.SocketException Message=No such host is known
Пожалуйста, обратите внимание, что это не дубликат следующих SO вопросов:
- Не могу заставить Azure Cache работать. "Это временный сбой. Пожалуйста, попробуйте позже.
- Исключение при использовании кэширования Windows Azure: такой хост не известен
- Azure Caching - ошибка после обновления до SDK 2.1 и кэширования 2.1
поскольку
- Я уверен, что я использую Azure SDK 2.1 (я проверял в отладке, что версии библиотеки были правильными);
- моя проблема возникает только когда я намеренно отключаю роль кэша.
1 ответ
Using the procedure described in the following SO answer and with the help of ILSpy I've been able to understand why this exception occurs: in Windows Azure Caching 2.1 when the role specified in the client configuration is not found it is considered an address and execution continues, while in older versions it throws an exception (which I caught to understand cache was not enabled).
The relevant log messages are:
WaWorkerHost.exe Information: 0 : INFORMATION:
<DistributedCache.CacheFactory.1> TryAutoDiscoverServersWithinDeployment
for Instance 'WebRole' failed to connect as RoleName type with exception
System.Reflection.TargetInvocationException: Exception has been thrown by
the target of an invocation. --->
Microsoft.ApplicationServer.Caching.DataCacheException:
ErrorCode<UnspecifiedErrorCode>:SubStatus<ES0001>:The role WebService
was not found in the current deployment.
at Microsoft.ApplicationServer.Caching.AzureClientHelper.RoleUtility.
GetCacheRoleIPList(String roleName, String portIdentifier)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments,
Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,
Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,
BindingFlags invokeAttr, Binder binder, Object[] parameters,
CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at Microsoft.ApplicationServer.Caching.DataCacheFactory.
AutoDiscoverServersWithinDeployment()
at Microsoft.ApplicationServer.Caching.DataCacheFactory.
TryAutoDiscoverServersWithinDeployment()
Assuming it as EndPoint.
а также
WaWorkerHost.exe Warning: 0 : WARNING: <DistributedCache.SocketClientChannel.1>
Request 1 to host net.tcp://webrolw:24233/ failed
Status=ChannelOpenFailed[System.Net.Sockets.SocketException (0x80004005):
No such host is known
Для решения этой проблемы вы можете:
- анализировать
DataCacheFactory
только что создали и посмотреть, если вServers
свойство есть любой элемент, в котором адрес совпадает с именем роли кэша - признак того, что в указанной роли не настроен кэш; - в отладочных конфигурациях размещенного сервиса уменьшите количество повторных попыток в
CacheReadyRetryPolicy
собственностьDataCacheFactory
(что вызывало 3-минутную задержку перед исключением) и, если возникли исключения, предположим, что кэш недоступен.