Je suis en train de refactoriser un système analytique qui fera beaucoup de calculs, et j'ai besoin de quelques idées sur des conceptions architecturales possibles pour un problème de cohérence des données auquel je suis confronté.Conception architecturale pour la cohérence des données sur un système analytique distribué
architecture actuelle
J'ai un système de file d'attente, dans lequel les différentes applications demandant de créer des messages qui sont finalement consommés par les travailleurs.
Chaque « Demande App » se décompose un grand calcul en petits morceaux qui seront envoyés à la file d'attente et traitées par les travailleurs .
Lorsque toutes les pièces sont terminées, l'"Application qui demande" consolidera les résultats.
En outre, les travailleurs consomment des informations à partir d'une base de données centralisée (SQL Server) afin de traiter les demandes (Important: les travailleurs ne changent pas de données sur la base de données, n'ingèrent il).
Problème
Ok. Jusqu'ici tout va bien. Le problème se pose lorsque nous incluons un service Web qui met à jour les informations sur la base de données. Cela peut arriver à n'importe quel moment, mais il est essentiel que chaque "grand calcul" provenant de la même "application demandant" voit les mêmes données sur la base de données.
Par exemple:
- App A génère des messages A1 et A2, en l'envoyant à la file d'attente
- travailleur W1 capte un message A1 pour le traitement.
- Le serveur Web met à jour la base de données en passant de l'état S0 à S1.
- travailleur W2 récupère un message A2 pour le traitement
Je ne peux pas juste ai travailleur W2 en utilisant l'état S1 de la base de données. pour que tout le calcul soit cohérent, il faut utiliser l'état S0 précédent.
Pensées
Un motif de verrouillage pour empêcher le serveur Web de modifier la base de données alors qu'il ya une information consommation des travailleurs de celui-ci.
- contre: Le verrou pourrait être sur pendant longtemps, puisque la forme de calcul différents "Demander Apps" peuvent se chevaucher (A1, B1, A2, B2, C1, B3, etc.).
Créer nouvelle couche entre la base de données et les travailleurs (un serveur qui contrôle la mise en cache db par req app.)
- contre: Ajout d'une autre couche peut imposer des frais généraux importants (peut-être?), et c'est beaucoup de travail, car je vais devoir réécrire la persistance des travailleurs (beaucoup de code).
Je suis en attente pour la deuxième solution, mais pas très confiant à ce sujet.
Des idées brillantes? Est-ce que je le conçois mal, ou manque quelque chose?
OBS:
- Ceci est un énorme système existant 2 niveaux (en C#) que nous essayons de évoluer vers une solution plus évolutive avec un effort aussi minime que possible .
- Chaque agent s'exécute potentiellement sur différents serveurs.
Sonne énormément comme carte/réduire à moi. Pourquoi écrirais-tu une telle chose toi-même? Je voudrais juste utiliser Hadoop. – duffymo
J'ai oublié de mentionner qu'il s'agit d'un énorme système hérité à deux niveaux (en C#) que nous essayons d'évoluer vers une solution plus évolutive avec le moins d'effort possible. Je crois que tout changer pour hadoop sera une tâche énorme. –
Plus massif que l'écriture, le débogage et le maintien de ce que fait déjà Hadoop? Je serais sûr avant de commettre. – duffymo