ul. Powstańców Śląskich 7a
53-332 Wrocław
NIP 8992786490
KRS 0000608120
REGON 363987723
Global4Net Sp. z o. o.
+48 71 769 11 32
© 2009 – Global4Net. All Rights Reserved.
Jeśli mielibyśmy wyciągnąć jakąś naukę z dziedziny IT z pewnością dotyczyłaby ona tego, że każde rozwiązanie zawsze można usprawnić. Nie zawsze będzie to duża zmiana, ale niemniej Twoje rozwiązanie stanie się bardziej zoptymalizowane. Postęp w IT nie następuje w paru dużych skokach wydajności. Przeważającą normą jest cierpliwy, ale pewny i nieustępujący postęp – to on pcha branżę informatyczną do przodu. Jest to wyjątkowo widoczne przy optymalizacji platform e-Commerce’owych. Do najpopularniejszych z nich należy Magento i po przeczytaniu tego artykułu dowiesz się jak optymalizować zapytania w Magento 2 z użyciem GraphQL.
Magento 2 jest platformą e-Commerce wykorzystywaną przez profesjonalistów do budowania i utrzymania sklepów internetowych. Każdy zna powiedzenie „klient nasz pan” i podobnie jest w e-handlu: kluczowym elementem jest satysfakcja klienta, dlatego też właściciele e-Commerce stawiają na maksymalną optymalizację doświadczeń. To właśnie między wygodą korzystania ze strony i klientem wchodzi kwestia technologii GraphQL. Ale na jakie sposoby optymalizuje ona komunikację w Magento 2?
GraphQL jest językiem zapytań dla systemów API udostępnianym na prawach licencji Open Source. Język ten został stworzony przez Facebooka w 2012 roku a obecnie jest wspierany przez GraphQL Foundation. Właściciele Facebooka wraz z innymi organizacjami związanymi z IT powołali tę fundację, aby rozwijać technologie zgodnie z zasadami non-profit. W wyniku tych działań wokół GraphQL-a zaczęła skupiać się coraz większa społeczność developerów. Dzisiaj jest jednym z popularniejszych języków do obsługi zapytań. Zalicza się do niego wiele bibliotek pozwalających na obsługę tego języka, zarówno po stronie serwerowej, jak i po stronie klienta. Dwie z bibliotek GraphQL wchodzą w skład stacku technoloczniego Magento 2 i służą optymalizacji backendu i frontendu. Są to webonyx/graphql-php (server-side) i Apollo Graphql Nano (client-side).
GraphQL używa zapytań query, aby w wydajny i elastyczny sposób pozyskiwać dane, które są pobierane w odpowiedzi na konkretne akcję użytkownika. System wysyła zapytania w protokole HTTP i HTTPS i uzyskuje odpowiedzi na nie w formacie JSON – języku opartym na JavaScript stworzonym pod zadania związane z wymianą danych. Zanim wyślemy zapytanie query musisz się upewnić, że jest ono zgodne ze zdefiniowanym schematem działającym po stronie serwera. Dodatkowo w GraphQL właściwości danych pobieranych z backendu zależą od wysłanego zapytania:
O tym jak wygląda proces wysyłania zapytań pomiędzy frontendem i backendem pisaliśmy w artykule o obowiązkach backend developera. Jednak, aby lepiej zrozumieć, za co dokładnie odpowiedzialny jest GraphQL, rozpiszemy go pokrótce:
Brzmi prosto? Może i tak, ale wcale tak nie jest. Bo w końcu nie wystarczy zrobić coś poprawnie, tylko lepiej od konkurencji. A w świecie e-Commerce’u „lepiej” oznacza szybciej i wygodniej dla użytkownika. W jaki sposób GraphQL różni się od konkurencji i co sprawia, że lepiej nadaje się do optymalizacji w Magento?
Obie technologie dzielą między siebie parę podobieństw, kiedy przychodzi do funkcji obsługi zapytań. Tak samo jak GraphQL, tak i REST łączy się w protokole HTTP/S i udziela odpowiedzi w formacie JSON. Oba oprogramowania dzielą także dane pobierane z backendu na zasoby, np. na platformie e-Commerce jak Magento, najcześciej zasobami są produkty, użytkownicy, kategorie, itp. Jednak właśnie zasobów dotyczy pierwsza różnica pomiędzy GraphQL-em i REST-em.
REST API każdy pojedynczy zasób przypisuje jednemu endpointowi (mówiąc w prostym języku jest to jeden z końców kanału komunikacyjnego między frontendem i backendem). Oznacza to, że używając tej technologii obsługi zapytań, będziesz musiał wysyłać nasze zapytania na inne endpointy w zależności od ich rodzaju.
Natomiast GraphQL przesyła wszystkie query do jednego wspólnego endpointa. Jakie są tego rezultaty?
Przy korzystaniu z aplikacji na REST-cie nie masz kontroli nad tym, ile danych pobieramy ze zdefiniowanego zasobu. Gdy wysyłasz zapytanie o zasoby na wybrany endpoint, pobierasz wszystkie informacje znajdujące się w danym zasobie. Dzieje się tak, gdyż metody RESTowe mają zdefiniowane interfejsy, co sprawia że odpowiedź przychodząca ze strony serwera musi zawierać wszystkie pola zdefiniowane w wybranym interfejsie.
Z drugiej strony GraphQL oferuje bardziej elastyczne i wydajne rozwiązanie. Operując tym językiem zapytań, możesz sam określić jakie dane zostaną pobrane z backendu. Będziesz w stanie to zrobić dzięki odpowiedniej zmianie w strukturze zapytania – nie potrzeba dodatkowego endpointa przypisanego tylko pod te zasoby. Wystarczy zdefiniować gatunek query (GET lub POST) aby pokazać jakich danych potrzebujesz. Co więcej, możesz poddawać query dalszym konfiguracjom, aby jeszcze lepiej skalować i optymalizować współpracę backendu i frontendu Twojej aplikacji w Magento.
Zbyt wysoka liczba zapytań kierowanych do backendu aplikacji nie pomaga w jej optymalizacji. W technologiach opartych na API RESTa musisz wysyłać więcej zapytań, żeby dokładnie określić jakich danych potrzebujesz; jedno zapytanie o same zasoby, a drugie o dane wchodzące w ich skład. Dopiero po tej procedurze, dane zostaną wyrenderowane po stronie klienta.
Z kolei z GraphQL możesz skrócić tę operację na dwa sposoby: zagnieżdżanie i łączenie query. Najpierw wyjaśnimy na czym polega ten pierwszy. Chodzi po prostu o zawarcie obydwu zapytań – o zasób i dane – w jednym query. Takie zagnieżdżone query będzie się składało wtedy z części nadrzędnej i podrzędnej. Część nadrzędna określi do jakiego zasobu jest kierowane zapytanie, a podrzędna jakie dane mają zostać pobrane.
Rozszerzeniem tej metody jest zagnieżdżanie rekursywne, które umożliwia zagnieżdżanie wielu nadrzędnych i podrzędnych query w jednym zapytaniu. Pozwala ona pobierać całe sety danych, skraca czas pracy programistów i zmniejsza szansę popełnienia błędów podczas budowania architektury. Dodatkowo, zagnieżdżanie rekursywne działa na korzyść doświadczenia użytkownika. Oparta na tak przygotowanych query strona po pobraniu zawartości ze strony serwera zapisuje je w pamięci podręcznej. Dzięki temu użytkownik nie musi ponownie czekać na wysłanie zapytań i pobieranie danych z zasobów, a do tego ma dostęp do strony nawet w trybie offline.
Drugą metodą zmniejszania liczby zapytań jest łączenie query. To działanie jest wyjątkowo przydatne jeśli Twoja strona wymaga pobierania informacji o określonych elementach i ustawieniach sklepu przy każdym wejściu na witrynę. Dla przykładu Magento ma zdefiniowane query do tego typu zapotrzebowania. Jednak dzięki GraphQL-owi możesz dalej optymalizować komunikację między klientem a serwerem. Zamiast wysyłania dwóch osobnych zapytań o dane do zacachowania, możesz je zawrzeć w jednym i tym sposobem powiązać ze sobą zapytania o całkowicie niepowiązanych ze sobą zasobach backendowych, i zacachować je na odpowiednim poziomie witryny. Przyśpieszy to działanie całej strony i ułatwi pracę programistów.
W celu obsługi zapytań GraphQL na platformie Magento 2 została zdefiniowana dla nich całkiem osobna „area”. Umożliwiło to definiowanie odpowiednich reguł DependencyInjection (wstrzykiwaniu zależności) dla tego języka zapytań. Do tych reguł należy konfigurowanie query i schematów, które odbywa się w pliku schemaGraphQL. Jeśli zaś chodzi o samą logikę, dane będziesz przygotowywać poprzez stworzenie odpowiedniej klasy, która zdefiniuje odpowiedni interfejs.
Oprócz specjalnie przypisanej zapytaniom GraphQL-owym strefie, Magento 2 daje również możliwość cachowania zapytań w tym języku. Narzędziem pozwalającym na cachowanie zapytań po stronie Magento 2 jest biblioteka Apollo GraphQL. Warto wiedzieć jak najlepiej skonfigurować ustawienia dotyczące tego, jakie typy query będą cachowanie.
Musisz pamiętać, że cachowanie działa tylko przy włączonej opcji fullpageCache. Dodatkowo cachowane są tylko zapytania query typu „GET”, podczas gdy Apollo GQ domyślnie wysyła zapytania typu „POST”. Dlatego też pierwszą zmianą jaką będziesz musiał wprowadzić to zmiana przesyłanych query. Poza tym, Apollo GraphQL dostarcza nam kilka narzędzi i funkcji do optymalizacji obsługi zapytań w Magento 2:
Dzięki temu komponentowi w oknie przeglądarki zapisywane są dane, które zostały już raz pobrane. Sprawia to, że użytkownik wracający na daną stronę nie musi znowu wysyłać zapytań do backendu, dane zostają mu natychmiastowo wyrenderowane. Dzięki temu narzędziu możesz zacachować całe zapytania lub poszczególne obiekty. Ponadto, dla każdego obiektu możesz zdefiniować klucz według którego dany obiekt będzie cachowany.
Jest to narzędzie do definiowania polityki cachowania dla każdego zapytania query. Masz dostęp do kilku predefiniowanych schematów:
Wszystkie dane dotyczące polityki cachowania są przetrzymywane w pamięci podręcznej: po odświeżeniu lub zamknięciu i otwarciu strony musimy pobrać je ponownie.
Biblioteka ta pozwala dynamicznie przenosić zawartość przechowywaną w InMemoryCache do modułu localstorage. Natomiast przy ponownym uruchomieniu strony dane przenosi się z modułu do InMemoryCache jako stan początkowy cache’a.
Apollo GraphQL pozwala m.in. zdefiniować middleware’a (oprogramowania pośredniczącego w komunikacji pomiędzy różnymi aplikacjami/systemami), który będzie funkcją odpowiedzialną za autoryzowanie zapytań. Może to Ci pomóc w przypadku, gdy pojawia się problem z załadowaniem Twojej strony. Wtedy zamiast powiadomienia o błędzie ładowania, możesz tak skonfigurować middleware’a, aby wymusił on ponowne załadowanie zapytań po określonym odstępie czasu, podczas gdy użytkownikowi nadal prezentowana będzie strona ładowania.
Musisz pamiętać, że aby uzyskać dostęp do usług oferowanych przez Apollo GraphQL potrzebujemy skonfigurować Magento PWA Studio. Pozwoli to na dalszą optymalizację zapytań GraphQL i komunikację server-client w Magento 2.
Przy porównaniu obsługi zapytań przez oba języki, możesz zauważyć pewnie korzyści po stronie GraphQL-a.
Jak widać GraphQL oferuje bardziej elastyczne i wydajne rozwiązania optymalizacji aplikacji na Magento 2. Podobnie jak sama platforma, która przyciąga setki tysięcy biznesów swoimi możliwościami dogłębnej i szczegółowej rozbudowy i personalizacji, tak i język zapytań GraphQL dostarcza szereg ulepszeń i szans na optymizację, które możesz dopasować do Twoich potrzeb biznesowych.
Od początku 2022 roku wchodzimy w skład Unity Group. Teraz zapisując się do naszego newslettera, będziesz na bieżąco z informacjami całej naszej organizacji.