2017 年总结 - 写在转职后的一个月

一直以来都很少写这些比较软性的文章,一方面觉得没有太多可以写的事情,另一方面觉得写这种博客对读者来说没有太大的价值,不过作者在今天还是想对过去的 2017 年进行简单的总结,让自己更加清楚这一年有哪些的变化。在今年年初的时候曾经定下了两个非常简单的计划:看 30 本书、完成 20 篇博客;前者是一个输入的过程,后者是输出的过程,而这种可以量化的指标比较容易记录,对于完成与否也有一个确切的答案。 »

分布式一致性与共识算法

这篇文章主要会介绍比特币(Bitcoin)、以太坊(Ethereum)和 EOS 作为一个分布式网络是如何达到分布式一致性的,文章中会从 CAP 理论、拜占庭将军问题以及 FLP 开始介绍分布式一致性相关概念,随后介绍传统分布式系统中的共识算法 Paxos 和 Raft 以及区块链网络中使用工作量证明(POW, Proof-of-Work)、权益证明(POS, Proof-of-Stake)以及委托权益证明(DPOS, Delegated Proof-of-Stake)几种共识算法的原理。 »

谈元编程与表达能力

在这篇文章中,作者会介绍不同的编程语言如何增强自身的表达能力,也就是不同的元编程能力,包括宏和运行时两种实现元编程的方法,文章不仅会介绍 C、Elixir 和 Rust 语言中的宏系统的优劣以及特性,还会介绍 Objective-C 和 Ruby 的面向对象模型以及它们在运行期间修改对象行为的原理。 »

Docker 核心技术与实现原理

提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的生产环境中大规模使用,也不再是一个只能在开发阶段使用的玩具了。文章中会介绍 Docker 中的三大核心技术:Linux 命名空间(namespaces)、Control Groups 控制组(CGroups)和 UnionFS,除此之外文中也会通过源代码介绍 Docker 的实现原理。 »

Ruby Web 服务器的并发模型与性能

这是整个 Rack 系列文章的最后一篇了,在之前其实也尝试写过很多系列文章,但是到最后都因为各种原因放弃了,最近由于自己对 Ruby 的 webserver 非常感兴趣,所以看了下社区中常见 webserver 的实现原理,包括 WEBrick、Thin、Unicorn 和 Puma,虽然在 Ruby 社区中也有一些其他的 webserver 有着比较优异的性能,但是在这有限的文章中也没有办法全都介绍一遍。 »

浅谈 Puma 的并发模型与实现

在前面的文章中我们见到了多线程模型、多进程模型以及事件驱动的 I/O 模型,对于几种常见的 webserver 已经很了解了,其实无论是 Ruby 还是其他社区对于 webserver 的实现也就是这么几种方式:多线程、多线程和 Reactor。这篇文章中要介绍的 Puma 只是混合了两种 I/O 模型,同时使用多进程和多线程来提高应用的并行能力。 »

浅谈 Unicorn 的多进程模型

作为 Ruby 社区中老牌的 webserver,在今天也有很多开发者在生产环境使用 Unicorn 处理客户端的发出去的 HTTP 请求,与 WEBrick 和 Thin 不同,Unicorn 使用了完全不同的模型,提供了多进程模型批量处理来自客户端的请求。Unicorn 为 Rails 应用提供并发的方式是使用 fork 创建多个 worker 线程,监听同一个 Socket 上的输入。 »

浅谈 WEBrick 的多线程模型

这篇文章会介绍在开发环境中最常用的应用容器 WEBrick 的实现原理,除了通过源代码分析之外,我们也会介绍它的 IO 模型以及一些特点。在 GitHub 上,WEBrick 从 2003 年的六月份就开始开发了,有着十几年历史的 WEBrick 的实现非常简单,总共只有 4000 多行的代码。 »

谈谈 Rack 的协议与实现

作为 Rails 开发者,基本上每天都与 Rails 的各种 API 以及数据库打交道,Rails 的世界虽然非常简洁,不过其内部的实现还是很复杂的,很多刚刚接触 Rails 的开发者可能都不知道 Rails 其实就是一个 Rack 应用,在这一系列的文章中,我们会分别介绍 Rack 以及一些常见的遵循 Rack 协议的 webserver 的实现原理。不只是 Rails,几乎所有的 Ruby 的 Web 框架都是一个 Rack 的应用,除了 Web 框架之外,Rack 也支持相当多的 Web 服务器,可以说 Ruby 世界几乎一切与 Web 相关的服务都与 Rack 有关。 »

自动初始化 Gitalk 和 Gitment 评论

昨天将博客的评论迁移到了 Gitalk,最开始选择了使用 Gitment 作为评论系统,但是由于其开发者很久没有维护、代码七个月也没有更新,所以就选择了有更多人维护的 Gitalk 作为目前博客的评论系统。无论是 Gitalk 还是 Gitment 都只能手动初始化所有文章的评论或者一个一个点开界面,作者觉得这件事情非常麻烦,所以手动抓了一下 Gitalk 和 Gitment 在初始化评论时发出的网络请求后写了一个用于自动化初始评论的脚本。 »

分布式键值存储 Dynamo 的实现原理

这篇文章会分析 Amazon 开发的分布式数据库 Dynamo 的实现,同时还会介绍 Dynamo 的设计理念以及架构等问题,还会就其中的部分问题与 Bigtable 中相对应的概念进行对比,这样能够让我们更加清楚地了解不同的数据库对不同问题,因设计理念的差异做出的权衡。 »

全面理解 ActiveRecord

文章分四个部分介绍了 ActiveRecord 中的重要内容,模型的创建过程、Scope 和查询的实现、模型关系的实现以及最后的 Migrations 任务的实现和执行过程,各个模块之间没有太多的关联,由于文章内容比较多,如果读者只对某一部分的内容感兴趣,可以只挑选一部分进行阅读。 »

如何从 MongoDB 迁移到 MySQL

文中会介绍作者在迁移数据库的过程中遇到的一些问题,并为各位读者提供需要停机迁移数据库的可行方案,如果需要不停机迁移数据库还是需要别的方案来解决,在这里提供的方案用于百万数据量的 MongoDB,预计的停机时间在两小时左右,如果数据量在千万级别以上,过长的停机时间可能是无法接受的,应该设计不停机的迁移方案;无论如何,作者希望这篇文章能够给想要做数据库迁移的开发者带来一些思路,少走一些坑。 »

浅谈数据库并发控制 - 锁和 MVCC

在学习几年编程之后,你会发现所有的问题都没有简单、快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制。如果数据库中的所有事务都是串行执行的,那么它非常容易成为整个应用的性能瓶颈,虽然说没法水平扩展的节点在最后都会成为瓶颈,但是串行执行事务的数据库会加速这一过程;而并发(Concurrency)使一切事情的发生都有了可能,它能够解决一定的性能问题,但是它会带来更多诡异的错误。 »