Jak AtomStore radzi sobie z dużym obciążeniem

AtomStore - system e-commerceDawno już nie pisałem na temat postępów w AtomStore. Czerwiec i lipiec był to dla nas gorący okres w czasie którym pracowaliśmy nad rozwojem systemu, optymalizacją oraz kilkoma ciekawymi wdrożeniami. Już niebawem pochwalimy się bardzo ciekawym wdrożeniem (top5 w swojej kategorii w Polsce), na razie chciałbym pochwalić się rezultatami w zakresie optymalizacji systemu.

Bardzo często o Atoma pytają nas duże sklepy internetowe, które są pod wrażeniem funkcjonalności oferowanej przez nasz system. Jednocześnie jednymi z częstszych pytań zadawanych przez klientów są „Czy AtomStore obsłuży n tysięcy indeksów?”, „Czy AtomStore poradzi sobie z PV na poziomie n milonów / m-c?”, itp.

Ponieważ nasz system jest stosunkowo młody, do tej pory mogliśmy podpierać się jedynie testami oraz doświadczeniem z innych projektów.

Optymalizacja

Przez ostatnie miesiące pracowaliśmy nad optymalizacją systemu i przygotowaniem go do obsługi dużej ilości indeksów w bazie oraz ruchu na poziomie kilku milionów PV / m-c. Oczywiście ostateczne możliwości są zależne od wielu czynników, np.:

  • ilość indeksów w bazie,
  • ilość atrybutów, wariantów,
  • konstrukcja front-endu (ilość filtrów, liczników, sortowań),
  • jakość wdrożenia szablonów,
  • konfiguracja wyszukiwarki,
  • częstotliwość zmian w katalogu, magazynie,
  • rozkład ruchu,
  • wydajność i konfiguracja serwera(ów),

jednak w przypadku słabego silnika e-commerce i najlepsze chęci osób odpowiedzialnych za wdrożenie nie pomoże 🙂

Jeśli idzie o optymalizację AtomStore (jak i każdej innej platformy) należy rozpatrzeć 2 zagadnienia – jakość kodu, zapytań do bazy, strukturę itp. oraz architekturę systemu (w jaki sposób można go skalować).

Architektura AtomStore

Pracując nad AtomStore zakładaliśmy, iż do naszych klientów należeć będą największe sklepy w Polsce. W związku z tym architektura systemu umożliwia „odpinanie” poszczególnych części (funkcji) systemu i uruchamianie ich na oddzielnych serwerach. Jest to jeden z najprostszych i najszybszych sposobów na skalowanie aplikacji. Po prostu jeśli ruch rośnie i serwer zaczyna mieć problemy z jego obsługą dodajemy kolejny serwer, który przejmuje część funkcji.

I tak w Atomie możemy między innymi:

  • rozdzielić funkcje serwerów DB – na master, slave,
  • rozdzielić serwer WEB na kilka serwerów, w bardzo dużych wdrożeniach byłyby to:
    • front-end dynamiczny (strona główna, lista produktów, kartoteki, koszyk),
    • media serwer,
    • api serwer (rekomendacje, statystyki, wyszukiwarka),
    • back-end (panel administracyjny, importy i eksporty).

Opisane wyżej możliwości nie będą potrzebne większości klientów, jednak pokazują iż nasz system „może rosnąć wraz z klientem”.

Optymalizacja kodu

W ostatnich 2 kwartałach pracowaliśmy także bardzo mocno nad optymalizacją kodu – zarówno PHP jak i zapytań SQL oraz wdrażaliśmy mechanizmy umożliwiające wydajniejsze cache-owanie. Najważniejsze prace które wykonaliśmy:

  • implementacja lazy loading (ładowanie tylko niezbędnych modułów),
  • cache na listach produktów, kartach produktów,
  • cache zapytań SQL,
  • spłaszczanie tabel przyspieszające ładowanie list produktów, działanie wyszukiwarki,
  • okresowe (pre)sortowanie i indeksowanie produktów w bazie,
  • użycie AJAX w operacjach opóźniających ładowanie strony:
    • pobieranie boksów z nowościami, promocjami, bestsellerami,
    • pobieranie rekomendacji produktowych,
    • wysyłanie do serwera statystyk klienta,
    • kompresja CSS, Sprite-y.

