Przemyślenia architekta IT

Menu
  • Strona główna
  • O mnie
  • Co czytam
  • Czego się uczę
Menu

Wzorzec Post/Redirect/Get plus twierdzenie CAP jako recepta na problem

Posted on 4 maja 202129 listopada 2024 by Tomasz Sokół

Na początek trochę teorii. Osoby znające zarówno twierdzenie CAP jak i wzorzec Post/Redirect/Get mogą spokojnie przejść od razu do akapitów poniżej.

Twierdzenie CAP

Twierdzenie to sformułował Eric Brewer i dotyczy ono rozproszonych systemów składowania danych. Zgodnie z nim w takich systemach niemożliwe jest zapewnienie jednocześnie:

  • spójności (ang. Consistency) – odczyt, niezależnie z którego węzła następuje, zwróci zawsze najświeższe dane
  • dostępności (ang. Availability) – każde żądanie doczeka się odpowiedzi
  • odporności na partycjonowane (ang. Partition tolerance) – system potrafi działać pomimo utraty części komunikatów lub uszkodzenia niektórych węzłów

Post/Redirect/Get

źródło https://en.wikipedia.org/wiki/Post/Redirect/Get

Jest to wzorzec projektowy stosowany w aplikacjach web’owych. Jego zadaniem jest umożliwienie odświeżenia strony zaprezentowanej po zatwierdzeniu formularza, bez ryzyka ponownego wysłania/zapisania danych.

Przebieg obsługi żądania jest następujący:

  1. Wyświetlenie formularza (HTTP GET)
  2. Wypełnienie danych i zatwierdzenie (HTTP POST)
  3. Obsłużenie żądania i zapis danych
  4. Przekierowanie (HTTP Status 3xx)
  5. Wyświetlenie strony (HTTP GET)

Po wykonaniu takiego przebiegu odświeżenie strony w przeglądarce owocuje odświeżeniem strony zaprezentowanej w wyniku żądania GET (punkt 5). Nie następuje ponownie wysłanie formularza (POST).

Houston mamy problem

Jak to często bywa, życie weryfikuje nasze rewelacyjne pomysły. Jednym z rewelacyjnych pomysłów w tym przypadku, była zmiana architektury systemowej. Na początek diagram stanu przed.

Komponenty systemu:

  1. Load balancer z użyciem Apache + mod_jk
  2. Dwa węzły aplikacji Frontend. Aplikacja zaimplementowana w Spring MVC. Podczas zapisu formularza zastosowany został wzorzec POST/REDIREC/GET.
  3. Dwa węzły aplikacji Backend realizującej zapis i odczyt z relacyjnej bazy danych PostgreSQL
  4. Na backend’ach zapięty cache (EHcache 2) w topologii z replikacją przez RMI
  5. Cache na frontend’ach również jest, ale pomijam go, gdyż nie ma on wpływu na opisywany problem

Usprawnienie architektury polegało na wprowadzaniu dodatkowego load balancer’a pomiędzy frontend’ami a backend’ami.

Nowe komponenty:

  1. HAProxy – load balancer przykrywający backend’y i wystawiający je frontendom pod jednym adresem
  2. Zastosowany algorytm: Round Robin

Zmiana miała na celu poprawienie dostępności aplikacji tak, aby awaria jednego z węzłów backendu nie powodowała błędów w obsłudze wszystkich requestów podpiętego do niego węzła frontend’u.

Niedługo po wprowadzeniu modyfikacji dostaliśmy zgłoszenie mówiące o tym, że zmiany po zapisaniu nie są widoczne w systemie.

Szybka analiza pokazała, że zmiany faktycznie nie są widoczne, jednak problem ustępuje po ponownym wyświetleniu strony.

Podejrzenie padło oczywiście na cache, a dokładnie na problem z jego replikacją. Spodziewaliśmy się, że po prostu ktoś nieumyślnie zepsuł konfigurację replikacji. Niestety nie okazało się to takie proste. Konfiguracja był w porządku.

Przyczyna

Część z Was już napewno się domyśla, o co chodzi. Zastosowanie algorytmu Round Robin na HAProxy spowodowało, że przebieg w przypadku POST/REDIRECT/GET był następujący:

  1. POST – zapis poprzez Backend węzeł 1
  2. Redirect
  3. GET – dane pobrane z Backend węzeł 2

Niestety topologia opierająca się na replikacji przez RMI nie dała odpowiedniego poziomu spójności. Analiza wykonana przy użyciu Dynatrace pokazała, że żądania replikacji wykonywały się za późno. Dane z węzła 1 backend’u nie znajdowały się w cache węzła 2 w momencie obsługiwania żądania GET.

Rozwiązanie

Modyfikacja do wdrożenia krótkoterminowo polegać miała na zmianie algorytmu load balancer’a na HAProxy na coś bardziej „sticky”. Chodzi o to, aby requesty wykonywane w ramach tej samej sesji na froncie przeskakiwały na drugi węzeł backend’u tylko w momencie niedostępności pierwszego.

Docelowo planujemy zmianę topologii cache połączoną z wymianą silnika cache. Taka modernizacja i tak jest wskazana ze względu na przestarzałego już Ehcache’a w wersji drugiej. Wybranym rozwiązaniem, na moment pisania tego tekstu, jest Hazelcast z centralnym serwerem cache. Upatrujemy się w tym rozwiązaniu poprawy spójności danych. Obawę mamy co do potencjalnego spadku czasów odpowiedzi takiego rozwiązania.

Jeśli podobają Ci się treści na moim blogu zostaw swój email. Będę Cię informował o nowych artykułach. Zero spamu same konkrety.

* pola wymagane

2 thoughts on “Wzorzec Post/Redirect/Get plus twierdzenie CAP jako recepta na problem”

  1. descargar videos de facebook iphone pisze:
    2 listopada 2024 o 22:51

    Excellent blog here Also your website loads up very fast What web host are you using Can I get your affiliate link to your host I wish my web site loaded up as quickly as yours lol

  2. Beykoz su kaçak tespiti pisze:
    29 listopada 2024 o 20:18

    Beykoz su kaçak tespiti Zeytinburnu’nda su kaçağı tespiti için çok iyi bir ekip. Sorunumuzu hemen çözdüler. https://followingbook.com/1663435564971565_17697

Comments are closed.

Chcesz dostawać powiadomienia o nowych artykułach? Zostaw swój email.

Ostatnie wpisy

  • Bezpieczne przechowywanie haseł – Argon2id i jego implementacja w Spring
  • Bezpieczne przechowywanie haseł – sprawdź czy robisz to dobrze
  • Wzorzec Post/Redirect/Get plus twierdzenie CAP jako recepta na problem
  • 7 kroków do przejęcia systemu od innego dostawcy
  • Młody programisto! 7 porad od starszego kolegi

Kategorie

  • Architektura
  • Procesy
  • Web security
  • Zespół
Polityka prywatności
©2025 Przemyślenia architekta IT | WordPress Theme by SuperbThemes
Serwis wykorzystuje pliki cookies. Korzystając ze strony wyrażasz zgodę na wykorzystywanie plików cookies.Tak. Zgadzam się Reject Dowiedz się
Privacy & Cookies Policy

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.
Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.

Necessary Always Enabled

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

Non-necessary

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.