Capita molto spesso che un’applicazione di un sistema informatico necessiti di comunicare informazioni (o richiedere servizi) ad altre applicazioni dello stesso sistema o distribuite in sistemi interconnessi. Tali informazioni possono essere classificate genericamente col il termine di messaggio.
Nel modello “Messaging and Queuing” le applicazioni comunicano tra loro scambiando messaggi tramite l’infrastruttura di messaging (MOM), piuttosto che chiamandosi direttamente.
Il messaggio è sempre fornito di un corpo contenente i dati applicativi e di un’intestazione: il corpo può contenere caratteri, numeri, dati binari, o un mix di tutti questi; l’intestazione contiene parametri quali l’ID (identificativo) del messaggio, l’ID di correlazione, l’indirizzo del mittente, etc. Il rapporto tra intestazione ed il corpo dati del messaggio è lo stesso che esiste tra la busta e la lettera in essa contenuta.
Mentre le applicazioni mittente e ricevente del messaggio devono essere in grado di comprendere il suo formato, l’infrastruttura di messaging generalmente non richiede tale requisito. Essa deve solo garantire l’integrità delle informazioni trasportate e che le stesse arrivino correttamente a destinazione una e una sola volta. Spetta inoltre all’infrastruttura di messaging “adattare” il dato alle caratteristiche dei sistemi operativi sottostanti eseguendo conversioni di carattere (es. ascii<->ebcidic o genericamente di codepage) o conversioni numeriche per far si che il dato possa rimanere valido ad ogni destinazione.
Altro elemento fondamentale dell’architettura di messaging è la coda, cioè il contenitore dei messaggi. I messaggi sono sempre collocati alla fine della coda, e di solito recuperati dal fronte della stessa (modalità fifo=”first in first out”).
E’ anche possibile estrarre i messaggi dalle code usando gli identificativi associati ai messaggi o ancora a seconda della priorità, in modo che i messaggi con priorità più alta siano sempre recuperati prima di quelli con priorità più bassa.
E’ importante ricordare che le code non sono progettate per sostituire le tabelle delle basi dati; esse sono ottimizzate per contenere quantità di messaggi non esageratamente grandi che fluiscono attraverso la coda prima di raggiungere la loro destinazione.
Una coda fornisce essenzialmente un buffer tra il sistema mittente e quello ricevente. Un’applicazione che riceve e processa i messaggi potrebbe non essere in grado di elaborare i messaggi man mano che arrivano perché occupata ad eseguire altre elaborazioni o, peggio ancora, non essere disponibile per qualsiasi altro motivo. La presenza di un buffer tra il mittente ed il ricevente del messaggio permette al mittente di inviare il dato senza sapere se il ricevente è al momento disponibile ed al ricevente di elaborarlo a sua discrezione. I sistemi risultano in tal modo disaccopiati.