GraphQL 订阅:最大侦听器超出警告

2023-12-26

我们使用 GraphQL 订阅和 pubsub 来订阅帖子。

当发生超过 10 个订阅时,我们会收到节点警告“MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏”。

是否可以提高 pubsub 类中的最大侦听器数量?

pubsub 类位于一个单独的模块内,如下所示:

import { PubSub } from 'graphql-subscriptions';

const pubsub = new PubSub();

export { pubsub };

订阅服务器如下所示:

import { SubscriptionManager } from 'graphql-subscriptions';
import { createServer } from 'http';
import { SubscriptionServer } from 'subscriptions-transport-ws';

import { pubsub } from './subscriptions';
import executableSchema from './executableSchema';

const WS_PORT = 8080;

const websocketServer = createServer((request, response) => {
  response.writeHead(404);
  response.end();
});

websocketServer.listen(WS_PORT, () => console.log(
  `Websocket Server is now running on http://localhost:${WS_PORT}`
));

const subscriptionManager = new SubscriptionManager({
  schema: executableSchema,
  pubsub: pubsub,
  setupFunctions: {
        newPost: (options, args) => {
         return {
            newPostChannel: {
               filter: (post) => {
                  return args.publicationId === post.relatedPublication.id;
               }
            },
         };
      },
  },
});

const subscriptionServer = new SubscriptionServer({
  subscriptionManager: subscriptionManager
}, {
  server: websocketServer,
  path: '/',
});


export {
  subscriptionServer,
};

我编写了您正在使用的 graphql-subscriptions 包的原始实现,因此我可以在这里提供一些上下文。

graphql-subscriptions 中包含的简单 EventEmitter pubsub 库仅用于演示目的。 EventEmitters 并不能真正扩展到很大的数量,它们位于内存中,并且只有在您的服务器不超过一台的情况下它们才会工作。

对于任何尝试在生产中运行 GraphQL 订阅的人,我强烈建议使用不同的系统,例如 Redis 或 MQTTgraphql-redis-订阅 https://github.com/davidyaha/graphql-redis-subscriptions or graphql-mqtt-订阅 https://github.com/davidyaha/graphql-mqtt-subscriptions。这样做的优点是保持 GraphQL 服务器无状态(除了 Websocket),从而易于水平扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GraphQL 订阅:最大侦听器超出警告 的相关文章

随机推荐