Consisntent N1QL查询Couchbase GOCB sdk

时间:2016-10-02 08:54:29

标签: go couchbase gocb

我目前正在为Go Actor lib实施EventSourcing。 我现在遇到的问题是,当一个actor重新启动并需要从事件日志重放其所有状态时,查询可能会返回不一致的数据。 我知道我可以使用using System.Diagnostics; private void Cb_Checked(object sender, RoutedEventArgs e) { StackTrace trace = new StackTrace(true); StackFrame[] frames = trace.GetFrames(); foreach (StackFrame frame in frames) if (frame.GetMethod().Name == "InvokeDelegateCore") { System.Diagnostics.Debug.WriteLine("Accessed from another Thread !"); return; } }

来解决这个问题

但是,如果我这样做,我将被迫按顺序编写所有事件,即最后写入最后一个事件。

这样,最后一个事件的变异令牌就足以为特定的行为者提供一致的所有数据。

然而这很慢,按顺序写了大约10 000个事件,我的设置大约需要5秒。

如果我使用go例程编写那些10 000异步,我可以在不到一秒的时间内写出所有数据。 但是,然后写入是不确定的顺序,我可以知道我可以信任哪个变异令牌。 例如由于常规调度AFAIK,事件999之前可能会写入事件999。

我有什么选择?

1 个答案:

答案 0 :(得分:1)

从技术上讲,MutationToken和异步操作不是互斥的。它可以在不改变客户端的情况下完成(我不确定),但这里的关键是获取所有MutationToken响应,然后发出每个vbucket的所有数量最多的查询。

这里的关键是给定一个MutationToken,您可以添加其他http://ramhiser.com/2013/07/02/a-brief-look-at-mixture-discriminant-analysis/。我没有直接看到这样做的方法,但由于内部它只是一张地图,它应该相对简单,我确信我们(Couchbase)会做出贡献来做到这一点。在最低级别,它只是在发出查询时提供给查询的vbucket序列的映射。