• 无为与 DDD:让模型顺着业务的纹理生长

    “道常无为而无不为。”——《老子》第三十七章引言青岛崂山太清宫相传始建于西汉,已有两千余年历史。太清宫后山的老君峰下,有一尊高达 50 米的老子铜像。铜像中的老子一手指天、一手指地,仿佛在提示天地之间的幽微秩序。老子被尊为道家的奠基者;以其名义流传的《老子》一书,又被广泛称为《道德经》,是道家的重要经典。“无为”,正是其中最有代表性的思想之一。把“无为”和 DDD 放在一起谈,乍看像一种跨界类比:一个来自两千多年前的思想传统,一个来自现代软件设计实践。前者谈治身、治国、处世,后者谈领域...

  • 从 MyBatis 到 JPA/Hibernate

    在国内做 Java 开发,MyBatis 往往是我们很自然的选择。教程在讲,团队在用,接手的项目也大多如此。我也问过一些开发同事为什么不使用 Hibernate,听到最多的回答是上手难、不好用。它确实有自己的学习成本。不过,这也让我想到另一个问题:为什么显式写 SQL 对我们来说很自然,而把对象的状态交给框架管理,反而不容易理解?这可能和我们的学习路径有关。很多人从 SQL 和增删改查开始学习开发,也逐渐习惯了从数据库的角度理解需求:需要哪些表,要查询或更新哪些记录。我们熟悉了如何操作数据...

  • How it works - HDFS

    HDFS 全称 Hadoop Distributed File System,是 Apache Hadoop 项目的核心分布式存储组件。它受 2003 年 Google 发表的《The Google File System》论文启发,早期从 Nutch/Hadoop 项目演进而来。HDFS 是现代大数据处理的存储基础,为 MapReduce、Spark、Hive、Flink、HBase 等上层计算、查询和存储系统提供高吞吐、高可靠的大文件存储能力。Hadoop 是 Apache 基金会的开...

  • 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 也可以被看作一种数据库,但它并不适合作为通用数据库来使用。它的核心能力来自面向搜索和分析设计...

  • 从 MySQL 到 PostgreSQL

    过去很长一段时间,MySQL 几乎就是互联网业务的默认数据库。它好上手,生态成熟,托管服务也多;主键查询、简单事务、读写分离、分库分表这些套路,大家都熟。但这几年情况变了。越来越多的系统和团队,开始把 PostgreSQL 当成默认选择。这不是说 MySQL 不能用了,也不是 PostgreSQL 一定更快,而是大家对数据库的要求变了。为什么 PostgreSQL 越来越受欢迎Stack Overflow Developer Survey 的数据库调查中,PostgreSQL 近几年已经排...

  • 在 Python 中使用 StateMachine

    在软件开发过程中,大量的工作集中于管理和处理事物状态。通常,一个事物会因为某个事件从一个状态向另一个状态转变。例如,在游戏中,怪物可能会因为听到玩家的声音而进入警觉状态,然后在看到玩家时发动攻击。在交战过程中,它根据玩家的位置和状态使用不同的技能。在业务系统中,订单可能存在诸如新建、待付款、已发货、已完成等各种业务状态,而各种业务操作则推动订单状态的持续变化。在涉及复杂状态场景的情况下,如果不能有效地设计模型,就可能产生大量重复代码,并可能导致Bug。为了解决这类问题,我们经常采用状态机来...