2008-11-30 7 views
6

Nous utilisons un site de contenu à volume relativement élevé. Comme la plupart des sites de contenu, la majorité de chaque page est relativement statique. Les articles changent rarement, ce qui en fait de bons candidats pour une certaine forme de mise en cache statique/de bord. Il y a deux gros problèmes, cependant. Les éléments de page secondaire (navigation, listes de contenu récentes, etc.) changent assez fréquemment, invalidant rapidement les pages mises en cache "complètes". Il est également courant que nous incluions plus de bits dynamiques dans une page, comme des informations spécifiques à l'utilisateur, etc.Post-traitement des demandes HTTP inversées par proxy? (comme l'ESI d'Akamai)

Il serait vraiment intéressant d'avoir un reverse-proxy/équilibreur de charge qui post-traitement du contenu et laissez-nous gérer inclut à le proxy/bord. La demande initiale au backend renverrait un modèle approximatif, puis le logiciel proxy pourrait traiter ce modèle pour le compléter. Le balisage pourrait ressembler à ceci:

<html> 
<body> 
    <div id="content"> 
    Lorem ipsum whackem smackem. 
    <% 
     dynamic "http://related.content.service/this/story" 
    %> 
    </div> 
    <div id="sidebar"> 
    <% 
     dynamic do |request| 
     url = "http://my.user.service/user-widget.html" 
     if request.cookies.contains?("user_token") 
      url = "http://my.user.service/" + request.cookies["user_token"] + "/user-widget.html" 
     end 

     error_text = "User service not available" 
     { :url => url, :timeout => 500, :error => error_text } 
     end 
    %> 
    </div> 
</body> 
</html> 

Ce que vous verrez dans cet exemple est un petit peu de Ruby qui détermine le fichier inclus sur la base d'une valeur de cookie, puis retourne un hachage avec l'URL de tirer dans , un délai et un texte par défaut à afficher en cas d'erreur. En théorie, tous les inclusions pourraient également être demandés de manière asynchrone.

Ma compréhension est que Amazon fait quelque chose comme ça. Divers composants de page sont générés par les services backend, avec des limites de délai strictes pour assurer la vitesse globale de la page. J'espérais que leur service CDN inclurait quelque chose comme ça, mais ce n'est pas le cas!

Il ya une spécification W3 pour Edge Side Includes (ESI) est presque ce que je veux. Cependant, il y a très peu de soutien. Il est disponible via Akamai, il y a un logiciel Oracle qui le fait, et le cache Varnish open source a une implémentation très basique. C'est aussi un format XML vraiment moche.

Alors la question est: qu'est-ce qui va me permettre de faire ce que je veux? Est-ce que quelqu'un d'autre fait les choses de cette façon?

Répondre

2

Définissez Nginx en tant que frontal et utilisez SSI pour sélectionner les parties dynamiques des pages. source dynamique peut être un serveur HTTP, comme Apache, ou un serveur FastCGI, par exemple PHP, ou Django.

modifier:

De nombreux serveurs Web prennent en charge une certaine forme de SSI (Server Side Includes), cette fonction vous permet d'ajouter des balises dans le code HTML comme une forme très limitée de scripts, beaucoup plus simple et plus rapide (et plus) que PHP. En utilisant cela, vous pouvez définir des pages statiques avec la plupart du contenu, et pour les «petites parties dynamiques», une étiquette SSI fait référence à une page dynamique générée ailleurs.

J'aime particulièrement nginx comme interface pour presque tout. C'est rapide, léger sur les ressources et extrêmement évolutif (pensez à Lighthttp avec un code plus propre et plus stable). l'auteur ne le décrit pas comme un serveur Web à usage général; mais en tant que proxy proxy. Les backends peuvent être un serveur HTTP (généralement Apache) ou des processus FastCGI (PHP, Python, Perl, peu importe), ou une ferme de l'un ou des deux. Le module memcached est étonnant, il utilise memcached (qui est la hashtable distribuée la plus rapide et la plus évolutive qui soit) pour relier directement une page Web à une URL, sans accès au disque. Comme memcached est accessible depuis l'extérieur du serveur Web, il peut être utilisé même avec des pages dynamiques (avec un mappage URL/ressource sain); mais je ne pense pas que cela aiderait beaucoup dans votre cas. dans tous les cas, commencez par le faire fonctionner avec SSI, puis vous pouvez (si nécessaire) optimiser la partie dynamique avec memcached.

+0

Pouvez-vous développer cette réponse? Cela ne semble pas me donner beaucoup de ce que je veux, mais il est possible qu'il me manque quelque chose. – MrKurt

+0

Ah, c'est un peu plus utile. Rappelez-vous que les «choses» que SSI peut insérer dans la page entière peuvent être générées de manière dynamique par n'importe quel type de scénario qui m'intéresse. – MrKurt

+0

serveur principal. – Javier

1

Je sais que quelques personnes ont écrit sur l'utilisation de nginx SSI avec le module memcache nginx pour assembler des fragments de contenu. C'est beaucoup plus limité que quelque chose comme ESI, mais toujours utile.

2

Il s'avère donc que Varnish a (et avait) un support de base ESI qui fait presque tout ce que je voulais. Si quelqu'un doit faire quelques trucs ESI, Varnish semble fonctionner plutôt bien pour ça. C'est assez basique, mais toujours génial.

1

Akamai propose une solution Edge Computing qui permet à J2EE d'être exécuté sur Edge. D'autres alternatives incluent aujourd'hui n'importe quel service Cloud Computing - Rackspace et Amazon sont quelques acteurs sur ce marché. Idéalement, vous utiliseriez une combinaison de CDN et de Cloud Computing pour obtenir le résultat souhaité. En outre, vous pouvez choisir d'utiliser le contenu dynamique de manière asynchrone via un service Web après le chargement du modèle de page, puis de mettre en cache le contenu de la page statique avec le modèle HTML.

Questions connexes