Cluster mongrel et status 304 (Not Modified)

Bonjour à tous,

Depuis ce matin, je cherche en vain à faire fonctionner le revois du
status 304 (Not Modified) sur mon projet rails.

J’ai découvert cette méthode en visualisant un slide sur Memcached [1],
l’auteur procédait en comparant une chaine md5 avec le
header[‘If-None-Match’].
Après avoir testé de mon coté (sur Webrick en développement, et avec un
cluster mongrel en production), je n’ai toujours pas réussi à faire
fonctionner ce morceaux de code[2].

Après quelques recherches sur Google, j’ai cru comprendre que les status
304 étaient gérés automatique, mais je ne suis pas sur d’avoir tout
compris.
Quelqu’un pourrait-il m’éclairer sur le sujet?

Merci d’avance.

[1] (slides 49 et suiv.)


[2] http://pastie.org/243094

Salut,

Le status 304 devrait etre gere automatiquement pour toi, mais bon, je
ne connais pas ton environnement… Tu peux, dans certains cas,
vouloir ameliorer le mecanisme de cache, mais c’est pas un sujet
facile.

Koz avait fait un post il y a qq temps sur le sujet:
http://www.koziarski.net/archives/2007/5/28/clever-caching

Extrait: “cache invalidation is one of the two hard things in computer
science. If you could somehow avoid expiring all the ‘stuff’ you’re
caching, your life would be much much easier.”

Bonne chance!

Cyrille

Merci de ta réponse Cyrille.

J’ai lu attentivement le post que tu m’as conseillé, et j’y regarderai
de plus près quand j’aurais un moment.

Ceci dit, je n’ai pas l’impression que le status 304 fonctionne dans mon
environement, car je peux recharcher plusieures fois la même page (en
développement comme en production), j’ai toujours un status 200 comme
réponse.

Y a-t-il un moyen de m’assurer que cela fonctionne?

Je ne suis pas sur que l’on parle de la meme chose.

Il va falloir que tu nous decrives un peu plus en detail ton
environnement et ce que tu cherches a realiser.

La 1ere question que j’aurais: est-ce qu’il y a un probleme de
performance? tu l’as identifie et quantifie?

S’il n’y a pas de probleme, mais que tu veux faire au mieux… Le
mieux, c’est de rien faire!

S’il y a un pb de perf, commence a regarder du cote du caching dans
Rails: tu peux cacher des fragments, etc. Et les dernieres versions de
Rails ont meme une integration directe avec memcache.

Enfin, en general, tu veux que ton serveur reponde 304 pour des
resources qui changent peu (images, fichiers JS, etc.) Une page
entiere est en general compose de multiples morceaux et il est trop
difficile de savoir si qqchose a changer. A moins que tu aies des
pages statiques, mais la, t’as pas besoin de Rails: tu peux les servir
direct avec Apache…

Voila, si je suis completement a cote, decris nous ton environnement
plus en detail.

Cyrille

Le 29 juillet 2008 12:29, Céd B. a écrit :

Depuis ce matin, je cherche en vain à faire fonctionner le revois du
status 304 (Not Modified) sur mon projet rails.

J’ai découvert cette méthode en visualisant un slide sur Memcached [1],
l’auteur procédait en comparant une chaine md5 avec le
header[‘If-None-Match’].
Après avoir testé de mon coté (sur Webrick en développement, et avec un
cluster mongrel en production), je n’ai toujours pas réussi à faire
fonctionner ce morceaux de code[2].

http://pastie.org/243094

pour moi il y a une erreur au niveau de request[‘If-None-Match’]
utilise plutôt : request.env[‘HTTP_IF_NONE_MATCH’]

voir le pastie :

http://pastie.org/pastes/244125

(code pas testé car j’ai un peu la flemme)

Après quelques recherches sur Google, j’ai cru comprendre que les status
304 étaient gérés automatique, mais je ne suis pas sur d’avoir tout
compris.

Oui c’est déjà géré par Rails, voir :

http://api.rubyonrails.org/classes/ActionController/Base.html#M000848

extrait :

"Automatic etagging