To tylko część z prac. W tym okresie szczegółowo analizowaliśmy zapytania oraz kod PHP. Logowaliśmy operacje które zajmowały najwięcej zasobów, optymalizowaliśmy algorytmy, rozbudowaliśmy możliwości i zoptymalizowaliśmy API.

Pamiętacie jak programiści Chrome wydając kolejne wersje chwalili się, iż nowa działa 2-3 krotnie szybciej? Oczywiście dotyczy to wybranych aspektów, ale my moglibyśmy się pochwalić podobnymi postępami. Np. po kilku optymalizacjach doszliśmy do czasu generowania pliku XML dla porównywarek na poziomie 10 minut (100 tys indeksów, 5 plików), gdzie początkowo przekraczał on godzinę.

AtomStore – to działa 🙂

W ostatnim czasie wdrożyliśmy 3 duże systemy e-commerce. Wszystkie działają na serwerach dedykowanych. Co ciekawe w 2 przypadkach można powiedzieć, iż na stosunkowo niedrogim hostingu (serwer za 400zł/m-c bez dysków SSD w dzisiejszych czasach nie robi na nikim wrażenia).

Przypadek 1:

  • 40 tys produktów,
  • wyszukiwarka po nazwach i atrybutach,
  • około 3000 zamówień / m-c.

Efekt – czasy strona główna, listing na poziomie < 1s, wyszukiwarka przy nowej frazie złożonej (nie scache-owanej) 1-1,5s.

Przypadek 2:

  • 4 tys produktów + warianty,
  • personalizacja,
  • wyszukiwarka po nazwach, producentach i atrybutach,
  • ~ 1 mln PV / m-c,
  • 50-80 tys PV / dzień (w przypadku akcji marketingowych).

Efekt – czasy podobne jak w przypadku przypadku 1.

Przypadek 3:

  • 150 tys produktów w bazie,
  • personalizacja,
  • wyszukiwarka po nazwach, atrybutach,
  • + 100 tys klientów w bazie,
  • ~ 1 mln PV / m-c.

Efekt – czas ładowania strony głównej ~1s. Czas ładowania listingu (cache) < 1s. Czas wyszukiwarki dla nowej frazy złożonej ~1s.

To nie wszystko

Warto podkreślić 1 fakt. W przypadku Atoma system dostarcza inteligentne rekomendacje, zarządza subskrypcją i wysyłką newslettera, udostępnia zaawansowany mechanizm wszukiwarki. Często dostawcy systemów chwalą się czasami na poziomie 0,2-0,5s ale do tego należy doliczyć np. czas na wygenerowanie rekomendacji przez zewnętrzną platformę.

I jeszcze ostatnia rzecz – wcale nie jesteśmy zadowoleni z rezultatów 🙂 mamy jeszcze plany związane z szerszym wykorzystaniem tabel indeksujących, optymalizacją panelu, modułu newslettera itd.

A jak może wyglądać naprawdę rozbudowane wdrożenie Atoma? Oto przykładowy schemat:

ps. 

AtomStore został napisany w CakePHP. Czasem pytano nas – czemu nie Symfony, Zend albo Ruby? Nasze zdanie zawsze było takie – jeśli znasz dobrze środowisko, wiesz kiedy ujawniają się jego słabości, jakie są mocne strony – lepiej trzymać się tego środowiska i wycisnąć 110% możliwości, niż stosować inne, modne rozwiązania. Na razie nie żałujemy 🙂

 

Jeśli spodobał Ci się ten post, napisz co myślisz w komentarzu lub subskrybuj RSS-a aby w przyszłości otrzymać powiadomienie o najnowszych postach.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *