【问题标题】:RavenDB and stale indexes on application startupRavenDB 和应用程序启动时的陈旧索引
【发布时间】:2013-06-20 20:09:12
【问题描述】:

我有一个应用程序:

  • 使用嵌入式 RavenDB 数据库
  • 使用单调读取选项
  • 使用静态索引

我注意到,当应用程序启动时,索引都暂时过时,即使它们在应用程序关闭(干净地)上一次运行时没有过时。

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

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

我的问题是:

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

【问题讨论】:

  • 哪个版本的 raven?
  • @ThomasJames 2.5.2621
  • 你在内存中运行吗?那些是临时索引吗?
  • 不在内存中,静态索引
  • 不,除了内置的,没有捆绑包。

标签: ravendb eventual-consistency


【解决方案1】:

回答你的问题,

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

不,据我了解,您的假设是正确的,您可能会看到陈旧的结果,但不应看到 less 陈旧的结果,除非索引是在 T & T+1 和你在索引重置后点击它。

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

我知道的唯一方法是非常确定索引已完全关闭。索引文件夹中通常会保留锁定文件,指示是否不是这种情况。 Raven 的调试级别日志将指示是否也启动了重建。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多