dotnet / dotnet/AspNetCore.Docs

SignalR Redis backplane connection failure behavior explanation

Open
#20,683 0 comments 0 reactions 0 assignees View on GitHub
doc-enhancement SignalR Source - Docs.ms
Dominant language
C#
Stars
13.1k
Forks
24.6k
Avg merge
1d 3h
Merged PRs (30d)
97

Description

We are using .NET Core 3.1 SignalR with Redis backplane running on AWS.
And sometime, our SignalR hub will throw the following error randomly
```
Failed to invoke hub method 'SignedIn'.
StackExchange.Redis.RedisConnectionException:
No connection is available to service this operation: PUBLISH Project.Hub.SomeHub:connection:v3sGIq4zJfIHhEwnIUn26A; It was not possible to connect to the redis server(s).
To create a disconnected multiplexer, disable AbortOnConnectFail.
ConnectTimeout; IOCP: (Busy=0,Free=1000,Min=2,Max=1000), WORKER: (Busy=2,Free=32765,Min=2,Max=32767), Local-CPU: n/a
---> StackExchange.Redis.RedisConnectionException: It was not possible to connect to the redis server(s). To create a disconnected multiplexer, disable AbortOnConnectFail. ConnectTimeout
```

I am not sure why there is these short connection issue between AWS serverS yet, but I saw there is some new update in the 3.1 doc about **Custom behavior for connection failures**
https://docs.microsoft.com/en-us/aspnet/core/signalr/redis-backplane?view=aspnetcore-3.1#custom-behavior-for-connection-failures

Can there be more explanation on **what** these codes do and mean, **when** and **why** are they needed?

And the example seems doesn't mention where to put `""`, I suppose it should be
``` C#
services.AddSignalR()
.AddMessagePackProtocol() // There is no such method for Microsoft.AspNetCore.SignalR 1.1.0
.AddStackExchangeRedis(o =>
{
o.ConnectionFactory = async writer =>
{
var config = new ConfigurationOptions
{
AbortOnConnectFail = false
};
config.EndPoints.Add("");

// Explanation for the following?
var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
connection.ConnectionFailed += (_, e) =>
{
Console.WriteLine("Connection to Redis failed."); // What if I want to use ILogger ?
};

if (!connection.IsConnected)
{
Console.WriteLine("Did not connect to Redis."); // What if I want to use ILogger ?
}

return connection;
};
});
```

And according to https://gist.github.com/JonCole/36ba6f60c274e89014dd, I think setting `AbortOnConnectFail` to `false` is good enough?
``` C#
public void ConfigureServices(IServiceCollection services) => services
.AddSignalR(opts =>
{
opts.ClientTimeoutInterval = TimeSpan.FromMinutes(1);
opts.KeepAliveInterval = TimeSpan.FromSeconds(30);
})
.AddStackExchangeRedis(Configuration.GetValue("Cache"), opts =>
{
opts.Configuration.AbortOnConnectFail = false;
}).Services
```

---
#### Document Details

⚠ *Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.*

* ID: c548355c-d88f-b941-0622-56732973123b
* Version Independent ID: bddd7575-422d-4342-af48-f6b0979fb69a
* Content: [Redis backplane for ASP.NET Core SignalR scale-out](https://docs.microsoft.com/en-us/aspnet/core/signalr/redis-backplane?view=aspnetcore-5.0)
* Content Source: [aspnetcore/signalr/redis-backplane.md](https://github.com/dotnet/AspNetCore.Docs/blob/master/aspnetcore/signalr/redis-backplane.md)
* Product: **aspnet-core**
* Technology: **aspnetcore-signalr**
* GitHub Login: @bradygaster
* Microsoft Alias: **bradyg**

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.