2017-05-03 4 views
4

Nous utilisons des abonnements GraphQL et pubsub pour vous abonner aux messages.Abonnements GraphQL: Auditeurs maximum dépassés Avertissement

Lorsque plus de 10 abonnements se produisent, nous recevons le message d'avertissement "MaxListenersExceededWarning: Possible EventEmitter memory leak detected."

Est-il possible d'augmenter les écouteurs max dans la classe pubsub?

La classe PubSub se trouve dans un module séparé et ressemble à ceci:

import { PubSub } from 'graphql-subscriptions'; 
 

 
const pubsub = new PubSub(); 
 

 
export { pubsub };

Le serveur d'abonnement ressemble à ceci:

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, 
 
};

Répondre

1

découvert que vous pouvez changer les auditeurs max dans l'émetteur d'événements de l'instance de PubSub, comme ceci:

import { PubSub } from 'graphql-subscriptions'; 
 

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

 
export { pubsub };

4

j'ai écrit la mise en œuvre originale du paquet graphql-abonnements que vous êtes en utilisant, donc je peux fournir un peu de contexte ici.

La bibliothèque pubsub EventEmitter simple incluse dans les abonnements graphql est uniquement destinée à des fins de démonstration. Les EventEmitters ne s'adaptent pas vraiment aux grands nombres, ils sont en mémoire, et ils ne fonctionnent que tant que vous n'avez pas plus d'un seul serveur.

Pour quiconque essaie d'exécuter des abonnements GraphQL en production, je recommande fortement d'utiliser un autre système, par exemple Redis ou MQTT par graphql-redis-subscriptions ou graphql-mqtt-subscriptions. Cela aura l'avantage de garder le serveur GraphQL sans état (à l'exception des websockets) et donc facile à mettre à l'échelle horizontalement.

+0

"... Je recommande fortement d'utiliser un système différent ..." merci, j'apprécie l'info. – Sasha

+0

Cela devrait vraiment être ajouté au readme graphql-abonnements. Je ne m'en suis pas rendu compte et j'ai exécuté la configuration par défaut de EventEmitter en production pour quelques mois maintenant! (et j'ai constamment reçu des avertissements de fuite de mémoire) – mxstbr

+0

Je suis allé de l'avant et soumis un PR pour ajouter une note à ce sujet au readme du paquet: https://github.com/apollographql/graphql-subscriptions/pull/110 – mxstbr