【问题标题】:SignalR or Redis pubsub for scaled publishers and scaled subscribers on AzureSignalR 或 Redis pubsub 用于 Azure 上的缩放发布者和缩放订阅者
【发布时间】:2015-12-04 16:54:12
【问题描述】:

在我们的应用程序中有一个事件发射器(窗口服务 A)在队列中发射事件。有一个通知服务 (B)(托管在云中的窗口服务),它从队列中读取这些事件并根据配置的规则,向 Web 应用程序 (C) 上的登录用户发送通知。

我们计划在 Web 浏览器和 Web 应用程序 (C) 之间使用 signalR。但是在设置事件发射器(A)和通知服务(B)之间的通信时感到困惑。最初我们也在考虑在那里使用 SignalR。但是有一个问题!如果负载增加,通知服务和网络应用可以横向扩展(拥有多个实例)。

假设有 3 个通知服务实例和 4 个网络服务器实例。现在,SignalR 如何在它们之间工作。每个 Web 服务器都必须为每个通知引擎打开一个 signalR 通道。但这会导致问题:

通知服务和 Web 应用程序之间存在紧密耦合。每当添加一个新的 Web 实例时,它必须形成连接所有可用的通知实例。它下降了,它必须破坏这种联系。通知实例也是如此。

所以,我们正在考虑使用一些 pubsub 而不是 signalR。现在我们可以想到 Redis pubsub。通知服务将消息推送到 Redis,所有 Web 服务器都会订阅它并最终收到消息。

如果我们可以更好地设计,请分享您的想法。

【问题讨论】:

    标签: c# azure notifications redis signalr


    【解决方案1】:

    Redis pubsub 不是可靠的消息传递系统。这是一劳永逸。如果某些消息被发送到某个通道并且没有侦听器,则该消息将丢失。

    如果您已经在 Azure 中,您的解决方案是 Service Bus 并查看 topics and brokered messages

    【讨论】:

    • 感谢 Matias 的回复,
    • 感谢 Matias 的回复,问题是,这项服务有两种监听器。一,一个接一个地处理消息,需要可靠的消息系统。该组件侦听所有消息。在这种情况下,我们可以使用服务总线。但是对于网络应用程序,我们需要动态监听器。例如,如果两个用户登录并且他们登陆 item1 和 item2 的仪表板,Web 应用程序将只订阅这两种消息。一旦用户注销,它将为他们退订。我应该使用“服务总线”以及“Redis pub sub”吗?
    • @Pragmatic 为什么不呢?归根结底,每种消息都应该是一个主题
    • Azure 主题很好,可以创建,但动态创建/删除订阅可能很耗时。我的意思是,可以有 10000 种不同类型的产品。任何用户都可以查看任何产品。现在他应该只订阅与该产品相关的消息。创建/删除这么多订阅看起来不太好。
    • @Pragmatic 好吧,但我在考虑订阅产品主题,并且工人角色可以成为产品主题的订阅者。然后,消息(例如 JSON 格式)可能包含产品种类、ID 或您可能需要的任何信息
    猜你喜欢
    • 2017-11-27
    • 2020-09-26
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多