【问题标题】:Graphql subscription with multithreaded nodeJS server带有多线程 nodeJS 服务器的 Graphql 订阅
【发布时间】:2019-01-27 20:49:59
【问题描述】:

我正在尝试在多线程架构中创建 graphql 订阅服务。

例如,如果我创建如下订阅

const SOMETHING_CHANGED_TOPIC = 'something_changed';

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

并且在我的 docker 集群上运行多个相同的 nodeJS 服务器实例,我不希望每个实例在每次发布新订阅时都向客户端发送订阅事件。我只希望一个(当然最好在集群之间进行负载平衡)负责向客户端发送订阅。

我现在唯一能想到的方法是创建一个独立的服务器来负责订阅事件,并且只接收来自单一来源的订阅事件作为客户端。但是,如果我分散负责订阅的服务器的负载,就会出现我上面提到的同样的多线程问题。

当有多线程 nodeJS 后端时,如何确保只向客户端发送单个订阅事件?只有客户端过滤才有可能吗?即忽略已经到达的事件 - 但是我认为随着订阅的增长,这是对资源的严重浪费。

【问题讨论】:

    标签: node.js graphql apollo


    【解决方案1】:

    在这种情况下,我会使用 Redis 作为 PubSub,这样你就有了“一个真实的来源”。即https://github.com/tomyitav/redis-messaging-manager

    我相信还有很多其他库可以做类似的事情

    【讨论】:

    • 我可以使用 redis 但订阅 redis pubsub 也会被线程化,不是吗?所以说,如果 nodeJS 服务器的一个实例发布了一个事件,所有其他订阅它的 nodeJS 服务器都将订阅该事件发布,它们将同时尝试将事件传递给客户端
    • 啊,我误会了。但是,在那种情况下,不是只有一个 nodeJS 服务器实例让客户端主动“监听”吗?他不会“订阅”每个节点服务器,只有一个舰队实例,对吧?那么这不是问题吗?
    • 哦。嗯,想想你是对的。这根本不是问题。谢谢!
    猜你喜欢
    • 2019-01-27
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2019-05-02
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多