MokaByte 92 - Gennaio 2005
FastInfoset
Una codifica binaria per i documenti XML
di
Massimiliano Bigatti
Un protocollo binario può essere la soluzione ai colli di bottiglia dei Web Services. SUN, con il nuovo progetto Fast Infoset, sta lavorando all'implementazione ad un encoding binario per documenti XML. Per Web Services e non solo

Introduzione
Uno dei problemi che ha sempre afflitto la tecnologia XML, ma che nello stesso tempo è uno dei suoi maggiori punti di forza è l'utilizzo di dati testuali per rappresentare le informazioni. Grazie a questa caratteristica, l'osservatore umano che vuole conoscere i dati presenti in un documento XML, oppure in un messaggio di un Web Service, è in grado di capire il contenuto semplicemente osservando i dati XML. Ma questa leggibilità è offerta ad un costo.
Riassumiamo gli svantaggi dell'utilizzo di XML in generale e dei Web Services in particolare:

  • parsing. Un documento XML deve essere elaborato per poterne utilizzare i dati. Sebbene tecnologie come SAX e StAX siano molto efficienti, questa operazione richiede una quantità anche minima di potenza di elaborazione. Per contro i protocolli binari sono più vicini alla rappresentazione in memoria dei dati, quindi richiedono meno elaborazioni per il loro utilizzo;
  • memoria. Un altro problema della tecnologia XML, che si palesa soprattutto nell'archiviazione e trasmissione dei dati, è la richiesta di memoria. Un dato formattato in XML richiede più spazio rispetto al corrispondente dato codificato con uno standard binario. Questo maggiore overhead si traduce in una maggiore durata della trasmissione di dati XML, ad esempio relativi ad un messaggio SOAP.

 

La soluzione di SUN
Nel passato ci sono stati una serie di tentativi di realizzare una codifica binaria di dati XML, allo scopo di ottenere il meglio di entrambi i mondi, soprattutto nell'utilizzo con i Web Service: la leggibilità del formato XML con l'occupazione di memoria di un dato binario. Si è cercato dunque di combinare questi due approcci, per certi versi diametralmente opposti, in una unica tecnologia. Ma il problema di far convivere questi due mondi così diversi ha richiesto un po' di tempo prima di portare ad una soluzione soddisfacente. Per SUN questa si chiama Fast Web Services, ed è una tecnologia in fase di standardizzazione da parte di ISO. Qual è il concetto chiave? Con i Fast Web Services vengono trasmessi solo i dati, presupponendo che in entrambi gli endpoint siano presenti gli schemi XML necessari a decodificare le informazioni trasferite. Risparmiando le informazioni di formattazione, i dati trasmessi sono in numero inferiore, e quindi l'overhead viene ridotto. La decodifica viene assicurata dal fatto che i metadati descrittivi delle informazioni sono disponibili all'endpoint che riceve i dati. Per capirci, il concetto è simile alla vecchia gestione dei file a record che si faceva in C, BASIC o Pascal. Si definisce prima un tipo di record:

struct Record {
  int id;
  char[10] descr;
  long timestamp;
  char deleted;
}

e poi si scrive su un flusso direttamente una variabile con la struttura utilizzata. I dati scritti nel flusso sono binari, come sapere dunque che i primi due byte sono relativi ad un unico dato intero, mentre l'ultimo byte è in realtà un flag di cancellazione? L'unico modo per saperlo è avere il codice sorgente della struttura dati. Questo aspetto può sembrare estraneo allo sviluppatore Java: serializzando una classe infatti vengono trasferiti anche tutti i metadati associati. Un modo per ovviare ai molti problemi della classica gestione di file a record. Ad ogni modo, questo è il concetto chiave dell'approccio dei Fast Web Services.

 

