1

我目前正在为我的 Go Actor 库实现 EventSourcing。我现在遇到的问题是,当参与者重新启动并需要从事件日志中重放它的所有状态时,查询可能会返回不一致的数据。我知道我可以使用MutationToken

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

这样,最后一个事件的突变标记就足以为特定参与者一致地获取所有数据。

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

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

我在这里有什么选择?

4

1 回答 1

1

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

这里的关键是,给定一个MutationToken,您可以将其他人添加到其中。我没有直接看到这样做的方法,但由于在内部它只是一张地图,它应该相对简单,我相信我们(Couchbase)会为此做出贡献。在最低级别,它只是在发出查询时提供给查询的 vbucket 序列的映射。

于 2016-10-04T01:47:27.973 回答