知识卡片

单线程加异步模型:用架构简化换取团队实际可维护性

普通读书笔记卡

内容

系统的抓取系统(Crawler)采用单进程单线程异步多工的方式,而不是常见的多线程并发模型,部署层面靠多进程来获得并行能力。作者是从Windows多线程开发转到Linux开发的,结合多年经验给出的判断是:一旦程序陷入多线程模型,程序员很容易从关注业务逻辑滑向持续跟多线程本身的并发问题(竞态、死锁、共享状态同步等)斗争,尤其是当团队里不少人对操作系统底层原理掌握得并不扎实时,多线程带来的隐性复杂度会持续拖慢开发和排障效率。单线程加异步的模型虽然在理论峰值并发能力上可能不如精心调优的多线程方案,但换来的是模型简单、类库好写、数据读写容易管理、不容易出错、出错后也好排查定位——这是一种主动用”架构层面的简化”去换取”团队实际可维护性和排障效率”的取舍,在团队整体并发编程功底有限、又需要长期稳定维护一套系统的场景下,这种取舍往往比追求理论上更高的并发上限更划算。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.12 基于Xapian的垂直搜索引擎的构建分析"节,"6.12.5 疑问与解惑"(源文件:_epub-src/OEBPS/Text/Chapter6_12_6.xhtml) - 结论依据:原文说明"我想说的是一个进程只有一个线程,部署其实是多进程的。我是Windows程序员出身,写了6年多的Windows程序,写过很多多线程的程序。我发现一旦陷入到多线程,程序员就不再关心业务,开始跟多线程斗争……所以9年前我转到Linux之后,程序全部采用单线程+异步的模型。单线程模型简单,类库好写,数据读写易管理,不易出错,出错后也好排查",直接支撑本卡片结论。 - 原始内容:我发现一旦陷入到多线程,程序员就不再关心业务,开始跟多线程斗争(很多人对于操作系统的一些原理没学好)。所以9年前我转到Linux之后,程序全部采用单线程+异步的模型。单线程模型简单,类库好写,数据读写易管理,不易出错,出错后也好排查。