直接定义:集成(integration)指 Supabase 和外部服务之间预先做好的对接,让你不用自己写胶水就能把数据或事件流过去。比如把数据库变更发到消息队列、把认证事件同步到数据分析工具、把文件处理交给专用服务。这一节我们讲常见的集成类别、怎么用,以及何时该自己写而不是用现成集成。
下面 SVG 把"Supabase 为中心的集成星型"画出来,看清它在系统里的位置:

开启 GitHub 登录只需在 Dashboard 填 OAuth 凭据,前端调用 signInWithOAuth({ provider: 'github' }) 即可,不用自己实现 OAuth 回调。
await supabase.auth.signInWithOAuth({ provider: 'github' }) // 回调后用户入库,触发器自动建 profiles(见 3.3)
代价:依赖第三方可用性,且用户数据分布在第三方。若某登录源宕机,对应登录不可用——要有兜底(邮箱密码)别把登录源锁死。
把订单创建事件流出做异步处理(发货、通知),可用数据库函数 + Edge Function 桥接,或逻辑复制直送外部。下面用函数写一行到"出站事件"表,由外部 worker 消费:
create table public.outbox ( id bigint generated always as identity primary key, topic text, payload jsonb, sent boolean default false ); create or replace function public.emit_order_event() returns trigger language plpgsql as $$ begin insert into public.outbox(topic, payload) values ('order.created', jsonb_build_object('id', new.id, 'user', new.user_id)); return new; end; $$; create trigger trg_order_outbox after insert on public.orders for each row execute function public.emit_order_event();
这个 outbox 模式保证"写业务数据"和"发事件"在同一事务里,避免丢事件——外部 worker 再读 outbox 推给队列。
背景:产品要在用户注册后发欢迎邮件、下单相通知。团队原本打算自己搭邮件服务和推送服务。
操作过程:
auth.users 插入触发器后调用邮件服务的 API(密钥存函数环境变量,不暴露前端)。结果:没自研邮件/推送核心,只写了薄薄的胶水(函数 + 触发器),把重活交给成熟外部服务。
解读:集成的价值是"让专业服务干专业事"。Supabase 负责事务与权限中枢,邮件、推送、搜索这些它有集成或容易桥接的,交给专门服务,团队聚焦业务。
变式:若外部服务不可用,outbox 模式让事件不丢——worker 重试即可。这也是为什么不用"函数里直接调外部 API 不等确认",而是先落 outbox 再异步消费,可靠性更高。
提醒:在 Edge Function 里直接调外部 API 做关键业务(如扣费通知)却不落 outbox,一旦函数超时或外部 500,事件就丢了。关键事件先写库再异步消费,别赌网络。
建议:我们建议:凡是"发一次就好"的外部副作用,都用 outbox/队列解耦,Supabase 只管落数据和发事件,外部服务失败可重试。这样核心库不会被外部抖动拖垮。
集成不是越多越好,选错形态反而引入脆弱点。下面把四种形态适合什么、不适合什么排清楚:
| 集成形态 | 适合 | 不适合 | 可靠性关键 |
|---|---|---|---|
| 事件流出(Realtime/webhook) | 近实时下游(搜索、通知) | 必须不丢的关键账 | 配重试/落 outbox |
| 认证源(OAuth) | 第三方登录 | 强一致内部账号 | 留邮箱兜底 |
| 逻辑复制 | 分析库/数据仓库同步 | 需要复杂转换 | 订阅端处理 DDL |
| 函数代理 API | 隐藏密钥调外部 | 高吞吐计算 | 函数超时/并发限制 |
💡 关键直觉:集成的本质是"把不适合放在 Supabase 的事,交给擅长它的系统",而 Supabase 退居事件与权限中枢。判断用哪种形态,看你的下游要的是"实时性"还是"可靠性"还是"计算力"——三者指向不同形态。
背景:订单支付成功后要发短信通知,但短信网关偶发 500,导致部分用户没收到通知。
操作过程:
-- outbox 消费状态由 worker 更新,失败可重试 update public.outbox set sent = true, sent_at = now() where id = $1; -- worker 只取 sent = false 且重试次数 < 5 的行
结果:偶发外部故障不再造成永久丢失,系统具备自愈能力。
解读:和外部服务的交互永远假设"它会挂"。落 outbox + 重试,是把"尽力而为"变成"最终送达"的标准做法。Supabase 本身不替你保证外部可达,但 outbox 模式给你一个可靠的缓冲层。
⚠️ 常见坑:有人给 webhook 配了无限重试却不设上限,结果外部服务长期故障期间,积压事件把数据库撑爆。重试必须带上限和告警——超过阈值就转人工/死信队列,而不是无脑一直重试。
第五章把生态讲完。第六章落到真实行业:MVP、实时协作、数据分析、移动后端、游戏、以及几个成功案例,看前面学的东西怎么在真实产品里组装。