GraphQL:如何从计划的议程作业发布订阅

Posted

技术标签:

【中文标题】GraphQL:如何从计划的议程作业发布订阅【英文标题】:GraphQL: How to publish subscription from a scheduled Agenda job 【发布时间】:2020-02-21 00:07:18 【问题描述】:

我的问题也被问到Trigger Apollo Subscription at a later time with Agenda,但没有答案,我没有足够的声誉在那里发表评论。不知道该怎么做,所以我发布了一个新问题。

我正在使用 graphql-yoga 并使用 pubsub 来触发订阅。我有一个突变,它接收 pubsub 作为上下文参数。从那里,我可以通过 pubsub.publish 发布我的订阅。这工作正常。

我还通过议程 (https://github.com/agenda/agenda) 安排工作。当这些作业稍后运行时,我会更新数据库。这也有效。

我的问题是,当我在议程作业中更新数据库时,我还需要将数据库更新发布到订阅。我不知道如何在我的议程功能中访问 pubsub。

我尝试将我已经在变异中的 pubsub 对象与我提供给作业的数据一起包含在内,希望以后可以访问 pubsub。但这不起作用(不足为奇)。

我找不到任何文档,并且我发现的类似 *** 问题(上面链接)没有任何响应。

有谁知道是否可以从议程作业触发订阅?

【问题讨论】:

我最近的一个想法是使用axios从agenda作业向服务器发起POST请求,这样就可以更新db并正常触发订阅。但这似乎很笨拙。 您应该能够使用您在突变中使用的相同 PubSub,即使您正在运行一个单独的进程,只要您使用 implementation other than the default in-memory one。是这样吗? 在 app.js 中,我有 const pubsub - new PubSub(),并且 graphql-yoga 需要 PubSub,所以我猜这是默认实现(?)。我不清楚如何从议程工作中访问 pubsub。突变包含 pubsub 作为函数的参数,因为服务器是使用 pubsub 上下文设置的。 我通过使用 Axios 发出 POST 请求来进行突变解决了我的问题。在突变中,订阅被发布。这可行,但我仍然不确定它是否是最佳解决方案。 【参考方案1】:

我不熟悉agenda,但我怀疑它在与您的 GraphQL 服务器不同的进程中运行作业。默认的PubSub 实现只使用EventEmitter,并且不能跨多个进程工作。因此,您应该使用一种将订阅持久化的实现,例如数据库、键值存储、消息队列等。创建一个模块并导出 PubSub 实例:

// pubsub.js

const  RedisPubSub  = require('graphql-redis-subscriptions')
const Redis = require('ioredis')

const options = 
  // redis client options
;

module.exports = new RedisPubSub(
  publisher: new Redis(options),
  subscriber: new Redis(options)
)

然后,您可以在 GraphQL 解析器和作业中导入该模块,并根据需要调用 publishsubscribe

【讨论】:

以上是关于GraphQL:如何从计划的议程作业发布订阅的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 react-native 聊天应用程序中使用 GraphQl 订阅从 GraphQl 查询中获取实时更新

贝宝订阅升级

贝宝订阅升级

如何在 GraphQL HotChocolate 中实现订阅?

如何在客户端 NextJS 中使用 Apollo GraphQL 订阅?

GraphQL 通过公共网关服务订阅内部服务