Absinthe实时订阅Skill:把 GraphQL 实时订阅从“到处翻文档”变成“照着模板写”
- 它是什么:
absinthe-subscriptions(Absinthe实时订阅Skill,技能ID:13994)是一份围绕 Elixir / Phoenix / Absinthe 实现实时 GraphQL 订阅的实施指南,覆盖 Phoenix 通道、PubSub 与订阅模式。 - 它能干什么:从 Endpoint 与 UserSocket 配置,到订阅定义(
config+trigger)、从 mutation 中发布消息、用户级私有订阅、授权校验,再到 PubSub 配置与反模式清单,一套流程全覆盖。 - 它的差异点:它本身并不只是某个第三方库,关键在于把“正确的写法”和“该避开的坑”整理在一起;代码片段可直接对照落地。
- 适合谁用:正在用 Elixir / Phoenix 构建实时功能(实时列表、通知、协作看板)的后端开发者与团队。
- 使用前提:需要在支持 AI 技能的市场或客户端中获取并启用,并按技能库标注的使用方式调用;具体入口与命令以官方说明为准。
该技能叫什么?如何下载安装 AI 技能提升开发效率?
技能名称与身份标识
- 中文名:Absinthe实时订阅Skill
- 英文名:absinthe-subscriptions
- 技能ID:13994
- 技能定位:面向 Absinthe + Phoenix 的实时 GraphQL 订阅实施指南
它解决什么问题
在 Elixir 生态里做实时能力,难点往往并不在于“订阅”这个概念本身;真正耗时的是散落在各处的细节:Phoenix Endpoint 要不要 use Absinthe.Phoenix.Endpoint、UserSocket 怎么挂 schema、config/2 返回的 topic 长什么样、mutation 里 Absinthe.Subscription.publish/3 的第三个参数怎么拼、私有数据怎么按用户隔离、PubSub 进程有没有加到 supervision tree。这些点缺少一个串联起来的完整示例时,开发者常常要在官方文档、示例仓库和各种讨论帖之间反复比对。
这个技能就是把这条链路整理成可以直接对照的指南与代码片段,让你专注于业务逻辑,而不是反复翻查语法细节。
一键安装 AI 技能提升开发效率的思路
AI 技能的“安装”本质上是让客户端在合适的任务场景下能加载到这份知识。通用步骤如下(具体命令、入口、是否收费等,以官方说明为准):
- 确认前提:你的 AI 编程客户端或 IDE 支持“技能/插件”机制,并且工作目录中已经是一个 Elixir / Phoenix 项目(便于技能产出的代码直接对照落地)。
- 检索技能:在技能市场或技能管理面板中,使用英文名
absinthe-subscriptions或技能ID13994进行检索与识别。 - 启用技能:按客户端提供的启用入口完成添加。需要注意的是,根据技能详情标注,本技能被标记为“用户可调用:否”,这意味着它更偏向知识/指南型技能,通常是在相关开发任务中被引用;具体启用与触发方式请以官方说明为准。
- 验证是否生效:在新会话中提出一个具体问题,例如“帮我为 Phoenix 项目配置 Absinthe 订阅的 Endpoint 和 UserSocket”,观察返回内容是否包含
use Absinthe.Phoenix.Endpoint、use Absinthe.Phoenix.Socket, schema: ...、Absinthe.Phoenix.Socket.put_options等关键写法。能稳定给出这类结构化内容,说明技能已经生效。 - 固化到项目:把生成的配置与订阅定义保存到项目文件中,并把团队的 topic 命名规范补充进技能提示里,形成可复用的协作基线。
该技能的主要功能和特点
- 端到端配置链路:覆盖 Phoenix Endpoint 挂载 Absinthe、socket 声明、UserSocket 连接鉴权与
id/1实现,形成完整的实时通道骨架。 - 订阅定义范式:给出
object :post_subscriptions这类订阅对象的写法,用config/2计算 topic,用trigger把 GraphQL mutation 与订阅自动绑定,减少手写发布逻辑。 - 从 mutation 主动发布:演示在 resolver 中调用
Absinthe.Subscription.publish/3,把创建/更新结果推送到指定 topic,附带错误分支处理。 - 用户级私有订阅:通过
%{context: %{current_user: user}}动态生成"user:#{user.id}:notifications"这类按用户隔离的 topic,天然支持多租户与权限边界。 - PubSub 进程装配:给出
config/config.exs中的pubsub_server配置,以及application.ex中{Phoenix.PubSub, name: MyApp.PubSub}与{Absinthe.Subscription, MyAppWeb.Endpoint}的 supervision tree 写法。 - 订阅侧授权:展示在
config/2中直接做权限判断,未认证时返回{:error, "未授权"},把授权前移到订阅建立阶段。 - 反模式清单:明确提醒不要把敏感数据发布到宽泛 topic、不要跳过连接级授权、不要设计过细粒度的 topic。
- 和普通工具比强在哪:普通代码补全只能给你“下一行”,而这个技能给的是“一整套模式”——配置、定义、发布、授权、性能注意点在同一次回答里闭环,减少了模式不一致带来的隐性 bug。
如何使用该技能?
以下是围绕真实开发流程的分步用法,示例可直接参考改写。
第 1 步:先让技能产出基础骨架
输入示例:“我在 Phoenix 项目里要用 Absinthe 做实时订阅,先给我 Endpoint 和 UserSocket 的配置,token 里带用户信息。”
预期输出:MyAppWeb.Endpoint 中 use Absinthe.Phoenix.Endpoint 与 socket "/socket", MyAppWeb.UserSocket, websocket: true, longpoll: false;UserSocket 中 use Absinthe.Phoenix.Socket, schema: MyApp.Schema、在 connect/3 里解析 token 并通过 put_options 注入 context,以及按用户划分的 id/1。
第 2 步:定义订阅对象
输入示例:“定义一个 post_created 订阅,所有新帖都推;再定义一个 post_updated,按文章 id 推。”
预期输出:config 返回 {:ok, topic: "posts"} 与 {:ok, topic: "post:#{id}"},trigger 分别使用 trigger :create_post, topic: fn _post -> "posts" end 和 trigger :update_post, topic: fn post -> "post:#{post.id}" end;同时提示 post_updated 需要 arg :id, non_null(:id)。
第 3 步:在 mutation 中发布
输入示例:“create_post 成功后要把结果推给订阅者。”
预期输出:在 resolver 成功分支中调用 Absinthe.Subscription.publish(MyAppWeb.Endpoint, post, post_created: "posts"),失败分支返回 {:error, changeset}。
第 4 步:加上用户私有订阅与授权
输入示例:“通知只推给对应用户本人,未登录直接拒绝。”
预期输出:config 中模式匹配 %{context: %{current_user: %{id: user_id}}} 生成 "user:#{user_id}:messages",匹配不到时返回 {:error, "未授权"};发布时使用同名 topic。
第 5 步:补齐运行时配置
输入示例:“PubSub 怎么配?会不会报进程不存在?”
预期输出:config/config.exs 中的 pubsub_server: MyApp.PubSub,以及 application.ex 中把 {Phoenix.PubSub, name: MyApp.PubSub} 和 {Absinthe.Subscription, MyAppWeb.Endpoint} 加进 children。
第 6 步:按反模式清单自查
拿到代码后依次核对:topic 是否过宽、订阅是否强制鉴权、连接级是否校验身份、topic 粒度是否过细影响性能、断开连接后资源是否清理、是否设置了速率限制。
输出说明:技能产出的是可直接对照落地的 Elixir 代码片段与原则说明,不是自动改文件的工具,最终仍需你复制进项目、按自己的模块名替换命名空间并编译验证。
同类型竞品对比分析
| 方案名称 | 定位 | 核心功能 | 安装/使用门槛 | 适用场景 | 优势与不足 |
|---|---|---|---|---|---|
| absinthe-subscriptions(本技能) | Absinthe 订阅实施指南型 AI 技能 | Endpoint/UserSocket 配置、订阅定义、mutation 发布、用户级 topic、PubSub 装配、授权与反模式 | 需在支持技能机制的客户端中启用;需具备 Elixir/Phoenix 基础 | 从零搭建订阅、重构现有实时链路、团队规范对齐 | 优势:链路完整、模式一致、含避坑清单;不足:偏知识型输出,仍需人工落地与验证 |
| Absinthe 官方文档与 HexDocs | 权威参考文档 | API 说明、模块文档、部分示例 | 需自行检索与串联 | 查单个函数签名、确认行为细节 | 优势:最权威;不足:示例分散,难以一次拿到端到端可跑通组合 |
| Absinthe.Phoenix / Absinthe.Subscription 库本体 | 运行时依赖库 | 提供 socket 集成与订阅发布能力 | 需在 mix 依赖中引人并自行配置 | 任何实际项目运行 | 优势:真正执行实时逻辑;不足:只是能力提供者,不教你如何组织 topic 与授权 |
| 通用大模型(未启用技能) | 通用问答 | 可回答通用 GraphQL 订阅问题 | 门槛低 | 概念答疑 | 优势:灵活;不足:容易给出 JavaScript 生态写法或过时 API,需反复纠正 |
该技能的典型应用场景与实际体验情况
场景一:社区类产品的帖子实时流
角色:负责社区模块的 Elixir 后端开发者。痛点:新帖发布后要手动刷新列表,或者自己临时写一套轮询。使用方式:让技能给出 post_created 订阅 + trigger :create_post + mutation 内 publish 的整套写法。实际体验:照着模板替换模块名即可跑通,trigger 的自动绑定省掉了手动维护发布点的工作量;注意点是要确认客户端订阅时传的 topic 与发布时完全一致。
场景二:SaaS 产品的用户私有通知
角色:多租户产品的后端负责人。痛点:通知不能串号,权限必须在订阅建立时就卡住。使用方式:采用用户级 topic "user:#{user_id}:notifications",并在 config/2 里做模式匹配授权。实际体验:把权限判断写进订阅配置后,越权订阅会在建立阶段被拒,安全性明显好于在推送侧过滤;注意点是 token 解析要放在 socket connect/3 中完成,确保 context 一定存在。
场景三:协作看板的单条记录实时更新
角色:实时协作功能开发者。痛点:全员推送会导致无关数据刷屏与浪费。使用方式:post_updated 按 arg :id 使用 "post:#{id}" 的细粒度 topic。实际体验:数据暴露面显著收窄;但技能的反模式清单明确提醒“避免过度细粒度 topic(影响性能)”,因此实际项目中需要在隔离性与 topic 数量之间做权衡。
场景四:团队规范沉淀与新成员上手
角色:技术负责人。痛点:每个人对订阅的理解不同,代码风格散乱。使用方式:把技能的订阅定义范式、PubSub 装配方式与反模式清单整理成团队约定。实际体验:新成员能快速对齐“topic 怎么起名、授权写在哪、发布写在哪”;需要补充的是团队自身的命名约定,因为技能给出的是通用范式。
上手难度与注意事项:整体难度中等,需要基本的 Phoenix 与 GraphQL 概念;如果完全没有 Elixir 经验,建议先补 Phoenix 通道基础。另外,技能产出需结合本项目实际文件编译验证,不要直接照抄模块命名。
该技能能为用户带来的价值
- 缩短“知道要做”到“跑通”的距离:把 Endpoint、Socket、订阅定义、mutation 发布、PubSub 装配这条链路一次性讲清,减少在分散文档间来回比对的时间成本。
- 降低实时功能的入门门槛:订阅是 GraphQL 中相对复杂的一环,技能用可对照的代码片段把抽象概念具体化,让没有订阅经验的开发者也能按图施工。
- 减少隐性缺陷:把“宽泛 topic 泄露敏感数据”“跳过连接级授权”等常见错误前置为清单,让安全性在编码阶段就被考虑,而不是上线后补救。
- 统一团队协作基线:同一份范式被多人复用,topic 命名、发布位置、授权方式趋于一致,代码可读性与可维护性同步提升。
- 长期可复用的知识资产:技能中的反模式与最佳实践可以沉淀为项目规范文档,随着团队规模扩大持续产生价值。
常见问题 FAQ
Q1:怎么安装这个技能?需要付费吗?
A:在支持 AI 技能机制的客户端或 IDE 中,通过英文名 absinthe-subscriptions 或技能ID 13994 检索并启用。安装入口、是否收费、可用额度等均以官方说明为准。需要留意的是,技能详情标注其为“用户可调用:否”,属于知识/指南型技能,通常随相关开发任务被引用,具体触发方式请参考客户端文档。
Q2:它和直接看 Absinthe 官方文档有什么区别?
A:官方文档是权威的 API 参考,但示例分散,需要你自己串起 Endpoint → Socket → 订阅定义 → 发布 → 授权的完整链路。本技能的价值在于“串联”,它把这条链路和常见坑一次性给出。推荐组合使用:用技能快速搭建骨架,用官方文档核对函数签名与版本差异。
Q3:适合谁用?前端开发者能用吗?
A:主要面向使用 Elixir / Phoenix / Absinthe 做后端或全栈的开发者,以及需要为团队制定实时订阅规范的技术负责人。前端开发者也能借助它理解订阅在服务端是如何组织的,从而更好地设计客户端订阅语句。
Q4:照着生成的代码就能直接跑吗?
A:代码片段对标真实写法,但模块名、schema 名、token 解析函数都需替换为你项目中的实际实现,并且要确认 Phoenix.PubSub 与 Absinthe.Subscription 已加入 supervision tree。建议先用一条最简单的全局订阅验证通道打通,再逐步加入用户级 topic 与授权逻辑。
Q5:用它做实时订阅,最大的风险点是什么?
A:根据技能中的反模式清单,主要集中在三处:把敏感数据发布到宽泛 topic、绕过连接级授权、topic 粒度过细影响性能。建议订阅一律在 config/2 中完成鉴权,topic 设计遵循“够用就好”的原则,并对订阅建立做速率限制。