具有多个订户和实时更新的实时数据缓存

时间:2012-05-23 23:01:03

标签: c# .net caching real-time real-time-updates

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

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

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

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

如何确保报告1继续获取其更新,而报告2下载未经修改的快照,然后开始接收在此期间以及未来更新中遗漏的所有更新?

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

如果我理解你的错误,那么你的系统有3部分:

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

    如果是这样,如果我是你,我会为缓存服务器开发一个管理器,并为他们用来处理缓存服务器的实时系统和客户端制作2个API。我会留在规则一,写一次没有人阅读或所有阅读没有人写。我会排队。一个用于客户请求,一个用于实时。我们需要该队列的同步机制。

    我看到下一个工作方式:

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

    1. 目前正在更新的报告有客户端读者

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

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

    2. 没有读者

      2.1。将信息添加到主要商店块读者的已修改报告

    3. 如果您的实时系统真的是实时的(适用于实时处理器)并且每次都要编写,那么您应该添加时间来合并两个商店并停止读者。

答案 1 :(得分:0)

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

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