可靠分布式系统基础 Paxos 的直观解释

Paxos 已经逐渐被承认是分布式系统中不可缺少的核心算法, 越来越多的分布式系统都是以paxos或其变种来达到强一致性的.

本文是一篇paxos入门教程, 从基本的分布式中的问题: 主从复制,quorum-rw等算法出发, 通过逐步解决和完善这几个问题, 最后推导出paxos的算法.

本文分为2个部分:

  • 前1部分是分布式一致性问题的讨论和解决方案的逐步完善, 用比较通俗的语言得出paxos算法的过程. 如果你只希望理解paxos而不打算花太多时间深入细节, 只阅读这1部分就可以啦.

  • 第2部分是paxos算法和协议的严格描述. 这部分可以作为paxos原paper的实现部分的概括. 如果你打算实现自己的paxos或类似协议, 需要仔细了解协议细节, 希望这部分内容可以帮你节省阅读原paper的时间.

continue reading>>

socket关闭: close()和shutdown()的差异

对于一个tcp连接,在c语言里一般有2种方法可以将其关闭:

close(sock_fd);

或者

shutdown(sock_fd, ...);
continue reading>>

随手改变世界之 git-auto-squash

使用git的同学是不是经常纠结于在开发过程中是应该频繁提交, 还是仔细构造提交点之后再提交?

  • 前者可以让开发更流畅,不必打断思路,但会造成提交历史无法浏览;
  • 后者可以构造漂亮易懂的提交历史,但码码时停下来考虑commit message 怎么造句是不是太影响情绪了。

一般的做法是先做很多小的fixup,之后再将fixup合并到一起。

这个工具 git-auto-squash 可以将提交历史中连续的fixup 合并到它之前最早的1个正式提交点上,类似不需要交互的rebase --interactive

continue reading>>

Numbers Programmers Should Know About Hash

There is a hash table:

  • It has b buckets.
  • It has n keys stored in it.
  • We assume that the hash function distributes keys uniformly.
  • A bucket can contain more than 1 keys.

If n \(\approx\) b, the hash table would look like this:

  • 37% buckets are empty.
  • 37% buckets contain 1 key.
  • 26% buckets contain more than 1 key, which means collision occurs.

The following chart created by program simulation shows distribution of 20 keys over 20 buckets.

continue reading>>

Vim-tabbar: Simple, stupid and fast tab-bar for VIM

Simple, stupid and fast tab-bar for VIM.

continue reading>>

1% 慢请求优化

1个客户端同时向服务器发出100个请求,等待所有的请求都返回才算成功。
99%的请求10ms返回,1%的请求1000ms返回.

假设慢请求的概率是 \(p = 0.01\) ,请求总数是 \(n = 100\). 能快速(10ms)返回的概率有多少?如何优化?

continue reading>>

Some useful resources

Google HTML CSS 代码风格指南

A Note About Git Commit Messages

Google’s Python Class

continue reading>>

jobq.py -- Queue processing engine

jobq.py processes serial of input elements with several functions concurrently and sequentially.

Check out on github: jobq.

Example:

import jobq

def add1( args ):
    return args + 1

def multi2( args ):
    return args * 2

def printarg( args ):
    print args

jobq.run( [ 0, 1, 2 ], [ add1, printarg ] )
# > 1
# > 2
# > 3

jobq.run( ( 0, 1, 2 ), [ add1, multi2, printarg ] )
# > 2
# > 4
# > 6
continue reading>>