Rendering will automatically insert the etag header on 200 OK responses.
The etag is calculated using MD5 of the response body. If a request
comes in that has a matching etag, the response will be changed to
a 304 Not Modified and the response body will be set to an empty
string. No etag header will be inserted if it’s already set."

Quelqu’un pourrait-il m’éclairer sur le sujet?

[2] http://pastie.org/243094

si c’est toujours pas clair, reprécise ta question.

– Jean-François.


http://twitter.com/underflow_

Il n’y a pas réellement de problème de performance, mais le site étant
appellé (je l’espère) à avoir du succès, j’aimerai bien pouvoir
l’optimiser dès maintenant pour éviter d’éventuels problèmes par après.

La plupart des pages changent très peu une fois qu’elles ont été créees,
et j’utilise déjà memcache aussi bien au niveau des appels à la base de
donnée que pour le rendu HTML, mais j’aimerai pouvoir utiliser le cache
navigateur si la page n’a pas changé entre deux appels, et visiblement,
chez moi, cela ne fonctionne pas.

Si j’exécute la commande suivante dans mon terminal [curl
http://localhost:3000 -I], voici ce que j’obtiens :

HTTP/1.1 200 OK
Cache-Control: private, max-age=0, must-revalidate
Connection: Keep-Alive
Date: Thu, 31 Jul 2008 12:23:21 GMT
Content-Type: text/html; charset=utf-8
Etag: d41d8cd98f00b204e9800998ecf8427e,
“eb7d4eb154a7aeb8f38152d8f248d5ca”
Server: WEBrick/1.3.1 (Ruby/1.8.6/2007-09-24)
X-Runtime: 0.51408
Content-Length: 44158
Set-Cookie:
_project_session_id=BAh7DiIXdmlkZW9zX2xhdGVzdF9wYWdlaQYiGmxhdGVzdF9saXN0aW5nX3Bh%0AcmFtc0M6Hkhhc2hXaXRoSW5kaWZmZXJlbnRBY2Nlc3N7CCIJdHlwZSILdmlk%0AZW9zIgthY3Rpb24iC2xhdGVzdCIPY29udHJvbGxlciIQc3VibWlzc2lvbnMi%0AEHJhbmtfZmlsdGVyaQAiHHN1Ym1pc3Npb25zX2xhdGVzdF9wYWdlaQYiG2xh%0AdGVzdF9saXN0aW5nX3Zpc2l0ZWQiG2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8i%0AGGxhdGVzdF9saXN0aW5nX3R5cGVACjoMY3NyZl9pZCIlMzkxODUyM2ZjY2U4%0AYWJhMzkwNDExOWM5OWJiMDQxMTYiGmxhdGVzdF9saXN0aW5nX2FjdGlvbkAM%0AIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVyOjpGbGFzaDo6Rmxhc2hIYXNo%0AewAGOgpAdXNlZHsA–93b383f44bb1a9d6739de3a034949a94685a5640;
path=/

Si je l’exécute une seconde fois, la page n’ayant pas changé, je
m’attend à recevoir un status 304, ce qui n’est pas le cas. Si le
Etagging fonctionnait par défaut, je ne devrais pas recevoir une
deuxième fois un status 200.

Pour finir, j’ai essayé d’obtenir la valeur de HTTP_IF_NONE_MATCH, sous
toutes les formes proposées, je n’obtiens que des chaînes vides.

Merci d’avance :slight_smile:

T’as quelle version de rails. En dessous de 2.0.2. La reponse ‘Not
Modified’ n’est pas automatique.

tu freezes rails dans vendor/rails et tu ouvres
actionpack-2.1.0/lib/action_controller/response.rb et dans la methode
handle_conditional_get! tu ajoutes:
puts non_de_variable_que_tu_veux_verifier
Tu verras la sortie dans ta console.
C’est cette methode qui gere le ETag et donc c’est la qui faut regarder.

Mon application tourne avec Rails 2.1.0

Aurais-tu une idée?

Sinon dans il arrive dans edge un mecanisme pour gérer ce genre de
cas:
http://ryandaigle.com/articles/2008/8/14/what-s-new-in-edge-rails-simpler-conditional-get-support-etags
vincent

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs