2010-05-14 5 views
1

Définitions: ressources = collecte d'enregistrements de base de données, régénération = traitement de ces dossiers et produire le html correspondantComment mettre en cache des pages en utilisant des tâches d'arrière-plan?

flux actuel:

  • Recevoir la demande du client
  • Vérifier pour la ressource dans le cache
  • Si non dans le cache ou le cache expiré, régénérer
  • Résultat

Le problème est que l'étape de régénération peut bloquer un processus de serveur unique pendant 10-15 secondes. Si deux utilisateurs demandent la même ressource, un couple de processus peut régénérer la même ressource simultanément, chacun prenant 10 à 15 secondes.

Ne serait-il pas préférable d'avoir le signal de frontend processus d'arrière-plan en disant "Hey, régénérer cette ressource pour moi".

Mais que montrerait-il à l'utilisateur? "Reconstruire" n'est pas acceptable. Toutes les ressources devraient être en cache à l'avance. Cela pourrait être un problème car la base de données serait presque dupliquée sur le système de fichiers (trop gros pour tenir dans la mémoire). Y a-t-il un moyen d'éviter cela? Pas idéal, mais il semble que la seule issue.

Mais il y a encore un problème. Comment empêcher les deux mêmes processus de demander la régénération d'une ressource en même temps? Le processus d'arrière-plan pourrait être la régénération de la ressource lorsqu'un frontend demande la régénération de la même ressource. J'utilise PHP et le Zend Framework juste au cas où quelqu'un voudrait offrir une solution spécifique à une plate-forme. Mais ce n'est pas important, je pense que ce problème s'applique à n'importe quel langage/cadre.

Merci!

+0

Le cache html est-il spécifique à l'utilisateur ou identique pour tous les utilisateurs? Quels sont les critères d'expiration d'un cache? Peut-être que si vous fournissez quelques détails, il serait plus facile de suggérer quelque chose dans votre cas particulier, car il est difficile de trouver une solution générique ici. – serg

Répondre

2

Varnish Avec Varnish, vous pouvez mettre en cache de façon proactive le contenu d'une page et utiliser grace pour afficher du contenu obsolète et mis en cache si une réponse ne revient pas à temps.

période de grâce Activer (vernis sert rassis (mais des objets cacheable) tout objet retriving de back-end)

Vous devrez peut-être modifier les cadrans pour déterminer les meilleurs réglages pour combien de temps pour servir le contenu périmé et combien de temps cela prend-il pour être considéré éventé, mais cela devrait marcher pour vous. Plus sur la page wiki Varnish performance.

1

Je recommande la mise en cache au niveau du serveur web plutôt que l'application

1

Je l'ai fait tout cela récemment pour deux choses différentes, dans chaque cas, les bases sont les mêmes - dans ce cas, l'info peut être pré généré avant utilisation.

Un travail PHP fonctionne régulièrement (peut-être de CRON) qui génère des informations en Memcached, qui est ensuite utilisé potentiellement des centaines de fois jusqu'à ce il est reconstruit à nouveau.

Bien qu'ils soient mis en cache pendant des périodes bien définies (que ce soit 60 minutes ou 1 minute), ils sont régénérés plus souvent que cela. Par conséquent, à moins que quelque chose ne se passe mal, ils n'expireront jamais de Memcache, car une version plus récente est mise en cache avant de pouvoir expirer. Bien sûr, vous pouvez simplement faire en sorte qu'ils n'expirent jamais.

J'ai également fait des choses similaires via une file d'attente - vous pouvez voir les questions précédentes auxquelles j'ai répondu concernant 'BeanstalkD'.

0

En fonction du contenu, jQuery.load() peut être une option. (je l'ai utilisé pour un flux twitter)

Étape 1
Afficher la version en cache de l'alimentation.

Étape 2
mise à jour du contenu de la page via jQuery.load() et mettre en cache les résultats.

.
De cette façon, la page se charge rapidement et affiche le contenu up2date (après x sec offcourse)
Mais si la reconstruction/chargement d'une page complète ne donne pas une bonne expérience utilisateur.

0

Vous décrivez quelques problèmes, peut-être quelques idées générales seraient utiles. Un problème est que votre contenu généré est trop volumineux pour être entièrement stocké. Vous ne pouvez donc mettre en cache qu'un sous-ensemble de ce contenu. Vous aurez besoin d'une méthode pour identifier de manière unique chaque objet de contenu pouvant être généré. Si un objet de contenu est déjà dans le cache, une stratégie de marquage des données dans le cache doit indiquer que la régénération de l'arrière-plan doit être exécutée et une stratégie d'expiration et de remplacement des données dans le cache. En fin de compte, garder l'identification de contenu unique simple devrait aider à la performance tandis que votre politique d'expiration des objets et de marquage des objets périmés devrait être utilisée pour définir la priorité pour la régénération en arrière-plan des objets de contenu. Il peut s'agir de simples mises à jour de votre schéma de mise en cache existant, mais d'un autre côté, il peut être plus efficace d'utiliser un progiciel spécifiquement conçu pour répondre à ce besoin car ce n'est pas un problème rare.

Un autre problème est que vous ne voulez pas dupliquer le travail pour régénérer le contenu. Si vous avez plusieurs moteurs de génération parallèles avec des capacités différentes, cela peut ne pas être si grave et il peut être préférable de mettre en file d'attente une tâche et de supprimer la tâche de toutes les autres files d'attente lorsque le premier générateur termine le travail. Envisagez de suivre l'état de l'objet lorsqu'une régénération est en cours afin que plusieurs tâches de régénération d'arrière-plan puissent être actives sans duplication involontaire du travail. Une fois de plus, cela peut être remplacé dans votre système de mise en cache existant ou géré par un logiciel de mise en cache dédié.

Un troisième problème concerne ce qu'il faut faire lorsqu'un client demande des données qui ne sont pas mises en cache et qui doivent être régénérées. Si les données doivent être entièrement régénérées, vous serez bloqué en attendant que la régénération soit terminée, pour aider à la création de contenu long, vous pouvez identifier une politique de prévisualisation prédictive des objets contenus dans le cache mais nécessite une méthode pour identifier les relations entre les objets. . Que vous souhaitiez servir une page de «régénération» au client jusqu'à ce que le contenu demandé soit disponible dépend vraiment des attentes de votre client. Envisagez des caches à plusieurs niveaux avec des archives de données compressées si la régénération du contenu ne peut pas être améliorée de 10 à 15 secondes. Faire bon usage d'un progiciel mature de mise en cache Web résoudra vraisemblablement tous ces problèmes.Nick Gerakines a mentionné Vernis qui semble être bien adapté à vos besoins.

Questions connexes