【问题标题】:SignalR OnConnected firing on different server to the one which it's actually connectedSignalR OnConnected 在与实际连接的服务器不同的服务器上触发
【发布时间】:2019-08-09 02:08:48
【问题描述】:

我在 IIS 中使用 SignalR 和一个网络场,目前有 3 个服务器,请求通过 ARR 进行负载平衡。

发生了某些外部事件,我希望由客户端连接的服务器处理这些事件。所以我想跟踪客户端当前连接的 3 台服务器中的哪台。

我认为我可以使用 OnConnected 来执行此操作,并在该方法中将 MachineName 与 Redis 中的 ConnectionID 存储在一起。 问题是 OnConnected 似乎被称为与客户端连接的服务器不同的服务器。

经过调查,似乎有三个调用,一个到 /negiotate,一个到 /connect,一个到 /start。 /connect 似乎是在持续时间内保持的 websocket 连接,其他的只是暂时的。 这三个连接可能发生在不同的服务器上,似乎 websocket 连接可以到服务器 A(这就是客户端的 SignalR 连接要连接的服务器),但 OnConnected 在服务器 B 上被触发。

我想知道我是否忽略了一些可以让我看到 SignalR 连接实际连接到哪个服务器的东西?

谢谢,

【问题讨论】:

    标签: signalr web-farm


    【解决方案1】:

    如果您要使用网络场,则需要实施背板来跟踪所有消息传递。

    https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-in-signalr

    如果没有适当的背板实现,就不可能做你想做的事。

    【讨论】:

    • 您好,我已经使用了背板,但是如何判断每个客户端实际连接到哪个服务器?谢谢威尔
    • 你需要检查数据库,它应该在那里
    【解决方案2】:

    我相信这是你必须保存的东西。假设您使用mapping users 的数据库,您可以有一个附加字段,例如“LoggedInOn”并存储服务器主机名或其他标识符。

    但是,除了您希望进行的故障排除的某些方面之外,正确发送/接收消息应该穿过背板到所有服务器。这样无论他们连接到哪个服务器,都会收到消息。

    如果您有外部事件,一旦它们完成并且准备好将消息发送回客户端,背板应该将其推送到所有服务器。

    如果这没有发生,我会按照 Kelso Sharp 的说法查看文档。

    【讨论】:

    • 我的问题更多是关于 如何 如果 OnConnected 在不同的服务器上被触发,我会设置 LoggedInOn 字段。我不只是希望所有服务器都处理消息的原因是,可能会发生一些数据库访问和其他处理,因此如果场中的所有服务器都为每个服务器都执行此操作,它将效率低下并且无法很好地扩展客户。
    • 我刚才所做的是向集线器添加了一个新方法,“OnReallyConnected”,我在客户端的 .start() 中调用它,从那里我可以告诉服务器它确实有关联,但看起来很笨拙,一定有更清洁的方法吗?
    • 所有服务器都按照设计处理来自背板的消息。服务器 A 可能会看到客户端连接并将其发送给客户端,但场中的其他服务器将看不到客户端(如果您只发送给一个客户端)。如果您从一个客户端向多个客户端发送消息,则它必须跨越所有服务器才能到达每个人。这是设计使然,我相信您可能会担心没有效率的地方。您始终可以使用曲柄(参见文档)进行密度测试。
    • 我担心效率低下,这是正确的。我有一个外部事件(与 SignalR 无关),可以说它的“通知用户 A 关于事件 X”,这涉及到一些数据库调用来加载一些记录,然后将该信息发送给用户。我不希望这些数据库调用在场中的所有 服务器上重复,并且我不希望用户从场中的每个服务器获得通知。如果我能分辨出哪个用户连接到哪个服务器,我就可以让该服务器为该用户处理事件,而其他服务器忽略这些事件。
    • 如果用户发起呼叫,请求将转到用户连接的服务器,然后启动您的数据库查询并在完成后使用 - Clients.Caller.senddatatouser(yourdata);。触发 db 查询的外部事件,然后您需要查找该用户的 connectionID 并使用 - Clients.User(userId).senddatatouser(yourdata);。无论用户连接到哪个服务器,这都会向用户发送 get。
    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    相关资源
    最近更新 更多