SignalR 与多个服务器 Pod 协商(负载均衡)

问题描述 投票:0回答:1

我的 .NET 应用程序中的 SignalR 遇到问题。 将前端连接到套接字有两个步骤: 1° 发送 HTTP POST 请求与集线器进行协商(因为我没有跳过协商)(获取令牌和可用的传输类型); 2°启动websocket连接;

我的问题是,我将应用程序托管在云中(在容器中),并具有负载平衡。每当后端应用程序(托管 SignalR)有多个 pod(实例)时,它就无法正常工作。第一个请求正常工作,返回令牌和传输类型。第二个请求,向我抛出一个 404,响应为“与该 ID 没有连接”;

我的猜测是:由于它具有负载平衡,因此连接的第一步(协商)被发送到服务器 A。第二步,它尝试与套接字建立连接,被发送到服务器 B,即没有连接的令牌和 ID,无法验证它。

洽谈要求: negotiate request

协商回应: negotiate response

连接集线器请求: connection to hub request

连接到集线器响应: connection to hub response

在本地服务器上或在单个 Pod 中运行后端服务器时,它工作正常。 我尝试将 redis 实现为背板,但我认为它不能解决此错误。

.net-core signalr signalr-hub signalr-backplane
1个回答
0
投票

如果您使用粘性会话,则需要使用在协商期间从信号服务器发送的实际 ARRAffinity 标头。

  1. 协商/获取传输类型的初始请求: 服务器使用来自已执行请求的所有服务器的 ARRAffinity 标头进行响应。这将包括创建信号连接的实际服务器。 响应应该类似于 ARRAffinity:abc1 - 域 - 信号服务器 ARRAffinity:def2 - 域 - API 网关。

  2. 在下一个建立 Websocket 的请求中,将 ARRAffinity 设置为 ABC1,而不是 def2。这会将请求转发到实际创建连接 ID 的服务器。

© www.soinside.com 2019 - 2024. All rights reserved.