0

我们正在寻找一种方法来让后台进程将消息推送到连接的客户端。

我们采用的方法是,每当建立新连接(OnConnected)时,我们将 connectionId 与一些请求元数据(用于以后过滤)单独存储在我们的 mongo db 中。当事件发生(从客户端或后端进程触发)时,workerrole(另一个后台进程)将侦听这些事件(通过消息传递或其他方式),然后根据事件详细信息,它将使用捕获的元数据过滤连接的客户端。

该方法似乎还可以,但是当我们遇到问题时

  1. 信号器服务器出现故障
  2. 在服务器备份之前,客户端断开连接(关闭浏览器或其他)
  3. 信号器服务器备份

  4. 我们在 mongodb 中留下了我们不知道它们的连接状态的连接

我想知道是否有更好的方法来做到这一点,目标是能够针对特定连接的客户端将消息推送到后端服务(工作角色)

顺便说一句,我们正在使用带有服务总线背板的横向扩展选项

4

1 回答 1

0

以下有关将SignalR 用户映射到连接的指南介绍了您用于管理连接的几个选项。

您当前采用的方法属于“永久、外部存储”选项。

如果您想/需要坚持使用该选项,您可以添加某种清理过程,定期从数据库中删除超过指定时间不活动的连接。当然,当具有匹配元数据的客户端使用新的 connectionId 重新连接时,您也可以主动删除旧条目。

我认为更好的选择是使用 IUserIdProvider 或(单用户?)组,假设您的过滤要求不太复杂。使用这些选项中的任何一个都应该不需要在数据库中存储 connectionIds。这些选项还使得将消息发送到单个用户可以同时打开的多个设备/选项卡变得相当容易。

于 2014-07-24T18:46:33.123 回答