Prisma 服务端订阅(Server-side Subscriptions)实战指南:基于 prisma.yml 配置 Webhook 事件投递

发布时间:2026/9/24 16:16:32

Prisma 服务端订阅(Server-side Subscriptions)实战指南:基于 prisma.yml 配置 Webhook 事件投递 后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载导读服务端订阅Server-side Subscriptions是 Prisma 在 GraphQL 订阅能力之外提供的事件通知机制它复用 GraphQL 订阅的查询语法与过滤能力但通过Webhook将数据变更事件投递给外部业务系统天然适配现代 Serverless 基础设施。本文以 docs/1.3/04-Reference/04-Server_side-Subscriptions/01-Overview.md 为核心骨架结合仓库内 API 服务器、Worker 服务器与共享模型的源码实现系统讲解服务端订阅的配置方法、事件投递链路与订阅查询语法读完即可在自己的 Prisma 服务中落地数据变更 → HTTP 回调的完整方案。服务端订阅是什么服务端订阅与普通的 GraphQL 订阅见 GraphQL API 参考在能力上是等价的它们共享同一套 API例如同样支持在where中提供过滤条件从而只接收你感兴趣的事件。两者的核心差异在于投递机制delivery mechanism普通 GraphQL 订阅客户端建立持久连接WebSocketPrisma 在数据变更发生时把事件实时推送到客户端。服务端订阅当服务端订阅被配置好后Prisma 会持续监控数据变更并在匹配时执行与之关联的查询——这一点与普通 GraphQL 订阅一致——但事件的消费方不再是连接的客户端而是你配置的外部端点。从源码看服务端订阅被建模为一等公民的函数类型。在 server/shared-models/src/main/scala/com/prisma/shared/models/Functions.scala 中FunctionType枚举定义了ServerSideSubscription值对应的ServerSideSubscriptionFunction同时持有name、isActive、delivery和query四个字段其中delivery当前只有一种实现——WebhookDelivery包含url与headerscase class ServerSideSubscriptionFunction( name: String, isActive: Boolean, delivery: FunctionDelivery, query: String ) extends Function sealed trait FunctionDelivery { def typeCode: FunctionDeliveryType.Value } object FunctionDeliveryType extends Enumeration { val WebhookDelivery Value(webhook-delivery) } case class WebhookDelivery( url: String, headers: Vector[(String, String)] ) extends FunctionDelivery这印证了文档中的描述当前 Prisma 通过 Webhook 投递服务端订阅事件同时按照 01-Overview.md 的说明未来计划补充直接调用 AWS Lambda 以及不同的队列queue实现。服务端订阅正是为与现代 Serverless 基础设施协同工作而设计的你无需维护常驻的订阅连接只需暴露一个 HTTP 端点接收回调。事件投递链路从 Mutation 到 Webhook理解服务端订阅最好的方式是追踪一次数据变更如何最终变成一次 HTTP 请求。结合仓库源码完整链路如下变更进入 API 服务器客户端执行一次 GraphQL mutation例如updateUser。生成副作用动作API 服务器将 mutation 解析为内部的动作序列其中与服务端订阅相关的动作是ExecuteServerSideSubscription。在 server/servers/api/src/main/scala/com/prisma/api/mutactions/SideEffectMutactionExecutor.scala 中SideEffectMutactionExecutorImpl.execute按类型分发def execute(mutaction: SideEffectMutaction): Future[Unit] mutaction match { case mutaction: PublishSubscriptionEvent PublishSubscriptionEventExecutor.execute(mutaction, apiDependencies.sssEventsPubSub) case mutaction: ExecuteServerSideSubscription ServerSideSubscriptionExecutor.execute(mutaction) }执行订阅查询并构造 WebhookServerSideSubscriptionExecutor.deliverWebhook调用SubscriptionExecutor.execute以skipPermissionCheck true、alwaysQueryMasterDatabase true的方式执行订阅函数中配置的查询只有当返回结果包含data键即事件确实匹配了过滤条件时才构造一个Webhook并发布到webhookPublishersubscriptionResult.map { case Some(json) if json.as[JsObject].keys.contains(data) val webhook Webhook( projectId project.id, functionName function.name, requestId requestId, url webhookDelivery.url, payload json.toString, id requestId, headers webhookDelivery.headers.toMap ) apiDependencies.webhookPublisher.publish(webhook) case _ () }Worker 服务器投递投递动作最终落到 server/servers/workers/src/main/scala/com/prisma/workers/WebhookDelivererWorker.scala。该 Worker 从消息总线队列消费Webhook使用SimpleHttpClient.post以Content-Type: application/json向配置的url发送POST请求并把配置的 headers 一并带上httpClient .post(wh.url, wh.payload, ContentTypes.application/json, wh.headers.toList) .recover { ... }注意其中的注释// Current decision: Do not retry delivery, treat all return codes as work item success ( ack).——从源码看当前实现不对投递失败进行重试所有返回码都被视为工作项成功即确认消费失败仅在日志中输出。如果你在真实环境使用该版本的服务端订阅应基于这个前提设计你自己的重试与告警策略。Webhook数据结构定义在 server/servers/api/src/main/scala/com/prisma/subscriptions/Webhook.scala包含projectId、functionName、requestId、url、payload、id、headers等字段方便在消息总线中流转与追踪。在 prisma.yml 中配置服务端订阅服务端订阅通过在服务配置文件prisma.yml中添加subscriptions属性来完成配置。subscriptions是一个映射map每个键对应一个订阅函数的名称其值描述该订阅的投递方式当前为webhook与订阅查询query。完整配置示例下面是 01-Overview.md 中给出的完整示例它定义了一个名为userChangedEmail的服务端订阅当任意user节点被更新时向http://example.org/sendSlackMessage发送一个包含用户name与email的 Webhook 请求该示例的语义是用户改了邮箱后向 Slack 发送消息service: my-service stage: ${env:PRISMA_STAGE} secret: ${env:PRISMA_SECRET} cluster: ${env:PRISMA_CLUSTER} datamodel: database/datamodel.graphql subscriptions: userChangedEmail: webhook: url: http://example.org/sendSlackMessage headers: Content-Type: application/json Authorization: Bearer cha2eiheiphesash3shoofo7eceexaequeebuyaequ1reishiujuu6weisao7ohc query: | subscription { user(where: { mutation_in: [UPDATED] }) { node { name email } } }配置项说明对照上面的示例与源码模型各配置项的作用如下配置层级配置项说明subscriptions.name订阅函数名如userChangedEmail对应源码中ServerSideSubscriptionFunction.name用于在日志与投递链路中标识该函数Webhook 中的functionName字段。name.webhook.urlWebhook 目标地址数据变更匹配时Prisma 将向该 URL 发送POST请求对应WebhookDelivery.url最终出现在Webhook.url字段。name.webhook.headers自定义请求头键值对形式的 HTTP 头例如Content-Type: application/json、Authorization: Bearer token对应WebhookDelivery.headers向量化的键值对投递时原样附加到请求上。生产环境建议用环境变量注入敏感令牌而不是硬编码在配置文件中。name.query订阅查询一段 GraphQLsubscription查询决定监听哪类变更、过滤哪些节点、返回哪些字段。对应ServerSideSubscriptionFunction.query由SubscriptionExecutor.execute在每次变更时执行。prisma.yml 的全局结构与env:变量引用等细节可参考 服务配置参考 目录下的文档。订阅查询语法要点订阅查询使用标准 GraphQLsubscription语法其过滤能力与普通 GraphQL 订阅一致重点包括mutation_in指定要监听哪类变更可选值为CREATED、UPDATED、DELETED。示例中mutation_in: [UPDATED]表示只对更新事件感兴趣如需监听多种类型可写成mutation_in: [CREATED, UPDATED, DELETED]。node对变更节点自身的字段做过滤仅当节点满足条件时才触发投递。测试代码中出现了node: { status: ACTIVE }、node: { text: test }之类的用法见 EmbeddedServerSideSubscriptionSpec.scala。previousValues在node之外还可以请求变更前的字段值例如previousValues { title }便于你的回调逻辑做前后对比如检测邮箱是否真的变了。node与previousValues字段选择器在node中列出你希望随 Webhook 回调携带的字段例如name、email以及关联嵌套字段。这些过滤与字段选择能力在订阅解析器 server/servers/subscriptions/src/main/scala/com/prisma/subscriptions/resolving/SubscriptionResolver.scala 及其配套的SubscriptionsManager、DatabaseEvents等组件中实现与普通 GraphQL 订阅共用同一套解析与过滤管线因此文档中的等价于普通 GraphQL 订阅在实现层面也是成立的。触发示例一次 updateUser Mutation配置好userChangedEmail之后只要客户端执行下面这样的 mutation把某个用户的email改为新地址服务端订阅就会被触发Prisma 会执行配置中的订阅查询并把匹配结果通过 Webhook 发送到http://example.org/sendSlackMessagemutation { updateUser( data: { email: newemail.com }, where: { id: cjcgo976g5twb018740bzyy4q } ) { id } }因为订阅查询中的mutation_in: [UPDATED]只关心更新事件且该 mutation 恰好是UPDATED类型并匹配user模型所以事件会被投递若执行的是创建或删除该用户的 mutation则不会触发该订阅。测试与验证仓库中为该机制提供了完整的集成测试可作为你理解行为与自行验证的参照EmbeddedServerSideSubscriptionSpec.scala针对嵌入式类型embedded的端到端测试覆盖了mutation_in、node过滤、previousValues、嵌套字段选择以及 Webhook 发布等场景。NonEmbeddedServerSideSubscriptionSpec.scala非嵌入式模型下的对应测试。WebhookDelivererWorkerSpec.scala验证 Worker 对 Webhook 的实际 HTTP 投递行为含失败日志格式。测试通过注入的webhookPublisher见webhookTestKit testDependencies.webhookPublisher断言 Webhook 是否被正确发布这与上文投递链路中apiDependencies.webhookPublisher.publish(webhook)的实现一一对应是验证配置 → 变更 → Webhook闭环最直接的证据。适用前提与限制基于当前仓库对应 Prisma 1.x 文档体系的代码实现使用服务端订阅时有几点需要明确投递方式目前仅支持 WebhookAWS Lambda 直连与队列投递是规划中的能力见 01-Overview.md 原文当前版本请以 Webhook 为准。投递不自动重试从 WebhookDelivererWorker.scala 的注释与实现看失败投递不会重试且所有返回码都会被确认请在你的回调端点做好幂等与日志记录。订阅查询的过滤能力与普通 GraphQL 订阅一致mutation_in、node、previousValues等语法均可直接使用配置时不要忘记在query中用|块语法书写多行查询字符串。本文涉及的prisma.yml、datamodel 等概念可参见 服务配置参考 与 Prisma API 参考。至此你已经掌握了 Prisma 服务端订阅的完整图景从 prisma.yml 中的一段配置到 mutation 触发的过滤查询再到 Webhook 投递的源码链路足以独立构建数据变更驱动外部系统的集成方案。赞分享后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载相关推荐Prisma 服务端订阅Server-side Subscriptions指南基于 Webhook 的事件投递机制与 prisma.yml 配置实战Prisma 服务端订阅Server side Subscriptions指南基于 Webhook 的事件投递机制与 prisma.yml 配置实战 Pr后端数据库GraphQLPrisma 服务端订阅Server-side Subscriptions实战指南在 prisma.yml 中配置 Webhook 事件订阅Prisma 服务端订阅Server side Subscriptions实战指南在 prisma.yml 中配置 Webhook 事件订阅 Prisma后端数据库GraphQLdarktable 入门7 步走完一张 RAW 的免费处理全流程darktable 入门7 步走完一张 RAW 的免费处理全流程 darktable 是一款开源的摄影工作流应用与 RAW 开发者它负责从文件管理、RAW后端数据库GraphQL上一篇构建专业级气象数据服务Open-Meteo开源平台核心技术解析与实战部署下一篇Node.js 23.3.0 (Current) 发布说明精读特性变更、完整提交与 nodejs.org 仓库如何自动生成和渲染该发布文章创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/24 16:16:32

