Comment sont Node.js + Socket.io+MongoDB webapps vraiment asynchrone?

j'ai une bonne vieille webapp de lampe. Il y a une semaine, j'avais besoin d'y ajouter un mécanisme de notification.

Par conséquent, ce que j'ai fait était d'ajouter node.js + socket.io sur le serveur et sonder la base de données MySQL toutes les 10 secondes à l'aide de node.js pour vérifier s'il y avait de nouveaux éléments: si oui, je les aurais envoyés au(X) client (s) avec socket.io.

J'ai été assez satisfait du résultat, même si ce n'est pas une notification en temps réel appropriée (car il ya une retard de jusqu'à 10 secondes).

maintenant, je suis sur le point de construire une nouvelle webapp qui aura besoin des notifications push, aussi. Je me demande s'il faut suivre la même approche que la première (que je crois plus stable et mature) ou aller totalement noeud.js, sans PHP et Apache. En ce qui concerne la base de données, J'ai déjà décidé D'opter pour MongoDB.

Enfin, ma question est: si je pars pour Node.js+Socket.io+MongoDB, je reçois un vraiment en temps quasi-réel webapp? Je veux dire, dès qu'un nouvel enregistrement est inséré dans MongoDB, il y aura une sorte d'événement déclenché que je puisse les attraper par nœud.js, faites quelques vérifications et, le cas échéant, envoyez la notification au client? Ou y aura-t-il quand même une sorte de sondage sur le côté serveur et le lag de la base de données, comme avec ma première webapp de lampe?

une question connexe: pouvez-vous construire une webapp en temps réel sur MySQL sans faire de sondage comme je l'ai fait avec mon première application. Ou avez-vous besoin de MongoDB (ou Redis)?

j'espère que cette question n'est pas trop stupide - désolé, je commence juste avec Node.js et co.

Merci.

22
demandé sur Adam Gent 2012-10-19 20:04:44

6 réponses

je comprends votre problème parce que je suis passé au noeud .js à partir de php/apache/mysql .

  • généralement noeud.js est stable, les modules et vos scripts sont les principales raisons des erreurs

  • le temps réel n'a rien à voir avec la base de données, tout est sur le client et le serveur, vous pouvez interroger autant de données que vous voulez dans vos demandes et de le pousser à la autre client.

  • noeud de choix.js est très sage, mais c'est plus difficile à mettre en œuvre.

  • lorsque vous insérez un nouvel enregistrement dans votre base de données, l'événement est la requête elle-même, vous allez faire un événement push avec la requête de la base de données quelque chose comme:

    // Please note this is not real code, just an example of the idea
    app.get('/query', function(request, response){
        // Query your database
        db.query('SELECT * FROM users', function(rows){
    
             // Push notification to dan
             socket.emit('database_query_executed', 'to_dan', rows); 
    
             // End request
             response.end('success'); 
    
        })   
    })
    
  • bien sûr, vous pouvez utiliser MySQL! Et toute base de données que vous voulez, comme je l'ai dit en temps réel n'a rien à voir avec bases de données parce que la base de données est au milieu du processus et il est totalement facultatif.

  • si vous voulez utiliser noeud.js pour notifications push et php/apache pour mysql , alors vous aurez besoin de créer 2 requêtes pour chaque serveur quelque chose comme:

    // this is javascript
    ajax('http://node.yoursite.com/push', node_options)
    ajax('http://php.yoursite.com/mysql_query', php_options)
    

    ou si vous voulez juste une demande, ou si vous souhaitez utiliser un formulaire, vous pouvez appeler votre php et à l'intérieur de php vous pouvez créer une requête http ou net à noeud.js de php, quelque chose comme:

    // this is php
    new HttpRequest('http://node.youtsite.com/push', HttpRequest::METH_GET);
    
16
répondu Adam 2012-10-21 21:59:07

utilisant:

  • régulièrement Collection MongoDB comme le Magasin ,
  • Un MongoDB Plafonné Collection avec Tailable Curseurs comme le File d'attente ,
  • a Node worker with Socket.Io regardant la Queue comme le Ouvrier ,
  • un serveur de noeuds pour servir la page avec la Socket.Io client, et de recevoir des données postées (ou bien les données sont ajoutées) comme le serveur

Il va comme:

  1. Les nouvelles données sont envoyées au Serveur,
  2. le serveur met les données dans le magasin,
  3. le serveur ajoute L'ObjectID des données à la file d'attente,
  4. La File d'attente va envoyer le nouvellement arrivés ObjectID à l'open Tailable Curseur sur le Travailleur,
  5. le Travailleur va et reçoit les données réelles dans le champ ObjectID de la Boutique,
  6. le travailleur émet les données à travers la prise,
  7. le client reçoit les données de la socket.

c'est 'push' de l'ajout initial des données jusqu'à la réception au client - pas de sondage, de sorte que le temps de traitement en temps réel que vous pouvez obtenir donné à chaque étape.

7
répondu floatingLomas 2012-10-25 21:52:03

Re: les déclencheurs de MongoDB - s'il vous plaît voir cette réponse: https://stackoverflow.com/a/12405093/1651408

il y a des déclencheurs beaucoup plus commodes dans MySQL, mais pour appeler le noeud.js à partir d'eux nécessiterait un peu de travail avec MySQL UDFs ( fonctions définies par l'utilisateur ), par exemple en poussant des données à travers une socket Unix. S'il vous plaît noter que cela est nécessaire seulement lorsque d'autres applications (en dehors de votre noeud.processus js) sont en train de mettre à jour le base de données, et assurez - vous de choisir InnoDB comme stockage dans ce cas (row-vs. table-level locking).

