【问题标题】:How check if redis channel is already subscribed with StackExchange.Redis?如何检查 Redis 频道是否已使用 StackExchange.Redis 订阅?
【发布时间】:2020-04-21 10:04:07
【问题描述】:

我有一个运行某些进程的 Windows 服务,它必须在浏览器上通知它的进度。我不确定我是否在做一些好的事情,但我只是做了:

Windows Service publish a json on a redis channel called 'web' -> An action on ASP.NET MVC application subscribe the 'web' channel and send the json to browser via signalR hub -> the browser take it and show the progress

我有以下代码(它是一个助手)在发布后添加一个通道范围。它是从我的控制器/动作中调用的:

public void Listen(string channel, Action<string, object> action)
{
   var sub = Client.GetSubscriber();

   sub.Subscribe(channel, (c, v) =>
   {
      action(c.ToString(), v.ToString());
   });
}

问题:它按预期工作,我收到了浏览器通知。问题是当用户(在浏览器上)点击 F5 或再次执行操作时。它创建了一个新频道,我收到了重复的消息。如果用户再次执行它,我开始每条收到 3 条消息,依此类推。我想避免它。

我的尝试:我尝试使用IsConnection(channel),但它总是返回true。我在Subscribe(channel) 之前尝试过Unsubscribe(channel),它可以工作,但我不确定我是否会丢失一些消息(我害怕)。我不知道如何解决它并避免重复订阅。有谁能帮帮我吗?

谢谢。

【问题讨论】:

    标签: c# .net redis publish-subscribe stackexchange.redis


    【解决方案1】:

    您使用的是ConnectionMultiplexer 吗?见Using redis pub/sub

    ...在连接失败的情况下,ConnectionMultiplexer 将 处理重新订阅请求频道的所有细节

    考虑从 Pub/Sub 切换到 Redis Streams。见What are the main differences between Redis Pub/Sub and Redis Stream?

    您可以将groups and clients 命名为Consumer Groups。因此,您可以通过会话或其他任何方式来控制它,甚至可以使用 fingerprint.js 之类的东西来匿名识别每个浏览器。

    【讨论】:

    • 是的,我的代码中的ClientConnectionMultiplexer。也许它是创建一个新的订阅者并将通知复制到 signalR。这就是我想避免的,我不知道如何。我认为Pub/Sub 是我的情况,因为我只想发送消息并完成。
    • 你是如何开始ConnectionMultiplexer的?您可能应该在 Startup.cs 中将其创建为单例并将其依赖注入到控制器中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多