GraphQL订阅:最大听众超过警告



我们正在使用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-Subscript软件包的原始实现,因此我可以在此处提供一些上下文。

GraphQl-Subscript中包含的简单EventEmitter PubSub库仅用于演示目的。eventemitter并没有真正扩展到大数字,它们是内存的,只要您只有一台服务器,它们就可以工作。

对于任何试图在生产中运行GraphQL订阅的人,我强烈建议使用其他系统,例如通过GraphQL-REDIS-SUBSCRIPTIONS或GRAPHQL-MQTT-SUBSCRIPTIONS使用REDIS或MQTT。这将具有保持GraphQl Server无状态(除Websockets除外(的优势,从而易于水平扩展。

eePubSub的受保护成员,因此将其直接设置会在打字稿项目中导致错误。但是,您可以通过调整后的MaxListener计数将EventEmitter传递给PubSub构造函数:

import { PubSub } from 'apollo-server-express';
import { EventEmitter } from 'events';
const biggerEventEmitter = new EventEmitter();
biggerEventEmitter.setMaxListeners(30);
const pubSub = new PubSub({eventEmitter: biggerEventEmitter});

发现您可以在pubsub实例的Evers Imitter中更改最大听众,例如:

import { PubSub } from 'graphql-subscriptions';
const pubsub = new PubSub();
pubsub.ee.setMaxListeners(30); // raise max listeners in event emitter
export { pubsub };

最新更新