Код: Выделить всё
"READONLY You can't write against a read only replica"
< /code>
Если я правильно понимаю, это потому, что соединение кэшируется клиентом Redis (в Microsoft.extensions.caching.stackexchangeDis Code). < /p>
Метод setAsync вызывает метод onrediserror в случае ошибки: < /p>
...
catch (Exception ex)
{
OnRedisError(ex, cache);
throw;
}
...
< /code>
В методе onrediserror кэшированное соединение может быть обнаружено.private void OnRedisError(Exception exception, IDatabase cache)
{
if (_options.UseForceReconnect && (exception is RedisConnectionException or SocketException))
{
...
// wipe the shared field, but *only* if it is still the cache we were
// thinking about (once it is null, the next caller will reconnect)
var tmp = Interlocked.CompareExchange(ref _cache, null, cache);
...
}
}
< /code>
и Finilly, UseForCerConnect-< /p>
private bool? _useForceReconnect;
internal bool UseForceReconnect
{
get
{
return _useForceReconnect ??= GetDefaultValue();
static bool GetDefaultValue() =>
AppContext.TryGetSwitch("Microsoft.AspNetCore.Caching.StackExchangeRedis.UseForceReconnect", out var value) && value;
}
set => _useForceReconnect = value;
}
Также это написано здесь: https://learn.microsoft.com// En-US/Azure/Architecture/Bestpractices/Retry-Service-специфический##retry-usage-guidance-1
Клиент Stackexchange Redis управляет своими собственными Понимает, , но только при установлении соединения с кэшем, когда приложение впервые начинается . Вы можете настроить тайм -аут подключения, количество попыток повторения и время между повторными поисками для установления этого соединения, но политика повторной попытки не применяется к операциям против кэша.
< Br /> Так кажется, что есть функция, которая отключена. Могу ли я просто включить это или это плохая идея? < /P>
Есть ли другой способ воссоздать соединение в случае ошибки? Код клиента: https://github.com/dotnet/aspnetcore/bl ... he.cs#l275
Подробнее здесь: https://stackoverflow.com/questions/794 ... async-meth