Pendant ce temps, à Vera Cruz


Pour une fois, ce n’est pas un article payé par Tavendo, mais bien un truc que je ponds par enthousiasme :)

Pendant qu’on en parle pas, la stack WAMP continue d’évoluer, des mises à jours significatives ayant été apportées à Crossbar.io, ainsi qu’aux libs Python et JS d’autobahn. Parmi les plus intéressantes :

  • Le code passe de la licence Apache 2 à la licence MIT, augmentant la compatibilité avec un tas d’autres licences.
  • On peut faire un SUB avec un joker, et donc lier un seul callback à plusieurs événements.
  • On peut faire un register avec un joker également.
  • On peut choisir la stratégie à appliquer si plusieurs registers sont faits sur le même nom.
  • Une meta API permet d’être prévenu quand un client fait quelque chose ou de demander l’état des nœuds en cours.

Inutile de dire que c’est trop cool.

Pour profiter de tout ça, il suffit de faire :

pip install crossbar autobahn --upgrade

Et de télécharger la nouvelle version de la dernière version de la lib JS.

Licence MIT

Auparavant le travail de Tavendo était essentiellement sous Licence Apache. Une licence libre, certes, mais qui pouvait poser problème quand on mélangeait tout ça avec d’autres licences (par exemple, elle n’est pas compatible avec la GPL2). Avec la version 0.10, le code est maintenant sous licence MIT, beaucoup plus permissive.

Joker pour les subs

Supposez que vous faites un système de jeu d’échec donc chaque coup déclenche un événement “chess.game.[id_de_partie]”. C’est pratique, car seuls les clients intéressés à cette partie vont recevoir les événements. Mais si votre serveur doit enregistrer un log de tous les coups d’une partie, il faut que chaque client envoie AUSSI les coups au serveur explicitement.

C’était en tout cas vrai avant cette mise à jour, puisque maintenant on peut spécifier des jokers dans les noms des topics au moment de l’abonnement.

Essentiellement il y a deux modes.

Le mode “prefix”, qui match tous les events qui commencent par ce nom :

session.subscribe("debut.du.nom.du.topic", callback, { match: "prefix" });
# matchera debut.du.nom.du.topic.genial et debut.du.nom.du.topic.trop.cool

Et le mode “wildcard” qui permet, un peu comme les glob Unix (mais on utilise “..” au lieu de “*””), de faire un texte à trou :

session.subscribe("nom.du.topic..general", callback, { match: "wildcard" });
# matchera "nom.du.topic.moins.general" et "nom.du.topic.oui.mon.general"

Tous les callbacks qui matchent un topic seront appelés.

Plusieurs clients pour la même procédure

On peut utiliser le même principe que pour les sub avec joker, mais pour les procédures.

session.register("debut.du.nom.de.la.procedure", callback, { match: "prefix" });    
session.register("nom.de.la.procedure..generale", callback, { match: "wildcard" });

La différence avec le subscribe, c’est que seule UNE procédure est appelée. Dans les cas simples, un match exact prend le dessus sur un prefix (et le plus long prefix gagne toujours), qui prend le dessus sur un wildcard. Crossbar n’implemente pas encore de résolution pour deux wildcards en conflits, et je ne sais pas ce qu’il fait dans ce cas.

Il est aussi possible de de définir des règles d’appels en faisant :

session.register("nom.de.la.procedure..generale", procedure1, { invoke: "regle"});

La règle peut être :

  • roundrobin: on prend la liste de clients, on regarde le dernier appelé, et on utilise le suivant.
  • random: on prend un client au hasard.
  • last: on prend le dernier client ajouté de la liste.
  • first: on prend premier client ajouté à la liste.

“roundrobin” et “random” sont pratiques pour faire du load balancing.

“last” et “first” sont pratique pour les mises à jour d’un client sans arrêter le serveur. En gros on rajoute un client, on attend un peu, “last” route tout sur le dernier client, donc le nouveau client prend les requêtes, et on peut arrêter le vieux clients sans souci.

Meta RPC

Crossbar met automatiquement à notre disposition des procédures distantes toutes faites qui donnent des informations sur l’état des clients et du routeur. Voici les RPC que vous pouvez maintenant faire :

  • wamp.session.list: lister les sessions des clients connectés au routeur.
  • wamp.session.get: obtenir les infos d’un session pour un ID en particulier.
  • wamp.session.count: obtenir le nombre de client connectés.
  • wamp.registration.lookup: absolument aucune idée.
  • wamp.registration.get: obtenir des infos sur une procédure distante enregistrée.
  • wamp.registration.list_callees: lister les clients ayant enregistré pour une procédure avec ce nom.
  • wamp.registration.count_callees: compter les clients ayant enregistré une procédure avec ce nom.
  • wamp.registration.list: lister toutes les procédures distantes disponibles.
  • wamp.registration.remove_callee: virer un client de la liste de des clients enregistrés pour cet procédure.
  • wamp.subscription.lookup: toujours aucune idée.
  • wamp.subscription.get: récupérer des infos sur l’abonnement avec cet ID.
  • wamp.subscription.list_subscribers: lister les clients qui sont abonnés à ce sujet.
  • wamp.subscription.count_subscribers: compter les clients abonnés à ce sujet.
  • wamp.subscription.match: aucune idée.
  • wamp.subscription.list: lister tous les sujets d’abonnement disponibles.
  • wamp.subscription.remove_subscriber:
  • virer un client de la liste des abonnés à ce sujet.

