excache
Warstwa cache w Elixirze, wykorzystująca model aktorów OTP. Współbieżna, odporna na awarie pojedynczych procesów, z realnymi testami.
Warstwa cache w Elixirze na modelu aktorów OTP. Współbieżność bez wyścigów, odporność na awarie pojedynczych procesów i realne testy. Sztuka polega na tym, żeby przewrócenie się jednego elementu nie pociągnęło reszty.
Wprowadzenie
Cache dzielony między wiele wątków to jeden z klasycznych trudnych problemów współbieżności. excache pokazuje, że Elixir i model aktorów OTP zmieniają ten problem w coś, co da się ogarnąć bez blokad i bez cichego strachu przed zakleszczeniem. Zamiast walczyć ze współdzieloną pamięcią, przenosisz stan tam, gdzie nikt nie sięga do niego równolegle.
To projekt o dwóch własnościach naraz: współbieżności bez wyścigów i odporności na awarie. Obie wynikają z tej samej filozofii OTP, w której stan żyje w procesie, a błędy nie są zamiatane, tylko izolowane.
Model aktorów zamienia problem współbieżności
W większości języków cache dzielony między wątki oznacza blokady, muteksy i cichy strach przed zakleszczeniem. Elixir podchodzi inaczej: każdy stan żyje wewnątrz procesu, który obsługuje jedną wiadomość na raz. Zamiast blokować wspólną pamięć, wysyłasz wiadomość i dostajesz odpowiedź.
Wyścigu o strukturę danych po prostu nie ma, bo nikt nie sięga do niej równolegle. Ta sama gwarancja, którą w innych językach trzeba wywalczyć muteksami, tu jest darmową własnością modelu.
Let it crash zamiast defensywy
W OTP nie owijasz każdej operacji w obronny blok na wypadek awarii. Zamiast tego pozwalasz procesowi paść, a drzewo nadzoru wstaje go z powrotem w czystym stanie. To odwrotność defensywnego programowania: błędu nie chowasz, tylko dajesz mu wywrócić jeden proces i zaufać, że nadzór go odbuduje.
excache wykorzystuje to wprost: awaria jednego procesu cache nie przewraca całej warstwy, bo reszta procesów żyje niezależnie. Uszkodzony stan znika razem z procesem, a jego następca startuje czysty, zamiast ciągnąć za sobą zepsute dane.
Test tej własności polega na tym, że celowo zabijasz proces w trakcie ruchu i sprawdzasz, że warstwa dalej odpowiada. Jeśli cały cache pada razem z jednym procesem, drzewo nadzoru jest źle poskładane, i dobry test wyłapuje to od razu.
To jest test kontrfaktyczny w czystej postaci: nie sprawdzasz, że system działa, gdy wszystko idzie dobrze, tylko że przeżywa awarię, którą ma przeżyć. Test, który nigdy nie widzi padnięcia procesu, nie dowodzi żadnej odporności.
Odporność jako własność, nie zaślepka
Efektem jest warstwa, która traktuje awarie jako normalny stan pracy, a nie wyjątek do załatania. Współbieżność jest bezpieczna z założenia, bo nikt nie dzieli pamięci, a pojedyncza awaria jest lokalna, bo nadzór odbudowuje tylko to, co padło.
Własności warstwy i skąd wynikają
| Własność | Skąd wynika |
|---|---|
| Brak wyścigów | jeden proces, jedna wiadomość na raz |
| Brak blokad | komunikacja przez wiadomości |
| Izolacja awarii | stan zamknięty w procesie |
| Powrót do czystego stanu | drzewo nadzoru |
Więcej projektów
Inne realizacje z tej samej kategorii - zobacz, jak podchodzimy do podobnych wyzwań.
Masz podobny projekt?
Napisz do nas - wycena jest bezpłatna i wraca w godzinę.



