@axelspringer/graphql-google-pubsub

中文文档
2.1.0发布于 2020/02/13MITCommonJS近 30 天下载 7270

一个使用 Google PubSub 的图ql 订阅 PubSub 引擎

中文使用文档
文档目录11 节
  1. 安装
  2. 使用自动同步器
  3. 接收信件
  4. 动态使用基于订阅参数的查询主题 :
  5. 使用参数和有效载荷过滤事件
  6. 创建 Google PubSub 客户端
  7. 选项
  8. 专题2SubName
  9. 普通信使汉德勒
  10. 作者
  11. 鸣谢

图表ql- google- pubsub

此软件包执行 PubSubEngine 接口 图ql 订阅 软件包和新的 AsyncIterator 接口. 它允许您将您的订阅管理器连接到 Google PubSub 机制,以支持 多个订阅管理器实例 .

安装

npm install @axelspringer/graphql-google-pubsub 或者说 yarn add @axelspringer/graphql-google-pubsub

使用自动同步器

定义您的图形QL 方案 Subscription 类型 :

schema {
  query: Query
  mutation: Mutation
  subscription: Subscription
}

type Subscription {
    somethingChanged: Result
}

type Result {
    id: String
}

现在,让我们创造一个简单的 GooglePubSub 实例:

import { GooglePubSub } from '@axelspringer/graphql-google-pubsub';
const pubsub = new GooglePubSub();

现在,使用 pubsub.asyncIterator 以映射您需要的事件 :

const SOMETHING_CHANGED_TOPIC = 'something_changed';

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: () => pubsub.asyncIterator(SOMETHING_CHANGED_TOPIC),
    },
  },
}

订阅解析器不是函数,而是对象 subscribe 方法,该返回 AsyncIterable。 。 。 .

调用方法 asyncIterator 会 议 日 程 和 议 程 GooglePubSub 实例将订阅提供的专题,并将返回 AsyncIterator 与GooglePubSub实例捆绑在一起,并听取有关该主题的任何活动. 现在 GraphQL 引擎知道 somethingChanged 是一个订阅, 每次我们将使用 pubsub.publish 关于这一主题 GooglePubSub 将 PUBLISH 将事件发送到GraphQL next graphQL 引擎给出的回调 .

pubsub.publish(SOMETHING_CHANGED_TOPIC, { somethingChanged: { id: "123" }});

话题不会自动创建,必须事先创建.

如果您发布非字符串数据, 它会被字符串化, 你必须 解析收到的信件数据。 。 。 .

接收信件

这个 收到消息 从Google PubSub作为有效载荷直接传递到分辨率/过滤器函数.

您可以提取那里的数据( Buffer) 或使用 普通信件处理器 以转换收到的消息.

function commonMessageHandler ({attributes = {}, data = ''}) {
  return {
    ...attributes,
    text: data.toString()
  };
}

这个 can use custom message handler 测试可以显示普通信件处理器的灵活性.

动态使用基于订阅参数的查询主题 :

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: (_, args) => pubsub.asyncIterator(`${SOMETHING_CHANGED_TOPIC}.${args.relevantId}`),
    },
  },
}

使用参数和有效载荷过滤事件

import { withFilter } from 'graphql-subscriptions';

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: withFilter(
        (_, args) => pubsub.asyncIterator(`${SOMETHING_CHANGED_TOPIC}.${args.relevantId}`),
        (payload, variables) => payload.somethingChanged.id === variables.relevantId,
      ),
    },
  },
}

创建 Google PubSub 客户端

import { GooglePubSub } from '@axelspringer/graphql-google-pubsub';

const pubSub = new GooglePubSub(options, topic2SubName, commonMessageHandler)

选项

这些是 选项 被传递给内部或通过Google PubSub客户端. 如果提供,客户端将从环境变量中提取证书,项目名称等. 看看这个 认证指南 更多信息. 否则您可以在选项中提供此细节 .

