2010-08-10 2 views
2

J'ai un flux XML qui contient plus de 1000 enregistrements de propriétés (location, vente).Quelle est la meilleure façon de mettre en cache les flux XML localement?

Actuellement, je fais appel à ce flux 16x page d'accueil, retour toujours seulement 3 propriétés des critères spécifiques comme 3 nouvelle maison, 3 nouveaux appartements, etc, 5 maison recommandé, 5 appartements recommandés etc.

Ce scénario fonctionnait bien pendant 7 mois alors qu'il y avait plus de 200 propriétés et seulement 100-200 vues par jour. Il est maintenant en train de mettre en scène plus de 700 visites par jour et plus de 1000 propriétés et le téléchargement de 16 flux séparément juste pour montrer la page d'accueil devient plus lent et le trafic devient massivement plus grand. Je voudrais donc mettre en cache ces flux, je voudrais que mon 'robot' télécharge directement les flux de la source et que tous les visiteurs utilisent ma copie locale pour accélérer les choses et diminuer massivement la charge de trafic.

Je n'ai aucun problème à télécharger des fichiers XML localement et localement pour afficher des données. Mais je voudrais savoir comment résoudre les problèmes possibles comme:

  • ne pas montrer des données aux clients, car robot est mise à jour des fichiers XML et fichier d'origine serait écrasé et vide tout chargement de nouvelles données
  • utilisant un fichier XML comme locale sauvegarde, signifie que si le serveur source est la page d'accueil en mode hors connexion travaillerais encore et le chargement
  • en vous assurant que je ne vais pas les données de verrouillage pour les clients de telle sorte que robots serait incapable de mettre à jour les fichiers

Mes premiers toughts seraient travailler avec 2 fichiers XML pour la veille flux de données, un qui serait montré aux clients et un qui serait téléchargé. Si le téléchargement est correct, le fichier XML téléchargé sera utilisé en tant que données en direct et l'autre sera supprimé. Une sorte de marquage incrémental avec un fichier fonctionnant en tant que fichier contenant le nom des données réelles.

Y at-il un moyen de mettre en cache ces fichiers XML afin qu'il fasse quelque chose de similaire? Vraiment le problème principal est d'avoir une solution pare-balles pour que les clients ne voient pas les pages d'erreur ou les résultats vides.

Merci.

Répondre

1

Utilisez les options de mise en cache intégrées dans HttpWebResponse. Cela vous permet de choisir entre obtenir directement du cache (ignorer la fraîcheur), ignorer le cache, forcer le rafraîchissement du cache, forcer la revalidation du cache et le comportement normal d'utiliser le cache s'il est considéré comme récent en fonction de l'âge de la réponse originale informations, et autrement revalider.

Même si vous avez des besoins spécifiques de mise en cache qui doivent aller au-delà, construisez-le en plus de faire de la mise en cache HTTP correctement, plutôt que comme un remplacement complet.

Si vous avez besoin de gérer votre propre cache des flux XML, alors un verrouillage de fichier normal et si vraiment nécessaire, .NET ReaderWriterLockSlims devrait suffire à empêcher les différents threads de se déconner les uns les autres. Une possibilité de supprimer le risque de contention trop élevé consiste à utiliser l'accès direct par défaut en cas de conflit de cache. Considérons que la mise en cache est finalement une optimisation (conceptuellement vous obtenez le fichier "du serveur", la mise en cache rend cela plus efficace). Par conséquent, si vous ne parvenez pas à obtenir rapidement un verrou en lecture, vous pouvez revenir directement au téléchargement. Cela réduit à son tour l'attente qui peut se produire pour le verrou en écriture (car les verrous en attente ne s'empilent pas au fil du temps lorsqu'un verrou en écriture est demandé).Dans la pratique, cela n'arrivera probablement pas très souvent, mais cela vous évitera le risque d'un conflit inacceptable qui s'accumulerait autour d'un fichier et amènerait l'ensemble du système.

+0

Oh, je devrais ajouter - comme cela pourrait être pertinent ici - qu'une autre option dans le traitement de la mémoire cache normale est d'ajouter sur un degré acceptable de staleness, par ex. ("donnez-moi ceci s'il est frais, ou si vous le considéreriez normalement démodé mais périmé de moins de 4 heures"). –

+0

Serait-il possible de vérifier la taille réelle ou l'état du fichier et si cache/synchronisation seulement si elle diffère? – feronovak

+0

Ce serait, bien que vous auriez à aller plus loin que les changements peuvent (et dans la vraie vie, le font souvent) entraîner des fichiers de taille égale. Vous pouvez stocker et MD5 du fichier ou le E-tag que le WebResponse a obtenu (ce dernier est meilleur si E-tags sont envoyés, si ne pas réprimander la personne qui exécute le côté Web des choses si possible jusqu'à ce qu'ils sont) ou le dernier -mod date sur la réponse web (si les changements de sous-seconde sont impossibles dans ce système). Encore une fois, la vérification de last-mod et de etags se fait automatiquement avec l'utilisation appropriée du cache Web intégré à HttpWebResponse lorsque vous utilisez les options appropriées. –

0

Je vais commencer en supposant que vous ne possédez pas de code qui produit le flux XML source? Parce que si vous le faites, je voudrais ajouter un support spécifique pour les requêtes que vous voulez exécuter. J'ai eu un problème similaire avec un flux tiers et construit un travail qui s'exécute quelques fois par jour, télécharge le flux, l'analyse et stocke les résultats localement dans une base de données. Vous devez faire un peu de comparaison chaque fois que vous mettez à jour la base de données et ajoutez uniquement de nouveaux enregistrements et supprimez les anciens enregistrements, mais cela garantit que vous avez toujours des données à transmettre à vos clients. verrouillage de fichier.

Ensuite, je regarderais une couche de service simple pour exposer les données dans votre magasin local.

+0

Plus simple que de faire cette comparaison dans la base de données est juste d'avoir une colonne de version qui est automatiquement mis à jour à la mise à jour. Ensuite, vous pouvez l'utiliser pour la dernière valeur modifiée (si c'est une donnée et la résolution d'une seconde suffit pour votre application) et/ou pour créer l'étiquette électronique (fonctionne avec des dattes de résolution plus fine, et pour le compte de changement qui travaillera pour n'importe quelle différence de temps entre les mises à jour). –

+0

Non, je n'ai pas accès au code d'alimentation XML original. J'ai une structure et j'ai besoin de travailler avec ça. Je pense à la mise en cache toutes les 5 minutes car il y a une assez grande fluctuation des données. – feronovak

Questions connexes