Raft 是一种分布式共识算法,用于解决在异步通信网络中存在节点失效且本地存储可靠的情况下多个分布式节点达成一致的问题。在已经提出 Paxos 算法用于解决这一问题的情况下继续提出 Raft 算法,主要是为了解决 Paxos 理解困难的问题。Paxos 算法更偏向于理论研究,对于实现的很多细节虽然略有提及,但是并没有进行深入的讲解和讨论,因此对于算法的实现和优化而言还有很多困难。

Paxos 是一种分布式共识算法,用于解决在异步通信网络中存在节点失效且本地存储可靠的情况下多个分布式节点达成一致的问题。文中的算法只解决了决议一条法案(decree)的情况。如果需要决议多条法案,可以将该算法执行多次,每次分别对应一条法案。可以想象,有可能存在一些步骤在多次决议时无需重复执行,因此在多次决议法案的情况下,该算法可以进一步优化,但没有在本文中进行具体展开。

如题所述,该论文讲述了一种构建高可用 Key-Value 存储的方案,高可用主要是针对于写请求,存储的环境是可信环境,存储的对象的大小一般不超过 1MB。实现方法类似于 Chord + MVRs(multi-valued registers),但是另有不少针对性能的优化。Dynamo 提供 observable causal consistency。根据 论文笔记:[PODC 2015] Limitations of Highly-Available Eventually-Consistent Data Stores,这已经是这一类系统所能提供的最高一致性了。[3]

阅读全文 »

C++中的`const`是一个非常容易混淆的概念,我认为这主要是因为`const`的设计不够完善导致的,尽管目前C++11中新加入了`constexpr`关键词,解决了一部分问题,但是还有很多本质上的问题没有得到解决,甚至很多人都没有认识到这些问题的本质。我在这里解释一下我对C++中`const`的理解,并且试图分析其所解决的本质问题,对于部分问题,给出一些其他方案。

很多人都不明白,不同的编程语言具有不同的表述能力,这就是我们为什么有了汇编之后还需要更高级的编程语言。在软件规模愈发庞大的现在,C 和 C++ 语言表述能力的不足越发的明显了。我们应该尽可能的选用高级的编程语言完成我们的任务,在需要性能的地方,使用 Profiling,而不是在一开始就选用 C/C++ 这样的语言去工作。

阅读全文 »

实际使用中会有需要提前检测出是否会发生算数溢出,C# 语言中提供了 checked 关键字来解决这一问题,C/C++ 语言又该怎样做呢?本文从汇编语句的层面,对几种检查加法溢出的方法进行了比较和分析。受实验环境和个人知识所限,本文的应用范围仅限于 X86-64 体系结构。

阅读全文 »

现在一谈到补码,很多人都会立刻说补码就是反码加一,虽然没说错,但是却没说到点子上。我更希望能够听到有人说补码就是负数对应原码的表示方式。这篇文章主要论述补码的本质,以及有符号整数二进制表示的原因。

阅读全文 »

在面试中经常考到,实际项目中也经常需要面临这样一个问题,即如何判断一个整数操作是否发生了溢出。C# 语言提供了 checked 关键字用于处理这一问题,在 C 语言中我们可以使用内嵌汇编语句来检查溢出。

阅读全文 »
0%