【Dify】36氪新闻热榜智能自动化采集与AI处理

实时掌握热点新闻已成为信息时代的重要能力,自动化技术和AI智能体正推动新闻获取方式变革。 本文介绍如何通过Dify等自动化工具,实现36氪新闻热榜的批量采集、智能摘要和定制化输出,适用于信息收集、内容创作、行业分析等场景。 文章目录 36氪新闻热榜智能自动化 核心模型 …

2026/9/24 17:16:40

基于springboot服务器监控管理平台系统(源码+文档+部署讲解等)

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

2026/9/24 17:16:40

PyOD 示例代码完全指南:从安装、运行到排查常见问题

机器学习数据分析深度学习 【免费下载链接】pyod A Python library for anomaly detection across tabular, time series, graph, text, image, and audio data. 60 detectors, benchmark-backed ADEngine orchestration, and an agentic workflow for AI agents. 项目地址&…

2026/9/24 17:16:40

基于SpringBoot的智慧泊车系统的设计与实现毕业设计项目源码

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

2026/9/24 17:11:39

电碳表与碳资产管理平台:双碳目标下的智慧能源管理新范式

摘要:电碳表依托智能计量与物联网技术,实现用电全流程碳排放动态精准测算,为碳排放核算提供实时、可信的数据支撑;碳资产管理平台则以精准碳核算为基础,对接碳交易市场,助力企业盘活碳资产、创造碳收益。二…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码