const options = {
  projectId: 'project-abc',
  credentials:{
    client_email: '[email protected]',
    private_key: '-BEGIN PRIVATE KEY-\nsample\n-END PRIVATE KEY-\n'
  }
};

订阅选项

订阅选项 可以传入 subscribe 或者说 asyncInterator。 。 。 .

说明: (原始内容存档于2017-10-29). google.protobuf. 会期 类型必须作为具有一秒属性的对象相传({ seconds: 123 }) (中文(简体) ).

const dayInSeconds = 60 * 60 * 24;

const subscriptionOptions = {
  messageRetentionDuration: { seconds: dayInSeconds },
  expirationPolicy: {
    ttl: { seconds: dayInSeconds * 2 }, // 2 Days
  },
};

await pubsub.asyncIterator("abc123", subscriptionOptions);

专题2SubName

允许构建不同的工作流程. 如果您在多个服务器实例中听到同一订阅, 信件将会在它们之间分发 . 大多数时候,您想要每个服务器不同的订阅. 这样每个服务器实例都可以告知客户端新的消息.

const topic2SubName = topicName => `${topicName}-${serverName}-subscription`

普通信使汉德勒

普通消息处理器随从Google PubSub收到的消息被调用. 您可以在消息传递给订阅者的个人过滤/解析方法之前将消息转换. 举例来说,这样可以注射一种 数据记录器 用于所有过滤/解析方法.

const getDataLoader = () => new DataLoader(...);
const commonMessageHandler = ({attributes: {id}, data}) => ({id, dataLoader: getDataLoader()});
export const resolvers = {
  Subscription: {
    somethingChanged: {
      resolve: ({id, dataLoader}) => dataLoader.load(id)
    },
  },
}

作者

乔纳斯·哈肯伯格 - 乔纳斯-阿尔库尔帕

鸣谢

这个项目的灵感主要来自 图克l- redis 订阅。 。 。 . 非常感谢其作者的作品和灵感。 多亏了精益队丹尼尔·沃格尔, (中文(简体) ), 马丁·托马斯, (中文(简体) ), 马塞尔多纳, (中文(简体) ), 弗洛里安·塔兹克, (中文(简体) ), 塞巴斯蒂安·赫林格, (中文(简体) ), Mircea Craculeac 维基百科 财务报告和审定财务报表 蒂姆·苏萨) (中文(简体) ).

版本与发布记录

@axelspringer/graphql-google-pubsub 共发布 18 个版本,首次发布于 2018/03/16;过去 12 个月发布了 0 个版本。

版本发布日期距今
2.1.0latest2020/02/136 年前
2.0.02019/11/047 年前
1.2.12019/05/027 年前
1.2.02019/02/027 年前
1.1.32018/10/138 年前
1.1.22018/09/298 年前

关于 @axelspringer/graphql-google-pubsub 的常见问题

@axelspringer/graphql-google-pubsub 是什么?

一个使用 Google PubSub 的图ql 订阅 PubSub 引擎

如何安装 @axelspringer/graphql-google-pubsub?

在项目目录运行 npm install @axelspringer/graphql-google-pubsub,或使用 pnpm add / yarn add / bun add。

@axelspringer/graphql-google-pubsub 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/axelspringer__graphql-google-pubsub 是否存在。

@axelspringer/graphql-google-pubsub 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@axelspringer/graphql-google-pubsub 可以商用吗?

@axelspringer/graphql-google-pubsub 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@axelspringer/graphql-google-pubsub 的下载量有多少?

根据 npm 官方下载统计,@axelspringer/graphql-google-pubsub 在 2026/10/08 – 2026/11/06 这 30 天内被下载 7,270 次,日均约 242 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@axelspringer/graphql-google-pubsub 还在维护吗?

最新版本 2.1.0 发布于 2020/02/13(6 年前);至今共发布 18 个版本,其中过去 12 个月发布了 0 个;首次发布于 2018/03/16。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。