All'interno di Fast Infoset
Per molte applicazioni, però, la necessità dei metadati è imprescindibile. D'altra parte è uno dei vantaggi di XML è proprio questo. Non c'è dunque da sorprendersi se gli ingegneri di SUN abbiano dovuto tornare al tavolo di lavoro per proporre una soluzione che salvasse capra e cavolo.
Con Fast Infoset, SUN propone una soluzione che può essere immaginata come una semplice complessione GZIP di documenti XML. Con questo approccio l'unica informazione indispensabile per leggere i dati è sapere che il documento è codificato: in questo caso il client esegue una decompressione, al fine di ottenere il dato non compresso.
La compressione non è però una standard GZIP o JAR, ma una soluzione ottimizzata per dati XML, che produce migliori risultati in termini di tempo di codifica e di decodifica. È una sorta di algoritmo di compressione studiato specificatamente per la tecnologia XML. Ad esempio, si potrebbe utilizzare il noto algoritmo LZH per comprimere dati XML, ed il risultato sarebbe un file più piccolo di quello prodotto con Fast Infoset, ma i tempi di codifica e decodifica sarebbero risultati maggiori. In altre parole, si sarebbero appensantiti significativamente l'elaborazione negli endpoint in modo da ledere alle performance lato server.
Le caratteristiche principali della compressione Fast Infoset sono:

  • mancanza di tag di terminazione, p.e. </element>. Questo permette di risparmiare spazio;
  • nessun escaping dei caratteri, che permette di eseguire meno operazioni di elaborazione ed occupare meno spazio;
  • indicazione della dimensione nel prefisso. In questo modo l'allocazione di memoria è precisa a priori e permette a chi riceve eventualmente di rimbalzare il messaggio se questo dovesse essere considerato troppo lungo;
  • indicizzazione stringhe, che sostituisce stringhe che si ripetono spesso, con interi, che occupano meno memoria;
  • indicizzazione dei nomi qualificati (namespace);
  • inserimento diretto di dati binari. Invece che utilizzare la codifica Base64 per convertire dati binari in testuali (con un'occupazione di circa il doppio della memoria), i dati binari vengono inseriti direttamente nel documento XML compresso;
  • preservazione dello stato di documenti con vocabolario similare. In questo modo è possibile conservare un vocabolario comune di stringhe indicizzate attraverso diverse elaborazioni.

Il cuore della tecnologia Fast Infoset è quindi la compressione basata sulla sostituzione di stringhe. È un interessante ritorno al passato: questo algoritmo è forse uno delle prime e banali tecniche di compressione che si studiano a scuola. Gli ingegneri SUN hanno rilevato che questa soluzione funziona bene con XML. Per chi non ricorda o non conosce la compressione basata su sostituzione di stringhe, ecco un esempio. Se il dato da comprimere è il seguente:

<root>
<tag>one</tag>
<tag>two</tag>
<anotherTag>one</anotherTag>
</root>

con la compressione Fast Infoset si ottiene quanto segue:

{0}<root>
{1}<tag>{0}one</tag>
[1]<>{1}two</tag>
{2}<anotherTag>[0]</anotherTag>
</root>

gli elementi cancellati non sono richiesti, dunque il file risultante è da considerarsi senza i tag di chiusura. Con l'utilizzo di identificatori {} viene marcato un elemento di testo che si ripeterà; con [] una occorrenza di quell'elemento. L'intero contenuto nelle parentesi è l'identificativo univoco.

 

Il progetto FI
Per chi desidera sperimentare con questa nuova ed interessante tecnlogia, SUN ha creato un progetto open source all'interno di java.net, il Fast Infoset Project, https://fi.dev.java.net/, come mezzo di promozione della tecnologia sia all'interno del mondo Java che verso l'esterno. D'altra parte, se questo nuovo formato non diviene interoperabile, la sua utilità si riduce notevolmente. Un Web Service che lo utilizzi sarebbe accessibile infatti solo a client Java che implementano Fast Infoset, escludendo di fatto implementazioni open source, datate o la piattaforma .NET.
Attualmente è presente l'implementazione parziale delle specifiche Infoset con le API SAX e StAX ed anche qualche benchmark a detta di SUN incoraggiante (si parla di aumenti di velocità di 3/4 volte e di un aumento del 50% in un benchmark interno di SUN utilizzato per JAX-RPC). Ad un certo punto Fast Infoset verrà integrato in JAX-RPC.

 

Conclusioni
SUN inserisce una nuova parola chiave nelle tecnologie XML e dei Web Services: Fast. I progetti Fast Infoset e Fast Web Services vogliono portare una codifica binaria per dati XML e messaggi SOAP per ovviare ad uno dei problemi principali della tecnologia XML: l'occupazione di memoria. L'approccio di Fast Infoset si basa su un algoritmo di compressione vecchio come il mondo: la sostituzione di stringhe. Si ritiene infatti che venisse addirittura utilizzato dagli egizi per ridurre il numero di geroglifici incisi sui monumenti lapidari e prima finanche dai sumeri nelle loro tavolette di argilla (era solo una battuta :-).
Ad ogni modo, l'algoritmo è stato ottimizzato per i dati XML ed i primi test dicono che i risultati sono buoni, ma fino a che gli altri (leggi Microsoft e .NET) non lo supporteranno, non sarà possibile utilizzare veramente questa tecnologia per i Web Services interoperabili.

 

Bibliografia
[1] Eduardo Pelegri Llopart - "Simple, fast, no-loss binary XML - Fast Infoset", http://weblogs.java.net/blog/pelegri/archive/2004/06/simple_fast_nol.html
[2] Eduardo Pelegri Llopart - "The FI Project - An open source implementation of a binary XML standard", http://weblogs.java.net/blog/pelegri/archive/2005/01/start_using_bin.html
[3] Sandoz, Triglia, Pericas-Geertsen - "Fast Infoset", http://java.sun.com/developer/technicalArticles/xml/fastinfoset/

Massimiliano Bigatti é autore dei libri "Java e Multimedia", "Da Visual Basic a Java", "Da Visual Basic a C#" e "Java Web Application". E' certificato, tra le altre, come SUN Certified Enterprise Architect for Java Platform, Enterprise Edition Technology. E' content editor del portale dedicato ai Web Services http://javawebservices.it

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it