使用SignalR跟踪用户操作的当前上下文以进行推送通知

时间:2017-09-12 16:42:01

标签: c# asp.net-web-api signalr signalr-hub signalr-2

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

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

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

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

1 个答案:

答案 0 :(得分:0)

  1. 这种方法没有错。这似乎是一个相当简单的pubsub方法。用户在查看时订阅特定线程。然后,服务器将该线程的更新发布给已附加到该线程的用户。您为上下文字典概述的内容实际上是向用户发送目标更新所需的最少数据量。
  2. 缩放很好,虽然我认为你应该反转你的字典以获得更好的性能。您应该键入threadId,并保留已附加到该线程的connectionId列表。这样,您就可以在新用户查看线程时简单地将connectionId添加到现有列表中。您可以最小化需要保留在内存中的数据量。就像现在一样,你必须遍历每个connectionId以找出他们正在查看的内容并将其聚合到一个列表中,所以你也可以将其反转并存储列表本身。
  3. 只要服务器场中的每个服务器都处理自己的connectionId / threadId映射列表,它就可以工作。如果每个服务器都可以独立响应线程中的更改,那么场设置应该没问题。