【问题标题】:signalr managing connections in external datastore管理外部数据存储中的连接的信号器
【发布时间】:2014-07-24 18:19:46
【问题描述】:

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

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

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

  1. signalr 服务器宕机
  2. 在服务器备份之前,客户端断开连接(关闭浏览器或其他)
  3. signalr 服务器备份

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

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

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

【问题讨论】:

  • 您可以在应用程序启动时为服务器分配断开日期或您用于任何打开连接的任何标志。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 这也是一个不错的选择,新的客户端连接与保存的元数据相匹配
  • 使用组的一个问题是它们没有持久化,要克服无论如何你基本上需要管理组和组中的连接~
  • 客户端应该留在组中,直到客户端调用停止,否则客户端完全断开与服务器的连接(即它已停止自动重新连接)。如果你想使用组解决方案,你应该有办法在 OnConnected 中始终将同一个用户添加到同一个组中,以防你不得不手动重启客户端。
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
相关资源
最近更新 更多