首页 文章

signalr管理外部数据存储区中的连接

提问于
浏览
0

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

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

这种方法似乎没问题,但我们遇到了问题

  • 信号服务器发生故障

  • 在服务器进入备份之前,客户端断开连接(关闭浏览器或其他)

  • signalr服务器恢复正常

  • we are left with connections in the mongodb which we dont know their connection status

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

by the way, we are using scaleout option with service bus backplane

1 回答

  • 0

    有关Mapping SignalR Users to Connections的以下指南介绍了管理连接的几个选项 .

    您目前采用的方法属于“永久性外部存储”选项 .

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

    我认为更好的选择是使用IUserIdProvider或(单用户?)组,假设您的过滤要求不是太复杂 . 使用这些选项之一应该不必在数据库中存储connectionIds . 这些选项还可以非常轻松地将消息发送到单个用户可以同时打开的多个设备/选项卡 .

相关问题