应用程序启动时的RavenDB和陈旧索引

时间:2013-06-24 10:37:59

标签: ravendb eventual-consistency

我有一个应用程序:

  • 使用嵌入式RavenDB数据库
  • 使用Monotonic阅读选项
  • 使用静态索引

我注意到,当应用程序启动时,即使在应用程序关闭(干净地)上一次运行时不是陈旧,索引也都会暂时失效。

例如,我运行应用程序,插入10条记录,并等待索引是最新的。我查询它并查看我期望的结果。然后我关闭应用程序,再次启动它,并查询,我没有得到任何结果。一秒钟之后,索引已经更新,我现在可以得到结果。如果我重复这个,有时我会得到10个结果,有时会得到0个结果,有时会得到2个结果

我的假设是,在时间T查询索引时,我总是会在T + 1处看到“至少一致”的结果。但是如果服务器在此期间重新启动,我似乎看到了在T + 1处较少一致的结果。这不是最终的一致性,它最终不一致! :)

我的问题是:

  1. 我的假设是错误/愚蠢吗?
  2. 有没有办法防止这种情况发生?
  3. 这种行为只是一个启动的事情,还是可能随时发生?例如,我可以渲染10个结果,然后刷新0结果,然后10个结果再次刷新,因为Raven决定重新索引所有内容吗?

1 个答案:

答案 0 :(得分:1)

回答你的问题,

  

我的假设是错误/愚蠢吗?

不,我理解你的假设是正确的,你可能会看到陈旧的结果,但不应该看到较少的过时的结果,除非索引是在T& T之间从头开始重建的。 T + 1然后在重置索引后立即点击它。

  

有没有办法防止这种情况发生?

我知道的唯一方法是确保索引干净利落。索引文件夹中通常会有锁定文件,指示是否不是这种情况。来自Raven的调试级别日志将指示是否也启动了重建。

如果所有其他方法都失败了,您可能需要一个阻塞的进程,直到所有索引(或您关注的索引)都是新的,然后再继续执行应用程序的其余启动过程。

  

这种行为只是一个启动的事情,还是可能随时发生?例如,我可以渲染10个结果,然后刷新0结果,然后10个结果再次刷新,因为Raven决定重新索引所有内容吗?

是的,如果索引被重置,这是可能的,但据我所知,只有通过API或管理工作室手动触发才会发生(启动后)。