0

Je cherche une solution pour ce qui semble être un problème complexe. Fondamentalement, j'ai besoin de trouver le moyen le plus rapide et le plus fiable de créer une base de données "Master" (système d'enregistrements) basée sur les données provenant de plusieurs autres systèmes d'enregistrements "Distributed". Permettez-moi de décomposer le problème: J'ai N système d'enregistrements qui ont chacun un service Web attaché et répondre aux demandes de données. Chacun des N services Web a standardisé le schéma d'objet de réponse, de sorte que le schéma de données de réponse XML/JSON est exactement le même pour chaque service Web. La mission est de créer une seule base de données "Master" qui reflète le système d'enregistrements N le plus rapidement possible. (Fondamentalement, une fusion de toutes les N bases de données périodiquement à travers une procédure/application/programme/etc.).Comment répliquer/fusionner plusieurs systèmes de bases de données d'enregistrements dans un système maître de base de données d'enregistrements

La seule façon d'obtenir les données de chacun des systèmes d'enregistrements "distribués" consiste à interagir avec leurs services Web respectifs. C'est la norme mondiale convenue par tout le système N des propriétaires de disques.

Quelle est la manière la plus efficace de résoudre ce problème?

Voici une approche qui a été considéré, mais je pense que cette approche n'est pas optimale: Création d'un programme C# qui demandera en même temps/asynchrounously données de chacun des services Web, et pousser ces données dans un environnement de mise en scène dans Serveur SQL. SQL Server exécutera ensuite des procédures pour fusionner ces données dans une base de données master (actuellement cela prendrait 17 heures à compléter, évidemment c'est long)

Voici un dessin de base des parties mobiles, le "??" au milieu représente la solution Here is a basic drawing of the moving parts, the "??" in the middle represents the solution

+0

Votre approche semble bien, mais votre question manque de détails. Vous avez écrit que cette approche prend environ 17 heures à compléter. Combien d'enregistrements sont transférés pendant cette période? où sont les goulots de la bouteille? Comment envoyez-vous les enregistrements à votre serveur SQL principal? –

+0

Salut Zohar, L'approche que j'utilise fonctionne, mais ne me semble pas optimale. Oui, dans les 17 heures, environ 159273 enregistrements sont enregistrés dans la base de données. Le plus gros goulot d'étranglement à l'heure actuelle avec la solution actuelle est que les requêtes aux services Web prennent quelques secondes par requête, par conséquent, le temps total à traiter est d'environ 17 heures. Je peux utiliser la bibliothèque parallèle de tâches TPL dans C# pour utiliser des threads multiples pour les requêtes, mais j'ai toujours l'impression que la solution est plus compliquée qu'elle ne devrait l'être. Qu'est-ce que tu penses? Encore une fois, le but est de minimiser le "temps total à synchroniser" – joey

+0

Ma meilleure solution à cela, sans explorer les files d'attente et "concurrence des consommateurs" modèle est d'utiliser Task Parallel Library, est de regrouper tous les URI qui devront être demandés les services Web XML, créer des tâches (peut-être des lots de 100 à la fois) et exécuter les demandes GET en parallèle. Cela réduirait le temps passé de 17 heures (série de demandes) à beaucoup moins, peut-être moins de 2 heures (demandes en cours en parallèle) – joey

Répondre

0

Merci Zohar. Il s'avère que je vais toujours attaquer ce problème avec Task Parallel Library. Je vais continuer à utiliser des tâches, mais j'ai décidé de créer un lot de tâches (5-10) qui s'exécutent toutes en async, puis fonctionnent avec une ConcurrentQueue pour toutes les URLs web. Cela me permettra de minimiser le temps.

Il y a certainement une bonne raison de se concentrer sur les "goulots d'étranglement", et chaque serveur web a des "taux de goulot d'étranglement" différents (faute de meilleurs mots). Je vais configurer mon algorithme créer un nombre N de tâches, avec N étant associé et configurable au service web. Ainsi, par exemple, si le service Web 1 est très performant, je vais créer plus de tâches (threads) pour exécuter les requêtes en parallèle. Je vous remercie.