En gros, si vous voulez faire une admin qui vous permet de killer certains client ou rechercher si des events existent, vous utilisez ça.

Meta SUB

De même, le routeur envoie maintenant des publications sur des sujets concernant le cycle son cycle de vie et celui des clients. On peut donc s’abonner à ces meta topic pour réagir à l’activité de son système :

  • wamp.session.on_join : un client s’est connecté au routeur.
  • wamp.session.on_leave : un client s’est déconnecté du routeur.
  • wamp.subscription.on_create : un nouveau topic existe.
  • wamp.subscription.on_subscribe : un client s’est abonné à un topic.
  • wamp.subscription.on_unsubscribe : un client s’est désabonné à un topic.
  • wamp.subscription.on_delete : un topic est retiré de la liste des topics disponibles.
  • wamp.registration.on_create : une procédure distante porte ce nom pour la première fois.
  • wamp.registration.on_register : un client propose ajoute un callable pour ce nom de procédure distante..
  • wamp.registration.on_unregister : un client retire son callable pour ce nom de procédure distante.
  • wamp.registration.on_delete : le nom de cette procédure n’a plus aucun callable lié.
  • wamp.schema.on_define : aucune idée.
  • wamp.schema.on_undefine : kamolox.

Ce genre de truc est idéal pour faire un petit outil de monitoring pour son archi et voir ce qui se passe en temps réel.

Le HTTP bridge est complet

Le bridge HTTP propose maintenant PUB/SUB, et tout RPC. On peut donc maintenant utiliser crossbar depuis n’importe quel app qui peut faire du HTTP : flask, pyramid, ruby on rails, du PHP pur, wget en ligne de commande et tout le bordel. C’est plus verbeux, mais ça dépanne bien.

8 thoughts on “Pendant ce temps, à Vera Cruz

  • buffalo974

    Un exercice sur ce thème pour “débutants+” ou “intermédiaires” ?

    ça m’intéresse mais ça semble tellement loin…ça fait tourner des gros trucs IRL mais avec un exemple sur un mini-tchat ou un jeu de dada ?

  • Sam Post author

    Ca pourrait être une série d’articles sympas : prendre un exo simple, et le complexifier, encore et encore.

  • foxmask

    J’ai démarré une série de billets orientée noob +++ mais j’aurai pas la pédagogie de sam en tout cas , mais au moins c’est du concret parce que je m’en sers(virais sous peu) avec un projet existant. Et concrètement, quand on voit le résultat ça fait “mouhahaha putain trop bon !”

  • buffalo974

    Je viens d’avoir Tornado via Anaconda, ça marcherait avec ça ? ( jsuis pas prêt pour django ou twisted).

    C’est cool le concept du programme naz qu’on améliore étape par étape.

    Les débutants sont pas largués d’emblée et ils “rattrapent” le savoir-faire des seniors.

    Une page satellite entre le Sametmax et Indexerror, ça ferait comme un pont entre la veille technologique et les sauvetages en haute mer.

    Un simple lien github avec un fork pour chaque micro-équipe ?

  • Sam Post author

    Ca marche avec cyclone, qui fait tourner tornado sur l’event loop de twisted. Mais pas sur l’event loop de tornado directement.

    Pour le reste, j’ai rien compris.

  • buffalo974

    Par exemple, tu propose un challenge “facile” genre :

    1-vous prenez tkinter

    2-vous faites un jeu de l’oie tout con

    3- Mettez un tchat entre joueurs connectés.

    4-un serveur pour héberger la partie en utilisant le websocket, sauver les scores.

    ===> Ce défi python, tu l’ écris sur un fichier txt que tu colles dans github, tu pointes l’adresse quelquepart dans ton blog (genre HORS DU BLOG, en dessous de

    “Fork me, I’m famous (github)”.

    ===> Ensuite t’attend de voir ce qui se passe. On regarde si darwin avait raison.

  • foxmask

    @sam on va bien finir par spread ze world. J’aimerai bien que vaynel s’y mette aussi , il m’a beaucoup aide sur indexerror.net

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.