木之陽兮 卿云烂兮

0%

DAG与拓扑排序的应用

在普通的程序设计中,当一个或一批事件完成时触发下一个或下一批事件的开始,通常我们会设计一个“围栏”,使用观察者模式或监听器模式对事件进行回调、观察并控制围栏的开关(比如java中用到的CountDownLatch),当事件越来越多、触发条件越来越复杂的时候,这种模式就愈发显得力有不逮,特别是在并发控制的表现中。

Read more »

TL;DR

简单记录一下实践过程,并结合对etcd/raft源码的阅读,总结一下自己的缺陷以及etcd中可借鉴的思想。本文没有介绍raft算法如何实现,关于raft算法的介绍可直接参考以下文档:

  1. 《The Raft Consensus Algorithm》
  2. 《In Search of an Understandable Consensus Algorithm》
  3. 《Raft一致性算法论文:探索一种易理解的一致性算法 中文译文》
  4. 《CoreOS 实战:剖析 etcd》
  5. 《etcd/raft design》
Read more »

进制 表示 高位 低位
十进制 4660 4 0
十六进制 0x1234 12 34
二进制 0001001000110100 0001 0100

现代的阅读/书写习惯大都是从左向右,这是大端 (Big-endian):

在低地址中存高位内容

0x001 0x002
00010010 00110100

机器中以二进制存储数数据,从低位到高位处理,这是小端 (Little-endian):

在低地址中存低位内容

0x001 0x002
00110100 00010010
Read more »

Initially, we spoke about an “index” being similar to a “database” in an SQL database, and a “type” being equivalent to a “table”. This was a bad analogy that led to incorrect assumptions. [ref]

本文参考《Elasticsearch权威指南》

基础概念

Read more »

基于redis的分布式锁可以基于redis的set命令实现:

  • NX 当不存在时创建
  • EX 设置 n 秒後过期

删除操作需要借助eval命令的原子性 eval命令文档

if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) else return 0 end

通过对这段lua脚本求值,防止过期时误解锁

Read more »

Linux/MacOS中的xargs命令可以通过-P参数,利用机器的多核进行操作,堪称神器:

1
2
# 4个进程并行压缩文件夹下的所有文件
ls |xargs -I{} -P 4 gzip "{}"

当然xargs只能利用本机的资源,如果想同时利用多台计算机进行并行的操作时,就要用到 gnu/parallel了,安装paralle的方式:

  • mac brew install paralle
  • ubuntu sudo apt-get install parallel

通常地,xargsparallel的命令非常相似:

1
2
ls |xargs -I{} -P 4 gzip "{}"
ls |parallel -I{} -j4 gunzip "{}"
Read more »

ActiveMQ、RabbitMQ、Kafka等都是大家耳熟能详的消息队列,了解消息队列的原理,我们也可以尝试构建一个自己的消息队列。

从消息队列的功能上思考 - 生产者创建一条消息流,通过http或tcp协议传输到消息队列中;消息队列对数据流进行处理,在适当的时机发送给合适的消费者;消费者接收处理消息后,将处理结果反馈给消息队列服务。简而言之,消息队列作为中间人,为生产者和消费者架起数据流传输的桥梁,使生产者和消费者之间无需关注自己在和谁交换数据,整个过程都是异步的。

Read more »

南昌 -> 西宁 - 丽江 - 玉龙雪山 - 泸沽湖 - 大理 - 西双版纳 -> 南昌,我们五人13天,从西北到西南,
从青藏到云贵,抓着毕业的小尾巴,必须好好浪一波~

吸氧上瘾

Read more »