sdx-developers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[sdx-developers] compression Gzip


From: Nicolas CUNIN
Subject: [sdx-developers] compression Gzip
Date: Wed, 17 Aug 2005 16:02:57 +0200

Bonjour,

 

J’ai essayé d’implémenter la compression Gzip pour l’OAI pour des besoins de performance. J’arrive en fin de stage, je tiens donc à informer de ce que j’ai fait jusqu’à présent pour que cela puisse être poursuivi. Je n’ai malheureusement pas eu le temps d’aller jusqu’au bout bien que la dernière phase ne doive pas être trop compliquée.

 

Les trois aspects sont d’une part l’entrepô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

L’autre 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é.

 

J’ai donc naturellement fait des recherches sur Internet pour implémenter ça au niveau de cocoon (à la suite de conseils de Martin et Pierrick), j’ai alors trouvé deux sites dont le deuxième m’a semblé complet et plus pertinent, en voici l’adresse :

http://wiki.apache.org/cocoon/GzipPipeline

 (le premier étant celui d'un serializerGzip qui est en lien sur ce site)

 

1)      L’entrepôt :

 

Première étape, mettre les deux fichiers java dans les sources du projet sachant qu’il ne faut pas les mettre la où c’est préconisé car la compilation ne s’occupera 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 l’action dans sitemap.xmap qui est sous la racine de l’application.

<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

 

J’ai pu relever un taux de compression de l’ordre 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 d’enregistrements.

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 n’y avait donc pas de problèmes de congestion, de chemin long parcourir, etc. La seconde raison est le faible nombre d’enregistrements : 203, comparé aux milliers qu’il est possible de télécharger.

 

Il est à noter que ce pipeline peut aussi être utilisé pour compresser d’autres fichiers comme les fichiers xsp si ceux-ci sont de taille trop importante, il suffira alors d’ajouter 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 l’entête http "accept-encoding = gzip", j’ai donc cherché dans le code de SDX où je pouvais l’implémenter, en suivant l’acheminement de l’utilisation de la requête, je suis arrivé dans la fonction receiveRequest dans la classe AbstractOAIHarvester dans le package fr.gouv.culture.oai. J’ai alors vu un certain sp.put(HTTP_HEADER_NAME_USER_AGENT), j’ai donc eu beaucoup d’espoir quant à la facilité d’implémentation de mon entête HTTP mais en regardant ce qui se passait dans la classe URLSource du package org.apache.excalibur.source.impl, j’ai pu voir que cette information n’était pas utilisée par la classe et je ne sais donc pas trop où il faut indiquer l’entête à envoyer… Je n’ai donc pas pu aller plus loin pour la moissonneuse !

 

3)      Le verbe Identify

 

Pour que l’entrepôt soit complet, il faut pouvoir répondre au verbe Identify qu’il 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 à l’attribut compression dans la classe AbstractOAIRepository la valeur "gzip" et le tour est joué.

 

 

Conclusion, évolution :

 

Voila, rien de sorcier n’a été fait mais je voulais l’indiquer pour si des personnes voulaient l’implémenter et même le finir, voici également des axes pour une continuation :

 

Il serait intéressant d’implémenter la compression de façon intelligente, explication :

Il serait intéressant d’avoir la possibilité d’indiquer 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 d’autres.

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…

 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]