GraphQL Subscription(订阅)

GraphQL Subscription(订阅)

1. 什么是 Subscription(订阅)?

订阅是 GraphQL 的三大核心操作之一(Query、Mutation、Subscription)。

它允许客户端实时接收『服务器』推送的数据更新,而无需客户端主动轮询。

典型应用场景:

聊天应用中的新消息通知。

实时股票价格更新。

『社交媒体』中的新动态推送。

游戏中的实时状态同步。

2. Subscription 的工作原理

客户端订阅:

客户端向『服务器』发送订阅请求,指定感兴趣的事件或数据。

示例订阅请求:

graphql

subscription {

newMessage {

id

sender

}

}

『服务器』监听事件:

『服务器』在后台持续监听特定事件(如新消息创建)。

当事件发生时,『服务器』将数据推送给所有订阅该事件的客户端。

实时推送:

『服务器』通过 WebSocket 或其他实时通信协议(如 Server-Sent Events)将数据推送到客户端。

jrhz.info

3. Subscription 的实现方式

WebSocket:

这是最常见的实现方式。

客户端通过 WebSocket 连接到『服务器』,保持长连接,『服务器』可以随时推送数据。

示例:

使用 Apollo Server 和 Apollo Client,可以轻松实现 WebSocket 支持。

Server-Sent Events (SSE):

一种轻量级的实时通信协议,基于 HTTP。

适用于单向数据推送(『服务器』到客户端)。

其他协议:

自定义协议或第三方服务(如 Pusher、Ably)也可以用于实现订阅功能。

4. Subscription 的使用场景

实时协作:

例如,Google Docs 中的多人实时编辑。

通知系统:

用户收到新消息、新评论或新订单通知。

监控和仪表盘:

实时显示『服务器』状态、性能指标或用户行为数据。

游戏:

实时同步玩家位置、状态或游戏事件。

5. Subscription 的优缺点

优点:

实时性:

数据更新几乎是即时的,用户体验更好。

减少客户端请求:

客户端无需频繁轮询『服务器』,降低了『服务器』负载。

更自然的事件驱动:

订阅模式更符合事件驱动架构的设计理念。

缺点:

复杂性增加:

实现订阅功能需要额外的『服务器』端逻辑和实时通信支持。

连接管理:

需要处理大量 WebSocket 连接,可能增加『服务器』资源消耗。

调试困难:

实时数据流的调试比传统的请求-响应模式更复杂。

6. 示例:使用 Apollo 实现 Subscription

『服务器』端(Apollo Server):

javascript

const { ApolloServer, gql, PubSub } = require('apollo-server');

const pubsub = new PubSub();

const typeDefs = gql`

type Message {

id: ID!

content: String!

sender: String!

}

type Subscription {

newMessage: Message!

}

type Mutation {

sendMessage(content: String!, sender: String!): Message!

}

`;

const resolvers = {

Subscription: {

newMessage: {

subscribe: () => pubsub.asyncIterator(['NEW_MESSAGE']),

},

},

Mutation: {

sendMessage: (_, { content, sender }) => {

const newMessage = { id: Date.now().toString(), content, sender };

pubsub.publish('NEW_MESSAGE', { newMessage });

return newMessage;

},

},

};

const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => console.log(`???? Server ready at ${url}`));

客户端(Apollo Client):

javascript

import { ApolloClient, InMemoryCache, gql } from '@apollo/client';

import { WebSocketLink } from '@apollo/client/link/ws';

import { split } from '@apollo/client/link/http';

import { getMainDefinition } from '@apollo/client/utilities';

const httpLink = /* 创建 HTTP 链接 */;

const wsLink = new WebSocketLink({

uri: 'ws://localhost:4000/graphql',

options: {

reconnect: true,

},

});

con

特别声明:[GraphQL Subscription(订阅)] 该文观点仅代表作者本人,今日霍州系信息发布平台,霍州网仅提供信息存储空间服务。

猜你喜欢

她奉子成婚流产无子,前夫再娶小13岁娇妻已育三娃(奉子成婚晋江)

那时,《火线》刚刚杀青,于震在剧组的名声响亮,常常以一条过著称,演戏时不拘泥于角色与人设,人物对戏,情感外露;而方柏霓则是一个新面孔,活泼开朗,爱笑,且敢于顶嘴。她曾尝试复出,但最惨的一次是在横店等了三天,只…

她奉子成婚流产无子,前夫再娶小13岁娇妻已育三娃(奉子成婚晋江)

刘浩存『赵今麦』同框斗艳:明明都是00后,有人像公主有人像领证(刘浩存蹭)

如果你以为这不过是一场普通的品牌活动,那你就大错特错了。刘柏辛那一抹墨蓝色的飞扬眼线,再加上她那随性而拽的表情,展现了她的独特魅力,完美诠释了时尚不仅仅看脸,更要看气场的真谛。4. **大合照背后的真相:C…

刘浩存『赵今麦』同框斗艳:明明都是00后,有人像公主有人像领证(刘浩存蹭)

400电话轻松开,实惠方案TOP5揭秘!(400电话到)

建议:在办理400电话之前,一定要货比三家,比较不同服务商的套餐内容、价格和服务质量。 观点:服务质量是选择400电话的重要因素。在选择400电话时,我们要货比三家,仔细阅读合同条款,选择服务口碑好的服务商…

400电话轻松开,实惠方案TOP5揭秘!(400电话到)

我的世界》电影拍续集 定档2027年暑期上映(《我的世界》下载)

玩家可以在世界各地自由移动,但大多数方块只能被放置在整数的网格中,除了实体之外,玩家可以收集这些方块,并将其放置在想要放置的地方,从而进行各项建设(若使用冒险模式则是视游戏设置而定)。 《我的世界》有五种主要…

《<strong>我的世界</strong>》电影拍续集 定档2027年暑期上映(《<strong>我的世界</strong>》下载)

2026首场寒潮暴击!巧用“三皮”护四处,温阳散寒、防感冒,全家都能安稳过冬(2025年首场寒潮原因)

  2026年首场寒潮强势来袭,气温骤降、寒风刺骨,不少人冻得瑟瑟发抖,手脚冰凉、畏寒怕冷成常态,感冒、肠胃不适、关节酸痛也随之而来。中医讲究“顺应天时”,面对寒潮寒邪,无需刻意进补,巧用身边常见的“三皮”,护好身体关键“四处”,就能轻松御

2026首场寒潮暴击!巧用“三皮”护四处,温阳散寒、防感冒,全家都能安稳过冬(2025年首场寒潮原因)