技术栈中间件堆叠累人,Postgres一招全搞定,靠谱吗。

现在做后端开发真的越来越复杂了,动不动就得上Redis、MongoDB、Elasticsearch、Kafka,一套下来光运维就能把人折腾疯。我最近在琢磨,能不能用Postgres一个数据库把这些活全干了,毕竟它已经二十多年了,该有的功能其实都有。

先说缓存这一块,很多人用Redis存热点数据,但Postgres有UNLOGGED表,写入时不写WAL日志,速度很快。再配合pg_cron定期清理过期数据,或者用触发器自动删除,完全能当缓存用。而且你不用再维护一个Redis集群,少一个组件就少一份麻烦。

打开网易新闻 查看精彩图片

消息队列也一样,很多人用RabbitMQ或Kafka。其实Postgres的SELECT ... FOR UPDATE SKIP LOCKED就能实现任务队列,多个worker抢任务时不会锁死,比Redis的BRPOP更可靠。你还可以用LISTEN/NOTIFY做实时通知,跟数据库事务保持一致性,不用额外搞一套消息中间件

再说文档数据库,很多人用MongoDB存JSON。Postgres的JSONB类型支持索引,可以用GIN索引加速查询,而且SQL语法比MongoDB的聚合框架更直观。比如要查某个字段包含特定值,用@>操作符就行,还能跟其他表做JOIN,事务支持也更完善。对于中小型应用,完全够用。

打开网易新闻 查看精彩图片

全文搜索这块,很多人觉得必须上Elasticsearch。其实Postgres内置了tsvector和tsquery,配合GIN索引可以实现分词、排名、高亮。虽然不支持亿级规模的分布式搜索,但公司内部文章搜索、商品搜索完全没问题。如果觉得不够,还能装pg_trgm做模糊匹配,或者pg_bigm支持中文分词。

时间序列数据可以用TimescaleDB扩展,它是Postgres的一个插件,提供了超表、自动分区、连续聚合等功能,能替代InfluxDB。分析查询加速有pg_analytics,它用上了Parquet列式存储和Apache Arrow,速度接近专用分析数据库。地理空间有PostGIS,比MongoDB的地理查询强多了。

打开网易新闻 查看精彩图片

那怎么开始迁移呢?别一下子全换,先挑非核心服务试水,比如把缓存从Redis换成UNLOGGED表,把简单任务队列换成SKIP LOCKED。跑通了再替换文档存储和搜索。性能调优主要调shared_buffers、work_mem这些参数,监控pg_stat_activity和WAL大小。高可用用流复制加Patroni,连接池用PgBouncer,定期做VACUUM。

不过也不是所有场景都适合。如果每秒需要百万级写入,Postgres单实例扛不住,得考虑分片或分布式数据库。复杂流处理比如Kafka Streams,Postgres暂时替代不了。超大规模搜索索引,Elasticsearch的分布式架构还是更有优势。另外如果团队已经深度绑定Redis或MongoDB生态,切换成本可能比收益还大。

打开网易新闻 查看精彩图片

说到底,Postgres化的核心是减少移动部件,让开发团队把精力放在业务逻辑上,而不是天天折腾中间件。对于初创公司、中小项目、运维成本敏感的组织,这招很管用。但别为了用而用,得根据实际需求、团队能力和维护成本做权衡。Postgres是个全能选手,但不是万能,在合适的地方用它,极端场景保留专业工具,这才是聪明的做法。