木之陽兮 卿云烂兮

0%

DAG与拓扑排序的应用

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

Read more »

最近在开发一个工具时遇到了一个根据输入参数渲染yml文件的问题:

  • 需要在yaml样板的指定的位置上填入指定的值,yml样板随时可能更新
  • 需要根据输入参数以及对应字段的生成规则动态生成对象、数组(长度不固定)、字符串等各种类型的值

这种情况下,最先想到的就是直接使用占位符或者模板语言。但是经过实践发现了两个问题:

  1. yaml文件样板更新时,必须从旧模板上的迁移占位符,增大了维护的负担(特别是生产中用到的yaml文件通常有上千行)
  2. 生成规则不固定,需要在工具中硬编码指定某些特定属性的生成规则,使业务逻辑高度耦合

所以使用占位符或者模板语言直接作用在yaml样板上思路就是错的,我们应该通过一个中间的配置来定义yml文件的生成规则,这样才能使工具和业务逻辑解耦合,并且降低维护的难度。

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 »

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 »