Comment structurer les données envoyées du serveur à l'utilisateur?
Utilisez le modèle de messagerie . Eh bien, vous utilisez déjà un protocole de messagerie, mais je veux dire structurer les changements sous forme de messages ... spécifiquement des événements. Lorsque le côté serveur change, cela se traduit par des événements commerciaux. Dans votre scénario, les opinions de vos clients sont intéressées par ces événements. Les événements doivent contenir toutes les données pertinentes pour ce changement (pas nécessairement toutes les données de vue). La page client doit ensuite mettre à jour les parties de la vue qu'elle gère avec les données d'événement.
Par exemple, si vous mettiez à jour un symbole boursier et que l'AAPL changeait, vous ne voudriez pas baisser tous les cours des actions ou même toutes les données sur l'AAPL (nom, description, etc.). Vous ne feriez que pousser AAPL, le delta et le nouveau prix. Sur le client, vous ne mettriez alors à jour que le cours de l'action sur la vue.
Dois-je envoyer uniquement des événements comme «cette ressource a été mise à jour et vous devez la recharger via un appel AJAX» ou pousser les données mises à jour et remplacer les données précédentes chargées via les appels AJAX initiaux?
Je ne dirais ni l'un ni l'autre. Si vous envoyez l'événement, allez-y et envoyez des données pertinentes avec lui (pas les données de l'objet entier). Donnez-lui un nom pour le type d'événement qu'il s'agit. (La dénomination et les données pertinentes pour cet événement dépassent le cadre du fonctionnement mécanique du système. Cela a davantage à voir avec la façon dont la logique métier est modélisée.) Vos mises à jour de vues doivent savoir comment traduire chaque événement spécifique en un changement de vue précis (c'est-à-dire uniquement mettre à jour ce qui a changé).
Comment définir un squelette cohérent et évolutif aux données envoyées? est-ce un message de mise à jour du modèle ou "il y a eu une erreur avec blahblahblah"
Je dirais que c'est une grande question ouverte qui devrait être divisée en plusieurs autres questions et publiée séparément.
En général cependant, votre système dorsal doit créer et envoyer des événements pour les événements importants pour votre entreprise. Ceux-ci pourraient provenir de flux externes ou d'une activité dans le back-end lui-même.
Comment ne pas envoyer de données sur tout depuis n'importe où dans le backend?
Utilisez le modèle de publication / abonnement . Lorsque votre SPA charge une nouvelle page qui souhaite recevoir des mises à jour en temps réel, la page ne doit s'abonner qu'aux événements qu'il peut utiliser et appeler la logique de mise à jour de la vue au fur et à mesure que ces événements arrivent. Vous aurez probablement besoin d'une logique pub / sub activée le serveur pour réduire la charge du réseau. Il existe des bibliothèques pour Websocket pub / sub, mais je ne suis pas sûr de ce qu'elles sont dans l'écosystème Rails.
Comment réduire la duplication de la logique métier à la fois côté serveur et côté client?
Il semble que vous deviez mettre à jour les données de vue sur le client et le serveur. Je suppose que vous avez besoin des données de vue côté serveur afin d'avoir un instantané pour démarrer le client en temps réel. Étant donné qu'il y a deux langues / plates-formes impliquées (Ruby et Javascript), la logique de mise à jour de la vue devra être écrite dans les deux. Mis à part le transpiling (qui a ses propres problèmes), je ne vois pas de solution.
Point technique: la manipulation des données (voir la mise à jour) n'est pas une logique métier. Si vous parlez de validation de cas d'utilisation, cela semble inévitable, car les validations du client sont nécessaires pour une bonne expérience utilisateur, mais ne peuvent finalement pas être approuvées par le serveur.
Voici comment je vois une telle chose bien structurée.
Vues du client:
- Demande un instantané de la vue et le dernier numéro d'événement vu de la vue
- Cela préremplira la vue afin que le client n'ait pas à créer à partir de zéro.
- Pourrait être sur HTTP GET pour plus de simplicité
- Établit une connexion Websocket et s'abonne à des événements spécifiques, à partir du dernier numéro d'événement de la vue.
- Reçoit les événements via websocket et met à jour sa vue en fonction du type / des données d'événement.
Commandes client:
- Demande de modification des données (HTTP PUT / POST / DELETE)
- La réponse est seulement un succès ou un échec + erreur
- (Les événements générés par la modification surviendront via websocket et déclencheront une mise à jour de la vue.)
Le côté serveur pourrait en fait être divisé en plusieurs composants avec des responsabilités limitées. Celui qui traite simplement les demandes entrantes et crée des événements. Un autre pourrait gérer les abonnements des clients, écouter les événements (par exemple en cours) et transmettre les événements appropriés aux abonnés. Vous pouvez avoir un tiers qui écoute les événements et met à jour les vues côté serveur - cela peut même arriver avant que les abonnés ne reçoivent les événements.
Ce que j'ai décrit est une forme de messagerie CQRS + et une stratégie typique pour résoudre le type de problèmes auxquels vous êtes confronté.
Je n'ai pas apporté Event Sourcing dans cette description car je ne sais pas si c'est quelque chose que vous voulez entreprendre ou si vous en avez nécessairement besoin. Mais c'est un schéma connexe.