Kompresja komuniktów

Autor: Marcin Kasiński
21.01.2011 13:24:00 +0200

W przypadku sieciowych aplikacji MQ, jak i w większości aplikacji sieciowych, największy wpływ na wydajność ma sama transmisja danych poprzez sieć. Operacje sieciowe stanowią w tym przypadku wąskie gardło. Z tego powodu zalecane jest, aby w przypadku komunikacji sieciowej, czy tez w przypadku komunikacji pomiędzy kanałami minimalizować ilość danych przesyłanych po sieci. Temu ma służyć kompresja danych przesyłanych po sieci, która została wprowadzona do MQ od wersji 6. Ważne jest, że standardowo zdefiniowany kanał nie obsługuje kompresji. Aby to zmienić należy ustawić jego parametr COMPMSG.

Kompresji danych przy połączeniach klienckich

Technika ta polega na tym, ze przy połączeniu klienckim aplikacja przekazuje do menadżera kolejek informacje, jakie sugeruje wykorzystać metody kompresji danych podczas komunikacji. Metody te określane są niezależnie dla nagłówków i danych komunikatu. Nie znaczy to wcale, ze podczas komunikacji kompresja zostanie wykorzystana. Metoda kompresji pomiędzy aplikacją a menadżerem podlegają negocjacji i jeśli np. menadżer kolejek nie będzie miał włączoną kompresje lub zaproponowana przez aplikacje lista sugerowanych metod kompresji nie będzie znana przez menadżera, to komunikacja odbędzie się standardowo bez kompresji. Do określenia sugerowanych metod kompresji dla nagłówków, czy danych używa się statycznych pól hdrCompList oraz msgCompList klasy MQEnvironment. Oba te pola przyjmują obiekty typu Collection, gdzie pierwsze dotyczy kompresji nagłówków, a drugi kompresji danych. Poniższe dwa przykłady obrazują omawianą technikę. Pierwszy przykład dotyczy kompresji nagłówków, a drugi kompresji danych w komunikacie. Przykład 1:

Collection headerComp = new Vector();


headerComp.add(new Integer(MQC.MQCOMPRESS_SYSTEM));


MQEnvironment.hdrCompList = headerComp;


MQQueueManager qMgr = new MQQueueManager(QM);

Przykład 2:

Collection msgComp = new Vector();


msgComp.add(new Integer(MQC.MQCOMPRESS_RLE));


msgComp.add(new Integer(MQC.MQCOMPRESS_ZLIBHIGH));


MQEnvironment.msgCompList = msgComp;


MQQueueManager qMgr = new MQQueueManager(QM);

Kompresji danych przy transmisji pomiędzy kanałami

W przypadku transmisji pomiędzy kanałami, np. sender-receiver aby włączyć kompresję należy ustawić na oby tych kanałach atrybuty COMPMSG (Data compression) w przypadku kompresji danych w komunikacie oraz COMPHDR (Header compression) w przypadku kompresji nagłówków. Jako wartość tych atrybutów przyjmuje się nazwy metod kompresji lub wartość określającą, że wszystkie z nich są dozwolone. Ważne jest aby na oby komunikujących się ze sobą kanałach wartości te były identyczne i wskazywały na tą samą metodę kompresji lub na jednym z nich było wskazanie na konkretną metodę, a na drugim wartość ta była ustawiona na ANY (tylko w przypadku atrybutu COMPMSG) co oznacza, że dany kanał obsługuje dowolna metodę kompresji. Atrybut COMPMSG przyjmuje wartości:

  • NONE
  • RLE
  • ZLIBFAST
  • ZLIBHIGH
  • ANY

Atrybut COMPHDR przyjmuje wartości:

  • NONE
  • SYSTEM

powrót
Zachęcam do przedstawienia swoich uwag i opinii w polu komentarzy.

Komentarze

Dodaj Komentarz