SignalR 使用 Azure EventHub 横向扩展

SignalR scaling out with Azure EventHub

我正在寻找 SignalR 的高频缩放解决方案。我想知道我是否可以使用 Azure EventHub 来做到这一点。如果我使用 EventHub 作为 SignalR 消息的背板,它会成为我的瓶颈吗?

我查看了 this 页面,但没有任何关于 EventHub 的信息,因为它是相当新的。

我不能说出 SignalR 的具体细节;但是,原则上您可以将 EventHub 用作背板,但您需要了解这些限制。

SignalR 的背板横向扩展模式假定所有服务器都可以访问所有消息并假定处理它们。这对单个背板在商品硬件或云中的功能提供了相当明确的限制。在典型的云中,您可能能够维持 100MB/s 的数据吞吐量(1 Gb/s nic 的整数),商品硬件(和 Azure 的 HPC 机器)的高端 1000MB/s(10 Gbit/second nic).

那么问题是 Azure EventHubs 能否让你达到吞吐量的架构限制?

答案是肯定的。 100 或 1000 个分区将为您提供足够的写入吞吐量和足够的 2 台服务器读取容量。

下一个问题是,如果您只需要每台服务器以 100MB/秒的速度读取您的背板,那么有多少台服务器可以读取数据(即,如果您以 100MB/秒的速度广播数据大小不合适的股票报价随着服务器数量的增加而增加)。

这里的答案是,有多少就有多少,但也有一定的技巧。

EventHubs 通过分割数据流来扩展。每个分区的最大读取吞吐量为 2MB/s,由所有 readers 共享。但是,您可以乘以分区数来弥补拆分(添加超过 32 个需要与 Microsoft 联系)。 EventHubs(如 Kafka 和 Kinesis)的设计假设是消费将跨机器分配,从而避免前面讨论的背板限制。一起工作读取流的消费者是一个消费者组(Azure 似乎需要一个命名的 CG 即使是直接reader),在这个背板模型中没有逻辑消费者组,所以问题是如何读取数据。

最简单的解决方案可能是使用高级自动平衡事件处理器主机,其中每个服务器都是其自己的具有固定名称的消费者组。每个消费者组中只有一台服务器,每台服务器将接收所有分区(10 台服务器 500 个,达到 100MB/秒,也就是 11000 美元/月 + 每百万事件 0.028 美元)。

这种方法有一个关键限制:您只能使用 20 consumer groups per event hub。因此,您可以将事件中心链接在一起或使用这种方法制作一棵树来获取任意数字。

另一种选择是使用连接到特定分区的直接客户端。 A single partition in a consumer group can have 5 readers 从而将对链接集线器的需求减少了 5 倍,从而将每个事件的成本减少了 5 倍(不会降低吞吐量单位要求)。

总而言之,在任何背板成为瓶颈之前,它不应该成为瓶颈。但是,如果您希望流量超过 100MB/秒,请不要在背板上构建某些东西。

我没有谈到延迟,您需要自己测试一下,但很可能您没有在云中进行 HFT,实时游戏通常在实例中是有原因的。