GraphQL Subscriptions: Max Listeners Exceeded Warning
graphql, graphql-subscriptions, node.js, subscriptions
Solution
I wrote the original implementation of the graphql-subscriptions package you're using, so I can provide some context here.
The simple EventEmitter pubsub library included in graphql-subscriptions is only intended for demo purposes. EventEmitters don't really scale to large numbers, they're in-memory, and they'll only work as long as you have no more than a single server.
For anyone trying to run GraphQL subscriptions in production, I strongly recommend using a different system, for example Redis or MQTT through graphql-redis-subscriptions or graphql-mqtt-subscriptions. This will have the advantage of keeping the GraphQL server stateless (apart from the websockets) and thus easy to scale horizontally.
Problem
We are using GraphQL Subscriptions and pubsub to subscribe to posts. When more than 10 subscriptions occur we get the the node warning "MaxListenersExceededWarning: Possible EventEmitter memory leak detected." Is it possible to raise the max listeners in the pubsub class? The pubsub class is inside a separate module and looks like this: ``` import { PubSub } from 'graphql-subscriptions'; const pubsub = new PubSub(); export { pubsub }; ``` The subscription server looks like this: ``` 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, }; ```