Wpis z mikrobloga

#programowanie #rest #graphql #sieci

tl;dr: Mówienie, że w GraphQL cachowanie jest gorsze niż w REST to kłamstwo!!!

Czemu wszyscy mówią, że cachowanie w GraphQL jest słabsze w porównaniu do REST? Nie rozumiem tego.

Są dwie opcje.

1. Piszesz system i nie możesz wprowadzić cachowania.

Przykładowo masz forum i encję post. Pobierasz go: /api/post/12
I co, mogę gdzieś zcachować odpowiedź? Nie, bo ktoś może w każdej chwili edytować post i powinienem dostać nowe dane. Skąd to coś co cachuje ma wiedzieć, żeby opróżnić cache?

Przykładowo konfiguruję Varnish i włączam cachowanie. Nie mogę w tym wypadku trzymać posta o 12 nawet przez sekundę w cachu, bo może się zmienić.

Tak samo jak nie mogę cachować odpowiedz REST, tak samo nie mogę z GraphQL. Nie widzę żadnego ograniczenia.

2. Piszesz coś, bo bardzo rzadko się zmienia i wiesz, że nawet jak się zmieni i wyświetlisz stare dane to nic się nie zmieni.

Przykładowo strona z newsami (których raczej nie edytujesz, tylko dodajesz nowe). Pobierasz np. /api/news/12
Włączam cachowanie np. w:
- warstwie pomiędzy np. w Varnish (ustawiam, żeby wszystkie newsy były cachowane),
- lub ustawię odpowiednie nagłówki HTTP i przeglądarka sobie zcachuje,
- (więcej nie wiem gdzie można włączyć cachowanie... pomijam bezpośrednio frontend i backend)

Takiego czegoś rzeczywiście prosto w GraphQL nie zrobię, bo nie ma nigdzie z domysłu analizy body z POST-ów.

Ale to nie jest wada GraphQL tylko ułomność narzędzi do cachowania.
- Varnish powinien móc analizować body zapytań POST (może się już da?),
- przeglądarki tak samo powinny to obsługiwać (cachować nie tylko GET-y z takimi samymi parametrami, ale też POST-y z takim samym body requesta).

2.b)

Ktoś mógłby powiedzieć, że wada z cachowaniem w GraphQL to to, że mogę definiować co chcę dostać.
Np. najpierw pytam o to:

{
news(id: "12") {
name
}
}

I jest to zapisywane w cache.
A potem pytam o to:

{
news(id: "12") {
name,
content,
author,
}
}

I tego nie mam w cache.

Ale ten sam jest w REST jak mam dwa enpointy. Najpierw pytam o same nazwy newsów:

/api/news/12/name
A potem o całe newsy:

/api/news/12/full
I też tego nie mam w cache.

Ktoś może powiedzieć, że w REST pyta się od razu o całość. Ale w GraphQL możesz zrobić dokładnie tak samo.

---

Przykładowe linki o cachowaniu:
https://graphql.org/learn/caching/
https://blog.graphqleditor.com/grapqhl-vs-rest-caching/
https://www.moesif.com/blog/technical/graphql/REST-vs-GraphQL-APIs-the-good-the-bad-the-ugly/
https://medium.com/@back4apps/graphql-vs-rest-62a3d6c2021d
  • 2
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@LiczbaPi: zależy gdzie jest cache:
- jak w przeglądarce, to nie da się powiadomić przeglądarki jednego użytkownika, że inny użytkownik zrobił edycję i przy następnym wejściu na stronę ma wyczyścić cache (nie mówimy o websocketach, bo mówimy o prostych synchronicznych usługach i np. odświeżeniu strony, a wtedy websocket się urywa),
- w Varnish nie wiem czy jest dostępne API do inwalidacji poszczególnych wpisów w cache,
- (samą implementację cache na
  • Odpowiedz