【问题标题】:RavenDB: The best way to wait for non-stale index first then query stale index if timeoutRavenDB:首先等待非陈旧索引然后在超时时查询陈旧索引的最佳方法
【发布时间】:2013-12-06 05:49:43
【问题描述】:

我正在使用 Ravendb 2.5。我有一种情况,我需要先等待非陈旧索引,如果它在 15 秒后超时,则查询陈旧索引而不是抛出超时异常。这是我的代码。

RavenQueryStatistics stats;
var result = queryable.Statistics(out stats).Take(maxPageSize).ToList();
if (stats.IsStale)
{
    try
    {
        return queryable.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite(TimeSpan.FromSeconds(15))).ToList();
    }
    catch (Exception)
    {
        return result;
    }
}
else
{
    return result;
}

我需要添加扩展方法以使上述代码适用于所有查询,例如: public static List ToList(this IRavenQueryable queryable)

我可能还需要添加扩展方法来覆盖:.All()、.Any()、.Contains()、.Count()、.ToList()、.ToArray()、.ToDictionary()、.First ()、.FirstOrDefault()、.Single()、.SingleOrDefault()、.Last()、.LastOrDefault() 等

我想知道是否还有其他更好的解决方案。最佳做法是什么?

ravendb 是否有一个 AOP 切点,当超时异常抛出时,我们可以做一些事情来改变查询的稳定索引并返回陈旧的结果?

【问题讨论】:

    标签: indexing ravendb


    【解决方案1】:

    根据您的要求,我希望将其作为来自最终用户客户端的两个单独调用。首先发出查询而不等待非陈旧结果,立即向最终用户显示查询结果。如果结果是陈旧的,那么让最终用户可以看到它,然后对等待非陈旧结果的服务器进行第二次查询。

    这样,最终用户总是可以快速看到一些东西,而不必等待可能的 15 秒,即使是陈旧的结果。

    【讨论】:

      【解决方案2】:

      您可以强制文档存储始终等待最后一次写入,然后您可以使用没有自定义指令的查询

      documentStore.Conventions.DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites;
      

      注意:如果索引很忙或者你写了一些东西到数据库并立即查询相关数据,使用异步而不是超时会更好。

      //deal with very busy index
      using (var session = documentStore.OpenAsyncSession())
      {      
           var result = await session.Query<...>()
                         .Where(x => ...)
                         .ToListAsync();
      }
      //write then read
      using (var session = documentStore.OpenAsyncSession())
      {    
           await session.StoreAsync(entity);
           await session.SaveChangesAsync();  
           //query relative data of entity
           var result = await session.Query<...>()
                         .Where(x => ...)
                         .ToListAsync();
      }
      

      【讨论】:

      • 我之前用过ConsistencyOptions.QueryYourWrites,它有性能问题,15秒后返回超时异常,所以我想用更好的方法。这就是为什么我使用新的查询解决方案,我首先等待非陈旧索引,如果在 15 秒后超时,则查询陈旧索引而不是抛出超时异常。
      猜你喜欢
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 2021-05-10
      相关资源
      最近更新 更多