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

我们正在使用GraphQL订阅和pubsub订阅post。

当发生超过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库仅用于演示目的。 事件发送器并不是真正的扩展到大数据量,而是在内存中,只要你只有一台服务器,它们就会工作。

对于任何试图在生产中运行GraphQL订阅的人,我强烈build议使用不同的系统,例如Redis或MQTT,通过graphql-redis-subscriptions或graphql-mqtt-subscriptions 。 这将有利于保持GraphQL服务器无状态(除了websockets),因此容易水平扩展。

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

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