web-dev-qa-db-fra.com

Dois-je réellement besoin d'un courtier de messages ou des webockets suffisamment?

Le site Web que je consomme a une composante de messagerie en temps réel. Le backend est construit avec Flask et j'ai intégré Flack-socketo pour gérer les connexions WebSocket lorsque les utilisateurs figurent sur la page de messagerie.

Mon infrastructure actuelle est assez simple. =Flask gère les requêtes HTTP et les événements de Websocket. Lorsque les utilisateurs atterrissent sur la page Messages, le client envoie un GET /message_history Demande puis ouvre une connexion à la prise.

enter image description here

Lorsque Alice envoie un message à Bob, le serveur gère l'événement, vérifie que Alice est connectée et est autorisée à parler à Bob, puis stocke le message dans la base de données et émet enfin le message à ALICE et BOB, dont les clients sont écouter des événements du serveur.

Cela fonctionne bien dans le développement mais pour la production, j'ai besoin de modifier.

Principalement, cela ne fonctionnera pas sous un équilibreur de charge. Selon le Flacon-Socketio Docs :

Il existe deux exigences pour utiliser plusieurs travailleurs de Flack-Socketo:

  • L'équilibreur de charge doit être configuré pour transmettre toutes les demandes HTTP d'un client donné toujours au même travailleur. Ceci est parfois référencé comme "sessions collantes".

  • Étant donné que chacun des serveurs ne possède qu'un sous-ensemble des connexions clientes, une file d'attente de messages tels que REDIS ou RabbitMQ est utilisée par les serveurs pour coordonner des opérations complexes telles que la radiodiffusion et les chambres.

Cependant, je ne comprends pas tout à fait comment mettre en œuvre Redis ou Rabbitmq dans le cadre de mes gestionnaires d'événements actuels, car les clients ne se connectent pas directement à ReDIS/RabbitMQ. Le Flask Server aura toujours besoin d'être l'intermédiaire car il doit effectuer des contrôles et stocker les messages dans la base de données.

Jetez un coup d'œil à cette réponse sur SO:

Redis Pub/Sub est génial au cas où tous les clients ont un accès direct à Redis. Si vous avez plusieurs serveurs de nœuds, on peut pousser un message aux autres.

Mais si vous avez également des clients dans le navigateur, vous avez besoin de quelque chose d'autre pour appuyer sur les données d'un serveur à un client, et dans ce cas, Socket.io est super.

Maintenant, si vous utilisez Socket.io avec le magasin Redis, Socket.io utilisera Redis Pub/Sub sous le capot pour propager des messages entre serveurs et serveurs propagera des messages aux clients.


ÉDITER

J'ai suivi les docs: j'ai Redis exécutant localement, j'ai installé les dépendances et l'événement correct de singe. J'ai tout couru et ça marche ...? Je vois que Redis reçoit "S'abonner" et "Publier" Événements ...

  1. Est-ce que j'ai encore besoin de ma base de données PSQL? Puis-je utiliser le magasin Redis pour chercher des messages historiques? Que se passe-t-il si l'instance Redis meurt?

  2. Si j'exécute cela sous un équilibreur de charge et que vous avez configuré des sessions collantes, redis (ou flacez-vous?) Savez-vous automatiquement comment distribuer les messages aux nœuds appropriés?

4
turnip

À un niveau élevé, dans votre conception, la base de données PostgreSQL est debout pour le système de cache de Redis et/ou de messagerie.

Cela peut être fait pour travailler mais vous pourriez rencontrer des problèmes d'évolutivité. Lorsque vous utilisez une base de données comme système de messagerie, la gestion de l'état des messages devient problématique. Par exemple, lorsque vous créez un nouveau message à envoyer, vous souhaitez vous assurer qu'un seul gestionnaire récupère ce message et le délivre. Cette coordination n'est pas quelque chose que DBS a tendance à fournir par défaut. Vous pouvez utiliser divers schémas, mais si vous utilisez une plate-forme de messagerie, une fonctionnalité inhérente.

2
JimmyJames