首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphQL订阅:超过最大侦听器数警告

GraphQL订阅:超过最大侦听器数警告
EN

Stack Overflow用户
提问于 2017-05-03 13:54:30
回答 3查看 4K关注 0票数 12

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

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

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

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

代码语言:javascript
复制
import { PubSub } from 'graphql-subscriptions';

const pubsub = new PubSub();

export { pubsub };

订阅服务器如下所示:

代码语言:javascript
复制
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,
};

EN

回答 3

Stack Overflow用户

发布于 2017-05-05 02:38:45

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

graphql订阅中包含的简单EventEmitter pubsub库仅用于演示目的。EventEmitters并不能真正扩展到大数字,它们在内存中,并且只有当您只有一台服务器时,它们才能工作。

对于试图在生产环境中运行GraphQL订阅的任何人,我强烈建议使用不同的系统,例如通过graphql-redis-subscriptionsgraphql-mqtt-subscriptions的Redis或MQTT。这样做的好处是使GraphQL服务器保持无状态(与websockets分开),从而易于水平扩展。

票数 13
EN

Stack Overflow用户

发布于 2017-05-03 23:04:50

发现您可以更改pubsub实例的事件发射器中的最大侦听器,如下所示:

代码语言:javascript
复制
import { PubSub } from 'graphql-subscriptions';

const pubsub = new PubSub();
pubsub.ee.setMaxListeners(30); // raise max listeners in event emitter

export { pubsub };

票数 4
EN

Stack Overflow用户

发布于 2020-11-21 23:41:58

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

代码语言:javascript
复制
import { PubSub } from 'apollo-server-express';
import { EventEmitter } from 'events';

const biggerEventEmitter = new EventEmitter();
biggerEventEmitter.setMaxListeners(30);
const pubSub = new PubSub({eventEmitter: biggerEventEmitter});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43752073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档