Open Closed

Redis backplane for ABP SignalR #1380


0
vishalnikam created
  • ABP Framework version: v3.0.4
  • UI type: Angular
  • DB provider: EF Core
  • Tiered (MVC) or Identity Server Separated (Angular): yes
  • Exception message and stack trace:
  • Steps to reproduce the issue:

We have AWS hosting and the SingleR AbpHub is hosted in multiple ECS containers. The SignalR Redis backplane uses the pub/sub feature to forward messages to other servers. could you please help on how to enble radis backplane in ABP SignalR.


13 Answer(s)
  • 0
    maliming created
    Support Team

    hi

    Have you tried the steps on this document?

    https://docs.microsoft.com/en-us/aspnet/core/signalr/redis-backplane?view=aspnetcore-5.0

    Configure ISignalRServerBuilder in module.

    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
    	context.Services.PreConfigure<ISignalRServerBuilder>(builder =>
    	{
    		builder.AddStackExchangeRedis("connectionString", options =>
    		{
    			options.Configuration.ChannelPrefix = "MyApp";
    		});
    	});
    }
    
  • 0
    vishalnikam created

    i didnt try steps given in microsoft documnet as it required install Microsoft.AspNetCore.SignalR.StackExchangeRedis and add config setp services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");

    But i tried your suggeted preconfig in my appservice module but it didnt worked in AWS ECS. please find below current config and let me know, if anything else is required

    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
        var hostingEnvironment = context.Services.GetHostingEnvironment();
    
        var configuration = context.Services.GetConfiguration();
    
        if (!hostingEnvironment.IsDevelopment())
        {
            context.Services.PreConfigure<ISignalRServerBuilder>(builder =>
            {
                builder.Services.AddStackExchangeRedisCache(options =>
                {
                    options.Configuration = configuration["Redis:Configuration"];
                });
            });
        }
      }
    
  • 0
    maliming created
    Support Team

    hi

    You should follow the steps and code in the document to try. If it doesn't work, please check the logs to know what's wrong.

  • 0
    vishalnikam created

    Hi,

    As per Microsoft document, we need to add services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>"); in configservices but as per ABP documement, it says that You don't need to use the services.AddSignalR() and the app.UseEndpoints(...), it's done by the AbpAspNetCoreSignalRModule. we are using AbpAspNetCoreSignalRModule module

    https://docs.abp.io/en/abp/latest/SignalR-Integration

  • 0
    maliming created
    Support Team

    we need to add services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");

    Yes, but you need to configure the ISignalRServerBuilder.

    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
    	context.Services.PreConfigure<ISignalRServerBuilder>(builder =>
    	{
    		builder.AddStackExchangeRedis("connectionString", options =>
    		{
    			options.Configuration.ChannelPrefix = "MyApp";
    		});
    	});
    }
    
  • 0
    vishalnikam created

    Yes, i did. here is sample code. i dont get option for AddStackExchangeRedis

    public override void PreConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment();

    var configuration = context.Services.GetConfiguration();
    
    if (!hostingEnvironment.IsDevelopment())
    {
        context.Services.PreConfigure&lt;ISignalRServerBuilder&gt;(builder =>
        {
            builder.Services.AddStackExchangeRedisCache(options =>
            {
                options.Configuration = configuration["Redis:Configuration"];
            });
        });
    }
    

    }

    also, do you mein i need to add services.AddSignalR().AddStackExchangeRedisCache("<your_Redis_connection_string>"); in configservice as well ?

  • 0
    maliming created
    Support Team

    hi

    You need install the Microsoft.AspNetCore.SignalR.StackExchangeRedis package. https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.StackExchangeRedis/

    Then

    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
    	context.Services.PreConfigure<ISignalRServerBuilder>(builder =>
    	{
    		builder.AddStackExchangeRedis("connectionString", options =>
    		{
    			options.Configuration.ChannelPrefix = "MyApp";
    		});
    	});
    }
    
  • 0
    vishalnikam created

    Hi,

    I tried with given approach but no success. still facing same issue. SingalR pub/sub is working fine with single ECS container but not with multiple.

    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
        var hostingEnvironment = context.Services.GetHostingEnvironment();
    
        var configuration = context.Services.GetConfiguration();
    
        if (!hostingEnvironment.IsDevelopment())
        {
            var redis = configuration["Redis:Configuration"];
    
            context.Services.PreConfigure<ISignalRServerBuilder>(builder =>
            {
                builder.AddStackExchangeRedis(redis, options =>
                {
                    options.Configuration.ChannelPrefix = "InvoiceManagement";
                });
            });
    
        }
    }
    
  • 0
    maliming created
    Support Team

    HI

    Is there any messages in the logs?

  • 0
    vishalnikam created

    Hi,

    There is no issue found in logs related to SignalR but it is not working as expected . 1 ECS container message is not getting to other container.

  • 0
    albert created
    Support Team

    any logs in browser?

  • 0
    vishalnikam created

    Hi,

    there is no issue log in browser either. as said we are running this invoice service in multiple container so one only get the hub notification to the user connetced to the same container and rest users connected to other container not getting notification. this should be solve by Redis backplane but given solution is not working.

  • 0
    maliming created
    Support Team

    hi

    I can't think of any possible reasons, we have followed Microsoft's documentation.

    Can you try to use redis backplane in non-abp applications?