PostgreSQL就能搞定了
当我开始我的第二个SaaS产品UserJot时,我决定把整个技术层都尽量简化。
我第一个推出的SaaS产品,LogSnag 是一个基于复杂基础设施的分析工具:Redis、Postgres、ClickHouse、Amazon SQS 等。这种复杂性很好地满足了 LogSnag 的要求。但对于 UserJot,一个用户反馈平台,我挑战自己走向完全相反的方向:将简洁性放在第一位。
我能不能只用Postgres来跑一个完整的、生产就绪的SaaS应用?
答案竟然是响亮的 肯定。
……
复杂性在早期也不是你的好帮手早期的产品很少会因为扩展性问题而夭折。它们往往因为过早地增加了复杂性而未能找到合适的市场,从而受挫。你添加的每个外部服务——如 Redis、BullMQ、Pinecone、SQS——都会增加复杂性,带来维护难度,并且可能成为故障点。
使用UserJot时,我主要遵循了基本原则。
别去管那些你根本不存在的麻烦。
没想到单靠Postgres就搞定了我所有的数据相关挑战。
……
用 Postgres 作为任务队列事件驱动架构真是好用。副作用被很好地隔离,核心逻辑保持清晰。传统上,要实现这一点通常需要使用 Redis 和 BullMQ 或类似的服务。
不过还有一种更简单的方法:
请输入 pg-boss
命令
pg-boss 是一个轻量级的基于 PostgreSQL 的作业队列,使用 SELECT FOR UPDATE SKIP LOCKED
。它提供了可靠的作业调度、重试、延迟作业以及并发处理功能——无需依赖外部组件。我在此文详细介绍了它。这里。
这就意味着:
- 无需使用 Redis。
- 更少的活动组件。
- 调试简单。
如果访问量突然大幅增加呢?你总可以在以后遇到这个问题时再加回去 Redis。
这里省略了内容。
Postgres 中的向量搜索 (告别 Pinecone)UserJot 包含多个依赖向量搜索的功能,比如 Pinecone 或 Weaviate 这样的专用向量搜索工具。通常会用到这些工具。
相反,我使用了pgvector,这是一个PostgreSQL扩展,可以直接在你的数据库内部实现原生向量检索功能。这让你可以无缝地存储嵌入并进行向量检索。
SELECT id, 题名
FROM 提交记录
WHERE project_id = 'xyz'
ORDER BY embedding <-> $1
LIMIT 5;
切换到全屏模式,退出全屏
以下是好处:
- 单一事实来源:数据保持一致。
- 轻松连接和过滤: 轻松地将向量相似度查询与标准SQL查询结合起来。
- 简化了基础设施: 无需额外的数据同步或双重写入操作。
再说一次,如果规模要求这样做,迁移到专用的向量数据库是简单明了的——不过对于大多数 SaaS 企业来说,这通常是不必要的。如果您想了解更多关于 Postgres 中向量搜索的信息,我在这里详细介绍了:这里。
……
Postgres 作为键值存储的数据库需要用于临时令牌、功能开关等的键值存储系统吗?
一般你会用 Redis,比如。还有 Postgres 也能搞定。
CREATE TABLE kv_store (
key TEXT PRIMARY KEY,
value TEXT,
expires_at TIMESTAMP WITH TIME ZONE
);
SELECT * FROM kv_store
WHERE key = 'feature_flag'
AND (expires_at IS NULL OR expires_at > NOW());
全屏模式(退出)
Postgres 轻松搞定,还有,额外的好处。
- 持久数据存储
- 简单的迁移过程和模式演进能力
- 强大的查询功能
对于大多数小型独立或较小规模的 SaaS 产品(这里的“较小”是指比 Netflix 规模小的产品),Postgres 完全足够使用。
待补充文本
但它真的能扩展吗?当然。
Postgres 在垂直扩展方面表现非常好。处理数百万行、每秒数千次查询以及复杂的查询任务变得轻而易举。现代 Postgres 提供了高级索引、缓存、分区以及优化策略,以满足高性能的需求。
当我提到“小产品”足够时,我指的是相对于大型科技巨头来说小的产品。实际上,几乎所有的SaaS业务——包括那些非常成功的独立产品——永远不会把Postgres用到极致。
而且如果你足够幸运地达到了那个尺度,恭喜!你可以轻松地拆分出来那些需要专用基础设施的零件。
Jot用户完全基于Postgres
如今,UserJot 后端完全运行在 PostgreSQL 上。
- 核心关系型数据
- 任务队列(pg-boss)
- AI嵌入存储及向量搜索(pgvector)
- 键值数据存储系统
- 事件驱动的触发器副作用
这只是冰山一角。Postgres 还有很多其他功能和扩展,可以用于各种不同的应用场景。
最后的感想
你的基础建设应该反映你实际遇到的问题,而不是假设未来的问题。
早些选择简单就是说:
- 简化了基础设施,降低了成本
- 加快了开发周期
- 更容易进行调试和维护
- 拥有基础设施
- 更方便搭建本地开发环境
- 更容易扩展
复杂性最终总会找上你,但一旦失去简单,它就不会轻易回来。
Postgres不仅仅局限于一个数据库——它是构建出色产品的理想之选,能够快速且有效地构建。
如果你正在构建或考虑围绕Postgres构建一个简化的技术栈,我很想听听你的经历!如果你正在寻找一个客户反馈平台,我也很好奇你对UserJot的看法。
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)