- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有以下情况:我有一个 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.DependencyResolver
到 UseRedis
。
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/
我已经实现了 SignalR BackPlane,它似乎工作正常。 用过这个URL供引用。 我正在创建一个新的 SQL 数据库来实现 SingalR。我的疑问是:为什么我必须创建一个新的数据库,或者为
我想知道是否可以将 SignalR 消息直接添加到 SignalR SQL 背板(来自 SQL),这样我就不必使用 SignalR 客户端来执行此操作。 我的情况是,我有一个已激活的 SQL Serv
我有以下 Hub 片段与 SignalR、Redis 背板和单个服务器一起工作。 public abstract class HubBase : Hub { private r
我目前正在玩 SignalR 2.0.3,通过使用 Redis for windows 的 BackPlane 进行横向扩展 http://msopentech.com/blog/2013/04/22
是否有人尝试连接 AWS Elasticache Redis(禁用集群模式)以与 SignalR 一起使用?我发现 AWS Redis 存在一些严重的配置问题和限制。 1) 我们正在尝试使用 Redi
我是一名优秀的程序员,十分优秀!