大错特错! “你不需要 Kafka,用 Postgres 就够了” 错了?
我反对, 我就干过这样的事, 但是作者没有说用advisory lock, 这个才是王道啊, 别用长事务来抨击PG, 明显是设计有问题, advisory lock用法如下(参考原文):
下面看看这个作者Gunnar Morling的说法.
原文: https://www.morling.dev/blog/you-dont-need-kafka-just-use-postgres-considered-harmful/
作者:Gunnar Morling(2025 年 11 月 3 日发布)
如果你想登上 HackerNews 的头版,写一篇“Postgres 就够了”或“以你的规模不需要 Kafka”的文章几乎是万无一失的方法。这个话题总是很热门。但作者认为,所有这些文章都忽略了重点:Postgres 和 Kafka 是为截然不同的目的设计的工具。
作者认为“你不需要 Kafka,用 Postgres 就够了”这个建议弊大于利,因为它会导致系统以一种不理想的方式构建。这不是一篇“反 Postgres”的文章,而是一篇“为工作选择合适的工具”的文章。
“你不需要 Kafka,用 Postgres 就够了”这类文章通常声称 Kafka 难以运行或运行成本高昂,或者两者兼有。他们会展示如何使用 SELECT ... FOR UPDATE SKIP LOCKED 来构建 作业队列(Job Queue) 。
vacuum 进程跟不上变化速度,很快就会成为问题。Kafka 的核心特性 | Postgres 难以替代的原因 |
|---|---|
日志语义 (Log Semantics) | Kafka 是一个持久化、有序的事件日志。记录不会在处理后删除,消费者可以从特定偏移量或从头开始重放。这远超简单的队列语义,在 Postgres 上复制这一点需要大量工作。 |
容错性与高可用性 (HA) | Kafka 是集群规模的,数据复制到多个节点。Postgres 的所有写入都指向单个主节点,副本只支持读取。Postgres 主节点失败会影响所有写入者,而 Kafka 代理故障只会影响其负责的分区。Kafka 自动故障转移,Postgres 通常需要外部协调器(如 Patroni)或手动干预。 |
消费者组 (Consumer Groups) | Kafka 协议支持将消费者组织成组,从而分配读取消息的负载,并确保每条消息只被组内的一个成员处理。在 Postgres 上,你需要重新实现 Kafka 的消费者再平衡协议,这既不简单也违背了“保持简单”的初衷。 |
低延迟 (Low Latency) | Kafka 可以实现毫秒级的延迟,适用于欺诈检测或数据管道。用 Postgres 很难实现相同效果,因为它可能会因为频繁查询(轮询)而对数据库造成压力,而 LISTEN/NOTIFY 已知存在严重的锁争用问题。 |
连接器 (Connectors) | Kafka Connect 有一个庞大的连接器生态系统,可以轻松地将数据从几乎所有数据源(Source)导入 Kafka,再输出到各种数据汇(Sink)。Postgres 缺乏这样的生态系统,这意味着你必须为所有想要集成的系统定制开发连接器。 |
客户端、模式和开发者体验 | Kafka 及其生态系统提供经过实战检验的客户端和工具,支持消费者组、指标监控、序列化/反序列化、模式管理和 DLQ(死信队列)等功能。在 Postgres 上,你需要花费大量时间重新创建所有这些功能,这本质上是在重建 Kafka 的大部分功能。 |
最后,作者总结道:如果你想有效地解决实际问题,请确保了解工具的最佳适用范围和局限性,并为工作选择正确的工具。