ne voit pas de gros problème avec votre choix de technologie de sockets.io , même si les sockets côté client ne sont pas pris en charge , vous vous replierez (avec grâce, j'espère) à un sondage.

enfin, votre question n'est pas idiote du tout, puisque la technologie push est certainement supérieure au flot de demandes de vote - elle balance mieux. MODIFIER: Cependant, ne décrirait pas l'une ou l'autre technologie comme temps réel .

un autre EDIT: pour une installation bien connue et réussie de ce genre s'il vous plaît lire ceci: http://blog.fogcreek.com/the-trello-tech-stack /

2
répondu Deer Hunter 2017-05-23 10:29:37

avez-vous découvert Chole ? Il fonctionne séparément de votre serveur web et se connecte avec lui en utilisant des messages HTTP. De cette façon, vous pouvez coder votre application web comme vous le souhaitez.

2
répondu Gaelan 2012-10-27 03:54:43

utilisant en fait la technologie Push comme Socket.IO vous aide à utiliser

la ressource du serveur efficacement et vous aide également à tirer parti des vieux navigateurs pour les navigateurs modernes faisant websocket ou WebSocket-comme la connexion.

sondage 10 sec est une requête HTTP qui est cher surtout quand beaucoup d'utilisateurs présents.

contrairement à la technologie de sondage, La technologie push est relativement bon marché. le client des utilisateurs ouvre une socket dédiée (c.-à-d. websocket) pour écouter la notification push du serveur.

et habituellement votre JavaScript côté client font quelques actions quand la notification push est reçue.

en utilisant la pile et la prise de courant de la lampe .IO avec un port différent (autre que 80) sera assez bon pour mettre en œuvre ce que vous avez besoin.

But Utilisation du noeud.js + MongoDB + Socket.IO vous aide à gérer efficacement les ressources de votre serveur.

parce que ces trois-là ont un caractère non-bloquant.

si vous comprenez le concept de non-blocage correctement et mettre en œuvre votre application de manière appropriée,

votre application identique, une application avec la même fonctionnalité mais avec un langage différent et une base de données différente, serait capable de traiter beaucoup plus de requêtes que la pile de lampes générale.


enter image description here

l'image ci-dessus est un tableau célèbre de comparaison non-blocage vs Thread façon de gérer la concurrence

Apache (Thread) vs Nginx (Non-blocking)


MySQL est une base de données. Je crois que vous n'aurez pas besoin de join et transactions pour la notification en temps réel.

MongoDB n'a pas ces deux fonctionnalités à moins que vous implémentiez vous-même des fonctionnalités similaires.

N'ayant pas ces deux caractéristiques et certaines de ses propres, MongoDB peut stocker et récupérer des données beaucoup plus rapidement que les bases de données SQL traditionnelles.

passer de MySQL à MongoDB réduira le temps d'insertion et de récupération des données.

1
répondu InspiredJW 2012-10-25 01:28:49

avec JS vous pouvez ouvrir une socket à votre serveur (pas un vieux navigateur), le serveur aura un programme ah-hoc (sur un port ad-hoc, donc vous avez besoin de la permission d'ouvrir la porte et exécuter le programme sur votre serveur) qui enverra des données (presque) en temps réel à partir et vers le client, et sans le protocole de HTTP overhead.l'ancien navigateur retombera simplement sur le mécanisme de sondage.

je ne vois pas d'autre moyen de le faire (il y a probablement déjà "coocked" cadre de le faire)

0
répondu Lesto 2012-10-19 16:12:11