【问题标题】:How should I continuously observe a Web service-provided database query?我应该如何持续观察 Web 服务提供的数据库查询?
【发布时间】:2013-04-05 19:45:58
【问题描述】:

我正在开发一个 Web 应用程序,它应该查询 Web 服务 (ASP.NET Web API) 以获取某些数据,并将结果可视化。当客户端应用程序运行时,查询的数据可能会发生变化,因为项目可能会添加到相应的数据库集合中或从相应的数据库集合中删除。客户端本身或其他客户端都可以修改集合(通过 Web 服务)。数据库服务器 RavenDB 能够将更改通知其客户端(Web 服务)。

我想知道的是,当 Web 服务中的数据发生变化时,客户端应该如何保持最新状态?具体来说,如果 Web 服务的数据库发生变化,导致客户端的数据视图变得过时,客户端应该会收到新的查询结果。保持与客户端的持久连接是个好主意吗?通过SignalR,并在每次对数据库进行更改时简单地通知他们,以便每个客户端都可以重新查询数据?如果这些更改通知变得过于频繁,是否应该限制它们?

示例场景

数据库包含以下项目(JSON 表示法):

[{"Id": "2", "User": "usera"}, {"Id": "1", "User": "usera"},
    {"Id": "3", "User": "userb"}, {"Id": "4", "User": "usera"}]

客户端 A 请求 User == "usera" 的项目,分页至最多 2 个项目并按 Id 排序;该服务返回以下集合:

[{"Id": "1", "User": "usera"}, {"Id": "2", "User": "usera"}]

然后客户端B告诉服务删除以下项:{"Id": "2", "User": "usera"},这样数据库就变成了:

[{"Id": "1", "User": "usera"}, {"Id": "3", "User": "userb"},
    {"Id": "4", "User": "usera"}]

现在的问题是,Web 服务如何通知客户端 A 它应该重新查询新数据?也就是说,客户端 A 应刷新其视图以包含以下内容:

[{"Id": "1", "User": "usera"}, {"Id": "4", "User": "usera"}]

【问题讨论】:

  • 您是否还有必须管理的并发要求,例如如果两个客户端更改相同的数据会怎样……谁会赢?
  • @EricJ。我想它必须以某种方式处理,但我认为它可以在以后考虑?我确信 RavenDB 至少有某种用于冲突检测的逻辑。可能会向检测到冲突的服务客户端发出冲突错误信号。
  • 您可以阅读 Raven 的乐观并发here。您还需要考虑如何在 SignalR 通知中确定 - 谁会收到通知。安全权限可能会在任何复杂的应用程序中发挥作用。
  • @MattJohnson 谢谢 :)

标签: web-services asp.net-web-api ravendb signalr


【解决方案1】:

你说的很对。您可以同时托管 Web API 和 SignalR。您可以使用 Web API 检索数据,并使用 SignalR 在数据更改时通知客户端。您可以通知客户端数据已更改,以便他们可以重新查询,或者您可以实际将更改发送给客户端,以避免重新查询 API。

您还可以使用不同的模型,其中客户端每隔 15 或 30 秒轮询一次服务器并更新可视化结果。这具有不需要持久连接并且更容易实现的优点。但是更改传播到客户端需要更长的时间,如果结果集很大或更改不频繁(因为无论是否实际有任何更改都会发生轮询),您最终可能会消耗更多带宽。

【讨论】:

  • 感谢您的意见 :) 将尝试实施此设计。
  • 可能需要一点时间才能将其变成代码,因为这是一个爱好项目:p 一旦我能够尝试,我会回到这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
相关资源
最近更新 更多