|
From: | Nicolas CUNIN |
Subject: | [sdx-developers] compression Gzip |
Date: | Wed, 17 Aug 2005 16:02:57 +0200 |
Bonjour,
Jai essayé dimplémenter la compression Gzip pour lOAI pour des besoins de performance. Jarrive en fin de stage, je tiens donc à informer de ce que jai fait jusquà présent pour que cela puisse être poursuivi. Je nai malheureusement pas eu le temps daller jusquau bout bien que la dernière phase ne doive pas être trop compliquée.
Les trois aspects sont dune part lentrepôt qui doit renvoyer du Gzip si on lui en fait la demande avec un entête http de ce type :
Accept-encoding = gzip
Et lors du renvoie de la donnée compressée, il doit en informer le client avec un autre entête http :
Content-Encoding = gzip
Lautre aspect est la moissonneuse qui doit envoyer le premier entête et pouvoir récupérer du Gzip.
Enfin, le dernier aspect est tout simplement la réponse du verbe Identify qui doit renvoyer deux balises compression avec au milieu le Gzip qui va à présent être accepté.
Jai donc naturellement fait des recherches sur Internet pour implémenter ça au niveau de cocoon (à la suite de conseils de Martin et Pierrick), jai alors trouvé deux sites dont le deuxième ma semblé complet et plus pertinent, en voici ladresse :
http://wiki.apache.org/cocoon/GzipPipeline
(le premier étant celui d'un serializerGzip qui est en lien sur ce site)
1) Lentrepôt :
Première étape, mettre les deux fichiers java dans les sources du projet sachant quil ne faut pas les mettre la où cest préconisé car la compilation ne soccupera pas de ce dossier, il faut les mettre dans le dossier src\java\fr\gouv\culture et donc faire les modifications nécessaires dans les deux fichiers java (changement du nom de package).
Ensuite, il faut déclarer le pipe et laction dans sitemap.xmap qui est sous la racine de lapplication.
<map:action name="gzip" logger="pipe.gzip" src=""/>
à A mettre entre les 2 balises actions
<map:pipe name="gzip-no-cache" src="" logger="pipe.gzip"/>
à A mettre entre les 2 balises pipes, indiquer également que le pipe par défaut est celui-ci ("gzip-no-cache")
<map:pipeline type="gzip-no-cache">
<map:match pattern="sdx/oai/*/*">
<map:act type="gzip"/>
</map:match>
</map:pipeline>
à A mettre entre sous la balise pipelines
Jai pu relever un taux de compression de lordre de 80% ce qui est très correct et peut être très utile pour la première moisson qui peut récolter énormément denregistrements.
Pour ce qui est des temps, ils ne sont pas probants pour deux raisons dont la plus importante est le fait que mes tests ont été faits sur un réseau local, il ny avait donc pas de problèmes de congestion, de chemin long parcourir, etc. La seconde raison est le faible nombre denregistrements : 203, comparé aux milliers quil est possible de télécharger.
Il est à noter que ce pipeline peut aussi être utilisé pour compresser dautres fichiers comme les fichiers xsp si ceux-ci sont de taille trop importante, il suffira alors dajouter un match avec le chemin du fichier approprié.
2) La moissonneuse
Les fichiers précédemment cités gèrent également la réception des données au format Gzip, il ne devrait donc pas y avoir de problème quant à la réception. Mais pour recevoir ces données, il faut envoyer lentête http "accept-encoding = gzip", jai donc cherché dans le code de SDX où je pouvais limplémenter, en suivant lacheminement de lutilisation de la requête, je suis arrivé dans la fonction receiveRequest dans la classe AbstractOAIHarvester dans le package fr.gouv.culture.oai. Jai alors vu un certain sp.put(HTTP_HEADER_NAME_USER_AGENT), jai donc eu beaucoup despoir quant à la facilité dimplémentation de mon entête HTTP mais en regardant ce qui se passait dans la classe URLSource du package org.apache.excalibur.source.impl, jai pu voir que cette information nétait pas utilisée par la classe et je ne sais donc pas trop où il faut indiquer lentête à envoyer Je nai donc pas pu aller plus loin pour la moissonneuse !
3) Le verbe Identify
Pour que lentrepôt soit complet, il faut pouvoir répondre au verbe Identify quil est possible de récupérer les données en Gzip, pour ce faire, il faut indiquer entre des balises compression que le Gzip est accepté. Il suffit de mettre comme valeur à lattribut compression dans la classe AbstractOAIRepository la valeur "gzip" et le tour est joué.
Conclusion, évolution :
Voila, rien de sorcier na été fait mais je voulais lindiquer pour si des personnes voulaient limplémenter et même le finir, voici également des axes pour une continuation :
Il serait intéressant dimplémenter la compression de façon intelligente, explication :
Il serait intéressant davoir la possibilité dindiquer avec un champs compression dans les requêtes de la moissonneuse si on veut récupérer les données compressées ou pas.
Il serait également intéressant pour un entrepôt de pouvoir décider des personnes à qui il accepte de renvoyer la donnée compressée afin que soient privilégiées certains clients et pas dautres.
Enfin, il serait intéressant, peut-être, de ne récupérer les données compressées que pour la première moisson qui est la plus coûteuse
[Prev in Thread] | Current Thread | [Next in Thread] |