我正在寻找 SignalR 的高频缩放解决方案。我想知道我是否可以使用 Azure EventHub 来做到这一点。如果我使用 EventHub 作为 SignalR 消息的底板,它会成为我的瓶颈吗?
我已经检查了这个页面,但没有关于 EventHub 的内容,因为它是相当新的。
我正在寻找 SignalR 的高频缩放解决方案。我想知道我是否可以使用 Azure EventHub 来做到这一点。如果我使用 EventHub 作为 SignalR 消息的底板,它会成为我的瓶颈吗?
我已经检查了这个页面,但没有关于 EventHub 的内容,因为它是相当新的。
我无法说出 SignalR 的具体细节。但是,您原则上可以将 EventHubs 用作背板,但您需要了解这些限制。
SignalR 的背板横向扩展模式假定所有服务器都可以访问所有消息并假定处理所有消息。这为单个背板在商品硬件或云中可以做什么提供了相当明确的限制。在典型的云中,您可能能够维持 100MB/s 的数据吞吐量(对于 1 Gb/s 网卡来说是一个不错的整数),商品硬件(和 Azure 的 HPC 机器)的高端 1000MB/s(10 Gbit/秒 nic)。
那么问题是 Azure EventHubs 能否将您带到吞吐量的这种架构限制?
答案是肯定的。100 或 1000 个分区将为您提供足够的写入吞吐量,并为 2 台服务器提供足够的读取容量。
下一个问题是,如果您的每台服务器的背板只需要 100MB/秒的读取速度,那么有多少台服务器可以读取数据(即,如果您正在广播 100MB/秒的股票报价,而数据大小不会随着服务器数量的增加而增加) )。
这里的答案是,你想要多少就多少,但有一些技巧。
EventHubs 通过对数据流进行分区来扩展。每个分区的最大读取吞吐量为 2MB/s,由所有读取器共享。但是,您可以乘以分区数来弥补拆分(添加超过 32 个需要与 Microsoft 交谈)。EventHubs(如 Kafka 和 Kinesis)的设计假设是消费将在机器之间分配,从而避免了前面讨论的背板限制。一起工作以读取流的消费者是一个消费者组(Azure 似乎需要一个命名的 CG,即使是直接阅读器),在这个背板模型中没有逻辑消费者组,所以问题是如何读取数据。
最简单的解决方案可能是使用高级自动平衡事件处理器主机,每个服务器都是其自己的具有固定名称的消费者组。每个消费者组中只有一台服务器,每台服务器将接收所有分区(10 台服务器 500 台服务器达到 100MB/秒,即每月 11k 美元 + 每百万事件 0.028 美元)。
这种方法有一个关键限制:每个事件中心最多只能有 20 个使用者组。因此,您可以将事件中心链接在一起或使用这种方法制作一棵树来获取任意数字。
另一种选择是使用连接到特定分区的直接客户端。消费者组中的单个分区可以有 5 个读取器,从而将链接集线器的需求减少了 5 倍,从而将每个事件的成本降低了 5 倍(不会降低吞吐量单位要求)。
总之,在任何背板成为瓶颈之前,它不应该成为瓶颈。但是,如果您希望它的流量超过 100MB/秒,请不要在背板上构建任何东西。
我没有谈论延迟,您需要自己测试,但您可能没有在云中进行 HFT,并且实时游戏通常存在于实例中是有原因的。