gpt4 book ai didi

dependency-injection - SignalR & Autofac - Redis 背板横向扩展

转载 作者:IT王子 更新时间:2023-10-29 06:00:04 24 4
gpt4 key购买 nike

我有以下情况:我有一个 SignalR 应用程序,我在其中使用 Autofac 作为依赖项解析器。

public class Startup
{
public void Configuration(IAppBuilder app)
{
var container = new AutofacContainer().Container;

var resolver = new AutofacDependencyResolver(container);
resolver.UseRedis("serverIp", portNumber, "password", "channelName");

app.UseAutofacMiddleware(container);
app.MapSignalR(new HubConfiguration
{
Resolver = resolver
});

resolver.UseRedis("192.168.122.213", 6300, "", "FLEDGG");
AddSignalRInjection(container, resolver);
}

private void AddSignalRInjection(IContainer container,IDependencyResolver resolver)
{
var updater = new ContainerBuilder();

updater.RegisterInstance(resolver.Resolve<IConnectionManager>());
updater.Update(container);
}
}

这是 AutofacContainer 类。

public class AutofacContainer
{
public IContainer Container { get; set; }
public AutofacContainer()
{
var builder = new ContainerBuilder();

builder.RegisterHubs(Assembly.GetExecutingAssembly())
.PropertiesAutowired();
builder.RegisterType<Test>()
.As<ITest>()
.PropertiesAutowired();

Container = builder.Build();
}
}

现在,the official SignalR Redis scaleout documentation from Microsoft指出我应该告诉 GlobalHost.DependencyResolverUseRedis

    public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
app.MapSignalR();
}

因为我不再在应用程序中使用 GlobalHost(即使我使用 GlobalHost,在 Redis 中也绝对没有任何行为)(as the Autofac integration with SignalR and Owin indicates):

A common error in OWIN integration is use of the GlobalHost. In OWIN you create the configuration from scratch. You should not reference GlobalHost anywhere when using the OWIN integration.

由于 Startup 类现在已配置:

var resolver = new AutofacDependencyResolver(container);
resolver.UseRedis("serverIp", portNumber, "password", "channelName");

所以我创建了一个类型为 AutofacDependencyResolver 的新 resolver,它成功连接到 Redis PubSub。但问题是,如果我尝试发送一条消息,该消息将重复数千次。

(在 Chrome 控制台中,为了从服务器发送一条消息,我最终陷入了无限循环,客户端收到了无限次)。

因此,问题是:如何在使用 Autofac 作为依赖解析器时设置 SignalR Redis 横向扩展(注意:在任何情况下我都可以使用另一个依赖解析器)。

谢谢!

编辑:如果您想了解有关解决方案的更多信息,here is the repo没有这一行:

resolver.UseRedis("serverIp", portNumber, "password", "channelName");

谢谢!

编辑:我觉得我应该澄清一些事情:如果我使用 resolver.UseRedis();,每条通常发送(一次)的消息都会发送多次 - 所以如果我订阅使用 subscribe "channelName" 到 Redis 中的“channelName”,我发现它与客户端的行为一致:每条消息都会发送多次。

接下来要做的是拥有一个没有 Autofac 的基本 SignalR 应用程序,并查看 Redis 的行为方式,尽管我认为这是一个与 Autofac 相关的问题,更具体地说与配置相关。

谢谢!

更新:显然,在没有 Autofac 的基本 SignalR 应用程序中存在相同的行为。该问题与 Autofac 无关。

最佳答案

好的,我知道发生了什么:

我使用的 Redis 服务器配置为在一个集群中同时运行多个实例。

默认情况下,如果您有一个 Redis 集群并在任何实例的 channel 上发布消息,该消息将默认转发到所有其他实例。

In a Redis Cluster clients can subscribe to every node, and can also publish to every other node. The cluster will make sure that published messages are forwarded as needed. The current implementation will simply broadcast each published message to all other nodes.

The Redis cluster specification.

很可能,SignalR 实现被配置为接收来自 Redis 的任何消息,因此我的行为很奇怪。

解决方案是拥有一个不在集群中的 Redis 实例,并且一切正常。

如果您想拥有 SignalR 背板,请不要使用集群中的实例!

关于dependency-injection - SignalR & Autofac - Redis 背板横向扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32626126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com