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

时间:2014-07-24 18:19:46

标签: signalr signalr-hub signalr.client signalr-backplane

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

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

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

  1. signalr server down down
  2. 在服务器备份之前,客户端断开连接(关闭浏览器或其他)
  3. 信号服务器重新启动

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

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

    顺便提一下,

    我们正在使用带服务总线背板的scaleout选项

1 个答案:

答案 0 :(得分:0)

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

您目前采取的方法属于永久性外部存储"选项。

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

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

相关问题