-
无为与 DDD:让模型顺着业务的纹理生长
“道常无为而无不为。”——《老子》第三十七章引言青岛崂山太清宫相传始建于西汉,已有两千余年历史。太清宫后山的老君峰下,有一尊高达 50 米的老子铜像。铜像中的老子一手指天、一手指地,仿佛在提示天地之间的幽微秩序。老子被尊为道家的奠基者;以其名义流传的《老子》一书,又被广泛称为《道德经》,是道家的重要经典。“无为”,正是其中最有代表性的思想之一。把“无为”和 DDD 放在一起谈,乍看像一种跨界类比:一个来自两千多年前的思想传统,一个来自现代软件设计实践。前者谈治身、治国、处世,后者谈领域...
-
How it works - Kafka
Kafka 经常被放在“消息中间件”这个大类里,但它和 RabbitMQ、ActiveMQ 这类传统消息中间件的出发点并不一样。Kafka 的核心抽象不是“队列中有一批待处理消息,消费者处理完就删除”,而是“一个可持久化、可分区、可复制、可按 offset 反复读取的追加日志”。生产者把事件追加到日志末尾,消费者自己记录读到了哪里;事件是否被某个消费者读过,并不决定它是否从 Kafka 删除。删除由保留策略决定。这个差异不只是实现细节,而是一套完全不同的哲学:传统队列更像任务分发系统,Ka...
-
How it works - 消息中间件
消息中间件最容易被低估。刚开始看,它只是一个“临时存消息的队列”;真正放到分布式系统里,它解决的是服务之间如何异步协作、如何削峰填谷、如何把失败隔离在局部、如何让多个下游系统在不互相阻塞的情况下消费同一份业务事实。但消息中间件也最容易被滥用。它不是分布式事务的万能补丁,也不是把同步调用换成异步调用就自动变可靠。消息一旦离开生产者,系统里就会出现新的问题:消息会不会丢、会不会重复、顺序如何保证、失败如何重试、堆积如何处理、消费者变慢会不会拖垮 broker、跨机房复制和网络分区时应该牺牲什么...
-
How it works - Elasticsearch
Elasticsearch 是什么Elasticsearch 是一个分布式搜索和分析引擎。很多人第一次接触它,是因为 ELK 日志系统:应用把日志写入 Elasticsearch,然后用 Kibana 查询和分析。但 Elasticsearch 并不只是一个日志库,它更准确的定位是:把文档数据组织成适合搜索、过滤、排序和聚合的数据结构,并把这些结构分布到多台机器上。虽然 Elasticsearch 也可以被看作一种数据库,但它并不适合作为通用数据库来使用。它的核心能力来自面向搜索和分析设计...
-
在 Python 中使用 StateMachine
在软件开发过程中,大量的工作集中于管理和处理事物状态。通常,一个事物会因为某个事件从一个状态向另一个状态转变。例如,在游戏中,怪物可能会因为听到玩家的声音而进入警觉状态,然后在看到玩家时发动攻击。在交战过程中,它根据玩家的位置和状态使用不同的技能。在业务系统中,订单可能存在诸如新建、待付款、已发货、已完成等各种业务状态,而各种业务操作则推动订单状态的持续变化。在涉及复杂状态场景的情况下,如果不能有效地设计模型,就可能产生大量重复代码,并可能导致Bug。为了解决这类问题,我们经常采用状态机来...
-
我们需要多少测试人员
在工作中,我们经常会遇到这样的情况:甲方希望开发一个简单的小程序。不同乙方公司的报价却存在显著差异,比如有的公司将测试工时占到一半,而有的公司几乎不包含测试工时。同样的项目,为什么各公司的报价能相差如此之大呢?测试工时少了,能否保证质量?测试工时多了,就一定能保证质量吗?实际上,对于一个项目需要多少测试人员,并没有一个固定的标准答案。对于业务逻辑简单、规模较小的项目,可能并不需要专职的测试人员。而对于规模较大,尤其是涉及多个团队共同协作的项目,专职的测试人员是必不可少的,有时甚至需要一个专...
-
不可不知的 NUMA 架构
随着虚拟化和容器技术的广泛应用,服务器的配置水平不断提升。如今,一台服务器的内存动辄数百GB,CPU核心数量达到上百也屡见不鲜。过去需要一个机柜才能容纳的服务器,现在可能只需一台就能满足需求。这种多CPU、多任务并行运行的模式,给服务器的架构设计带来了巨大的挑战,于是NUMA(非统一内存访问)架构应运而生。NUMA架构能够显著提升多任务处理的性能。目前,绝大多数服务器都支持NUMA架构。然而,要想充分发挥NUMA架构的优势,如何高效地使用内存至关重要。正确配置和优化内存使用策略,可以极大地...
-
大教堂与市集
在软件工程历史上,Eric S. Raymond 于 1997 年发表的文章《The Cathedral and the Bazaar》(大教堂与市集)是一篇具有里程碑意义的重要文献。文章用“大教堂”和“市集”类比了“自上而下”和“自下而上”两种软件开发方法,深入探讨了软件开发过程中的不同方法论及其影响。这篇文章不仅对开源社区产生了深远影响,还为现代软件开发人员提供了宝贵的经验教训。大教堂与市集大教堂模式的特点是源代码在软件发行后公开,在软件的每个版本开发过程中由一个专属的团队控管。作者以...