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 解析器和作业中导入该模块,并根据需要调用 publish
和 subscribe
。
【讨论】:
以上是关于GraphQL:如何从计划的议程作业发布订阅的主要内容,如果未能解决你的问题,请参考以下文章
我如何在 react-native 聊天应用程序中使用 GraphQl 订阅从 GraphQl 查询中获取实时更新
如何在 GraphQL HotChocolate 中实现订阅?