J’ai besoin d’une solution de message / mise en queue pour mon système Web

Je suis à la recherche d’une solution de message / mise en queue pour mon système Web fonctionnant sous Ubuntu.

Le système a été construit sur les technologies suivantes:

  • Javascript (framework Extjs) – Frontend
  • PHP
  • Python (service Daemon qui interagit avec le périphérique de chiffrement)
  • Python pyserial – (interactions des ports série)
  • MySQL
  • Linux – Scripts basc Ccustom (pour mettre à jour les rapports DB / mail)

Le système sert les objectives suivants:

  • Capturer des informations client sur une plateforme dissortingbuée
  • Crypter / déchiffrer des transactions sensibles à l’aide d’un périphérique matériel

Panne du système:

  1. L’utilisateur accède au système en utilisant un navigateur Web
  2. L’utilisateur capture les informations du client et, en appuyant sur le bouton “Envoyer” Les données sont envoyées au périphérique de cryptage et le système passe en attente
  3. Les données sont ensuite cryptées sur l’appareil et renvoyées au navigateur.
  4. Les données chiffrées sont enregistrées dans la firebase database
  5. Le système quitte l’état d’attente et affiche le message DONE

S’il vous plaît noter: J’ai déjà pris en charge les messages d’attente / de progression, donc laissez-le omettre.

Ce que j’ai fait jusqu’ici:

  • J’ai créé un démon python qui surveille une vue de firebase database pour toute nouvelle demande
  • Le service démon exécute de nouvelles requêtes sur le périphérique en utilisant pyserial et met à jour la table des requêtes avec une “réponse”, c.-à-d. le contenu crypté
  • J’ai créé un service d’interrogation en PHP qui vérifie fréquemment s’il y a une “réponse” dans> la table des requêtes pour la requête spécifique
  • Création de l’interface Extjs avec les messages d’état d’attente / de fin appropriés

Le problème avec la configuration actuelle:

  • Concurreny – Nous prévoyons que> 20 utilisateurs à tout moment soumettent des demandes de chiffrement / déchiffrement en utilisant une firebase database car une solution de message / mise en queue n’est pas évolutive en raison du locking des tables et d’un seul processus d’écoute
  • Service de démon – Le recours à un service de démon est un peu risqué et le surcoût de la firebase database semble un peu élevé en interrogeant la vue pour chaque nouvelle requête
  • Développement – Cela simplifierait mes tâches de développement en envoyant simplement des requêtes à un service de chiffrement / déchiffrement au lieu de faire tout ce processus d’insertion d’une requête dans la firebase database, d’interroger la réponse et de traiter la demande dans le service démon.

Ma question:

Quelle serait la solution de message / reine idéale dans cette situation? S’il vous plaît prendre en compte que mon système fonctionne exclusivement sur un Ubuntu O / S.

J’ai fait quelques services sur Google et je suis tombé sur quelque chose qui s’appelait un serveur “Stomp”, mais cela s’est avéré difficile à configurer et manquait de documentation. Aussi, je préfère les conseils de personnes qui ont une certaine expérience dans la mise en place de quelque chose comme ça au lieu d’un guide “comment faire” 🙂

Merci pour votre temps

Je crois que l’implémentation populaire de RabbitMQ d’ AMQP offre une extension PHP ( ici ) et vous pouvez certainement accéder à AMQP en Python, par exemple via Qpid . RabbitMQ est également facile à installer sur Ubuntu (ou Debian), voir par exemple ici .

Que ce soit via RabbitMQ ou autre, l’adoption d’un protocole de messagerie et de files d’attente tel que AMQP présente des avantages évidents par rapport à des solutions plus «fermées» (même si elles sont techniquement open source, elles ne proposeront pas autant , en tant que protocole standard ouvert largement adopté).

Je ferais:

  • Le composant Web se connecte au démon / service de chiffrement, envoie les données et attend la réponse

Le démon / service de chiffrement:

  • Au démarrage, démarrez un thread (SerialThread) de chacun des périphériques série disponibles.
  • Tous les “threads série” feraient alors un SerialQueue.get (en bloquant l’attente des messages)
  • Un serveur TCP multi-thread, vérifiez ThreadingMixIn à partir de http://docs.python.org/library/socketserver.html
  • Les threads TCP Server recevraient les données en clair et les placeraient sur la SerialQueue
  • Un SerialThread aléatoire (la classe Queue de Python gère le locking multi-thread requirejs pour vous) recevrait la requête, chiffrerait et renverrait les données chiffrées au thread du serveur TCP
  • Le thread du serveur TCP écrirait les données sur le composant Web

J’utilise cette logique sur un projet, vous pouvez vérifier la source sur http://bazaar.launchpad.net/~mirror-selector-devs/mirror-selector/devel/files/head:/mirrorselector/ . input est une URL, le traitement consiste à rechercher un miroir disponible, la sortie est une URL miroir.

peut-être trop tard mais essayez http://www.snakemq.net/