Signalr 信号器在不同的服务器上与它所连接的服务器上未连接点火';它实际上是有联系的

Signalr 信号器在不同的服务器上与它所连接的服务器上未连接点火';它实际上是有联系的,signalr,web-farm,Signalr,Web Farm,我在IIS中使用SignalR和一个web场,目前有3台服务器,请求通过ARR进行负载平衡 发生某些外部事件,我希望客户端所连接的服务器处理这些事件。因此,我想跟踪客户端当前连接的3台服务器中的哪一台 我认为我可以使用OnConnected实现这一点,并在该方法中针对redis中的ConnectionID存储MachineName。 问题是OnConnected似乎被称为与客户端连接的服务器不同的服务器 经调查,似乎有三个呼叫,一个呼叫/协商,一个呼叫/连接,一个呼叫/启动。/connect似乎

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

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

我认为我可以使用OnConnected实现这一点,并在该方法中针对redis中的ConnectionID存储MachineName。 问题是OnConnected似乎被称为与客户端连接的服务器不同的服务器

经调查,似乎有三个呼叫,一个呼叫/协商,一个呼叫/连接,一个呼叫/启动。/connect似乎是在持续时间内保持的websocket连接,其他连接只是暂时的。 这三个连接可以发生在不同的服务器上,而且websocket连接似乎可以连接到服务器A(因此,客户端的SignalR连接将要连接到的服务器),但是OnConnected在服务器B上被触发

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

谢谢


如果要使用web场,则需要实现一个背板来跟踪所有消息传递


如果没有合适的背板实现,就不可能完成您想要做的事情。

如果要使用web场,则需要实现一个背板来跟踪所有消息传递


如果没有合适的背板实现,就不可能完成您想做的事情。

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

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

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


如果不是这样,我会像凯尔索·夏普所说的那样检查文档。

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

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

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


如果没有发生这种情况,我会像Kelso Sharp所说的那样查看文档。

Hi,我已经使用了背板,但是我如何知道每个客户端实际连接到哪个服务器?谢谢。你需要检查数据库,它应该在那里。嗨,我已经使用了背板,但是我怎样才能知道每个客户端实际连接到哪个服务器呢?谢谢你需要检查数据库,它应该在那里。我的问题更多的是,如果在不同的服务器上触发了OnConnected,我该如何设置LoggedInOn字段。我不希望所有服务器都处理消息的原因是,可能会发生一些数据库访问和其他处理,因此,如果服务器场中的所有服务器都对每个客户端执行此操作,则效率低下且扩展性不好。我刚才所做的是向中心添加了一个新方法“OnReallyConnection”我在客户端的.start()中调用它,从那里我可以告诉服务器它真的连接到了,但这看起来很笨拙,必须有一种更干净的方法?所有服务器都是通过设计来处理来自背板的消息的。服务器A可能会看到客户端连接并将其发送到客户端,但服务器场中的其他服务器不会看到客户端(如果您只发送到一个客户端)。如果您从一个客户机向多个客户机发送消息,它必须跨越所有服务器才能到达每个客户机。这是故意的,我相信你可能会担心没有效率的地方效率低下。你可以随时使用crank,参见文档,进行密度测试。我担心效率低下,这是正确的。我有一个外部事件(与SignalR无关),比如说它的“通知用户A关于事件X”,它涉及许多数据库调用来加载一些记录,然后将这些信息发送给用户。我不希望这些数据库调用在服务器场中的所有服务器上重复,也不希望用户从服务器场中的每个服务器获得通知。如果我可以告诉哪个用户连接到哪个服务器,那么我可以让该服务器为该用户处理事件,而其他服务器忽略这些事件。如果用户发起呼叫,请求将转到该用户连接的服务器,然后该服务器启动您的db查询,并在完成后使用-Clients.Caller.senddatatouser(yourdata);。触发db查询的外部事件,然后您需要查找该用户的connectionID并使用-Clients.user(userId)。senddatatouser(yourdata);。无论用户连接到哪台服务器,这都会向用户发送get。我的问题更多的是,如果在另一台服务器上触发OnConnected,我将如何设置LoggedInOn字段。我不希望所有服务器都处理该消息,原因是可能会发生一些数据库访问和其他处理因此,如果服务器场中的所有服务器都为每个客户机执行此操作,则效率低下且无法很好地扩展