3

我有一个设计问题。我有一个订阅实时系统来显示数据的应用程序。基本上发生的事情是客户端连接到服务器,下载当前时间的数据快照,并订阅实时更新,这些更新会立即显示在 UI 上。

我们遇到的一个问题是我们可以打开多个实时报告,这意味着我们有多个连接和不必要的数据重复。所以我们想建立一个中央数据存储库来保存所有数据并将其提供给报告,这样我们只使用 1 个套接字连接和一组数据通过网络。

我遇到的问题是这个。当报表订阅我的数据存储库时,它会在当前时间检索快照,然后接收实时更新。这意味着我的存储库正在使用来自服务器的实时更新来更新它的内部缓存,并将这些更新发送到订阅的报告。

当另一个报表连接到存储库时,它还需要下载当前数据并订阅更新。但是,如果在下载快照时有更新,报告将遗漏更新。在下载快照时我也无法锁定缓存,因为这会导致报告 1 在报告 2 获取其快照时停止更新。

我如何确保报告 1 继续获得更新,而报告 2 下载不受干扰的快照,然后开始接收它在此期间错过的所有更新以及未来的更新?

对不起,如果这不清楚。我并不总是擅长描述我的问题 :) 传入的数据本质上是表格中的行,然后我将其汇总成一棵树。它们可以通过“行”中的关键字段来识别,我的缓存将存储每个“行”的最新副本

提前致谢!

4

2 回答 2

0

如果我理解你是正确的,你的系统有 3 个部分:

  1. 写报告信息的实时系统
  2. 存储信息的缓存服务器
  3. 获取此信息的客户

正确的?

如果是这样,如果我是你,我会为缓存服务器开发一个管理器,并为实时系统和客户端制作 2 个 API,它们将用于与缓存服务器一起工作。我会坚持一条规则,一次写,没人读,或者全部读,没人写。我会排队。一种用于客户请求,一种用于实时。我们需要该队列的同步机制。

我看到了下一个工作方式:

如果实时系统写入新信息:

  1. 有正在更新的报告的客户阅读器

    1.1 缓存管理器将所有信息写入第二个存储以获取这些报告

    如果管理器看到有新信息,它会停止新的读取器请求并将它们放入队列中,并等待所有已经开始读取的线程完成并从第二个存储库更新到第一个存储库

  2. 没有读者

    2.1。将信息放在已修改的报告上的主存储块读取器

如果您的实时系统是实时的(在实时处理器上工作)并且每次都编写,那么您应该添加用于合并两个存储的超时并在该时间停止阅读器。

于 2012-05-24T03:16:19.050 回答
0

为什么不让每个缓存状态都有一个哈希值。如果我们的散列是不同的散列,所有订阅者都必须向管理器检查当前散列号,然后触发仅下载更新。

我建议您保存更新并允许客户端在订阅更新之前将自己更新到最新版本。您可以将更新存储在多远的位置。

于 2021-06-22T11:10:18.873 回答