0

如果您查看 StackOverflow (SO) 站点,当您查看特定线程并且该线程有一些更新时,SO 会将通知推送给您。这意味着 SO 知道用户上下文/用户操作(您当前正在查看哪个线程)。我正在尝试使用 SignalR 在我的 ASP.NET Web API 应用程序中构建类似的东西。

为了实现这种类似的行为,我正在执行以下步骤。

  1. 每次用户查看线程时,我都会对端点进行 get 调用以返回线程信息,我正在维护一个字典,每次都会更新该字典,调用此端点。在这本字典中,我将context.connectionId as 键threadId 存储(保留threadId为值,因为多个用户可以同时查看同一个线程)。
  2. 每当对任何线程进行更改时,我都会要求字典向我返回 value == threadId 的所有 connectionId(键)。
  3. 然后我将通知推送到步骤 2 中返回的所有 coonectionId。

问题:

  1. 我觉得这太过分了,可能有一种更简单的方法来完成这一切。处理这种情况的最佳方法是什么?
  2. 您是否认为这种方法可以很好地扩展并且不会影响应用程序性能。
  3. 明天如果我搬到服务器场,这种方法仍然有效吗?
4

1 回答 1

0
  1. 这种方法没有任何问题。这似乎是一种相当简单的 pubsub 方法。用户在查看时订阅特定线程。然后,服务器将对该线程的更新发布给已订阅该线程的用户。您为上下文字典概述的内容实际上是向用户发送目标更新所需的最少数据量。
  2. 缩放很好,尽管我认为你应该反转你的字典以获得更好的性能。您应该关闭 threadId,并保留已替换到该线程的 connectionIds 列表。这样做时,您可以在新用户查看线程时简单地将 connectionId 添加到现有列表中。您可以最大限度地减少需要保存在内存中的数据量。就目前而言,您必须遍历每个 connectionId 以找出他们正在查看的内容并将其聚合到一个列表中,因此您不妨将其反转并存储列表本身。
  3. 只要场中的每个服务器都处理自己的 connectionId/threadId 映射列表,它就可以工作。如果每个服务器都可以独立响应线程中的更改,那么农场设置应该没问题。
于 2017-09-13T14:04:33.833 回答