LawrencePeng's Blog

专注收集代码小精灵

单实例比redis吞吐大12倍,Anna用了什么黑科技?

为什么Redis快?

要说明为什么redis快的话,至少要一篇中篇文章的长度了。我们长话短说:

  1. 内核操作,IO关键路径少。
  2. 非阻塞网络模型
  3. 良好的CodeBase

为什么Redis不够快?

就一个线程,还想怎样?

为什么Redis不是多线程架构呢?

因为共享内存架构,多线程就得要锁、抢占吧。

Anna的利器-Actor模型

Actor模型意味着每个Actor之间不共享内存,发消息来同步。

没有共享内存了,自然就没有锁了。

我们自然就进入了Wait-Free世界。

每个核心pin一个CPU,自然没有抢占了。

然后Actor模型要做真同步的代价太大,所以我们的Anna不是强一致性的,实际上,很多时候,我们也不需要强一致性。

Anna的尖刀-CRDT

和直接一个hashmap相比,Anna选择的是实现一个CRDT-Map。为什么要这样呢?

Anna采用Multi-Master架构,每个Master都可能受到一些写操作,在一个epoch结束时,个个Master需要互相交换更新。如果不使用CRDT,一个简单的做法就是将所有的写操作记录在Log中,发Log给所有其他Master。这样的问题就在于如果操作过多,消息传递、Apply的时间就不会少,而且顺序也变的重要了起来,很难最后收敛到一致。所以使用CRDT,收敛就不是问题了。每个Epoch结束Master只需要把自己的状态发给其他Master即可,CRDT能保证无论状态收到的顺序如何,最后都能收敛。问题解决。

Anna的语法糖-预定义的冲突解决器

用了CRDT很麻烦的时候就是并发操作的时候需要自己写冲突解决器。Riak就是这样的设计,用Cassandra的LWW肯定问题多多,那么Anna怎么做的呢?要实现xxx-consistency怎么做呢?Anna的作者帮你解决了常见的consistentcy的代码编写,实际上得益于CRDT优秀的模块化能力,更改的代码很少超过50行。用的开心。

到18年了,什么变了?

很开心看到Actor模式的部分推广。Erlang、Akka的思想是从本质上思考软件本身。