Buforowanie żądań GET

Włączenie funkcji buforowania żądań GET skróci czas odpowiedzi na żądania dotyczące danych zasobów, wprowadzone wcześniej przez tego samego użytkownika.

Po włączeniu funkcji buforowania dane są odtwarzane z pamięci podręcznej przeglądarki nie zaś z obiektu biznesowego na serwerze. Żądanie jest buforowane, jeśli wartość znacznika obiektu (ETag) dla żądania jest zgodna z wartością wcześniejszego żądania. Buforowanie jest przypisane osobno każdemu użytkownikowi, a elementem kontrolnym tego procesu jest właściwość nagłówka HTTP Cache-Control.

Włączanie buforowania

Aby włączyć buforowanie dla poszczególnych zasobów, należy utworzyć właściwości systemowe. Właściwości te muszą mieć następującą postać: mxe.rest.procedura_obsługi.zasób.cache, gdzie procedura_obsługi to wartość mbo lub os, a zasób to nazwa obiektu biznesowego lub struktury obiektu. Wartość boolowska właściwości systemu musi być równa 1.

Na przykład: ustawienie właściwości systemu mxe.rest.mbo.workorder.cache na wartość 1 umożliwia buforowanie obiektu biznesowego zlecenia pracy.

Obliczenia i porównania znacznika obiektu

Po utworzeniu żądania początkowego i włączeniu buforowania dla zasobu w odpowiedzi dla zasobu środowisko generuje wartość ETag. Wartość ETag jest obliczana na podstawie atrybutu rowstamp MBO, który ulega zmianie po każdej modyfikacji obiektu MBO. W przypadku kolekcji zasobu wartość ETag obliczana jest na podstawie mieszanych wartości rowstamp z kolekcji MBO.

Na przykład: odpowiedź zawiera następujący nagłówek HTTP:

HTTP/1.1 200 OK
ETag: "123456789"
Cache-control: private
Content-Length: 12195

Parametr Cache-control jest oznaczony jako private, dzięki czemu tylko bieżący użytkownik będzie mógł ponownie użyć wartości z pamięci podręcznej.

Jeśli użytkownik ponowi zapytanie dla tego samego zasobu lub tej samej kolekcji, żądanie będzie wyglądało mniej więcej tak:

GET maxrest/rest/mbo/po HTTP/1.1
Host: x.y
If-None-Match: "123456789"

Wartość parametru If-None-Match to wartość ETag z poprzedniego żądania. Środowisko odczytuje wartość nagłówka If-None-Match i porównuje ją do nowej wartości ETag obliczonej dla zasobu lub kolekcji w ramach drugiego żądania. Jeśli wartości są zgodne, serwer generuje odpowiedź HTTP 304, co oznacza, że zawartość pamięci podręcznej klienta jest poprawna i może zostać użyta. Odpowiedź obejmuje następujący wiersz:

HTTP/1.1 304 Not Modified

Jeśli wartość ETag nie jest zgodna z wartością nagłówka If-None-Match żądania, tworzona jest reprezentacja zasobu, która zostaje wysłana do klienta wraz z nową wartością ETag, jaka będzie przez niego używana do kolejnych zapytań dla zasobu lub kolekcji:

HTTP/1.1 200 OK
ETag: "98999999"
Cache-control: private
Content-Length: 50004

Tryb buforowania pesymistycznego

Domyślnym trybem buforowania jest buforowanie pesymistyczne. W trybie tym żądania są serializowane, ale jeśli wartość ETag żądania jest zgodna z wartością wcześniejszego żądania, dane nie są wysyłane z serwera do klienta.

Tryb buforowania optymistycznego

Buforowanie optymistyczne można włączyć, ustawiając właściwość systemu mxe.rest.procedura_obsługi.zasób.optimistic na wartość 1. W trybie buforowania optymistycznego wartość ETag jest obliczana przed rozpoczęciem serializacji danych. Buforowanie optymistyczne może znacznie skrócić czas odpowiedzi, ponieważ nie jest przeprowadzana żadna serializacja, wymaga jednak więcej pamięci, szczególnie w przypadku zapytań obejmujących wiele rekordów.

Domyślnie, w wyniku buforowania optymistycznego wartość ETag jest wyznaczana na podstawie obiektu głównego struktury obiektu. Dlatego też jeśli w strukturze obiektu znajdują się obiekty powiązane, które nie powodują aktualizacji obiektu głównego, wartość ETag może nie być dokładna. Aby mieć pewność, że wartość ETag będzie określona na podstawie wszystkich obiektów ze struktury obiektów, w tym obiektów powiązanych, właściwość systemu mxe.rest.procedura_obsługi.zasób.deepetag musi zostać ustawiona na wartość 1. Korzystanie z właściwości systemu nie zapewnia jednak tak dużej poprawy wydajności i wymaga większego zużycia pamięci.

Ograniczenia czasu buforowania

Istnieje możliwość skonfigurowania czasu obowiązywania pamięci podręcznej; w tym celu właściwość systemu mxe.rest.procedura_obsługi.zasób.maxage należy ustawić jako wartość mierzona w sekundach.