Damian “lego” Legawiec jest autorem gametrade.pl – serwisu służącego do wymiany gier. Działająca od prawie roku aplikacja zebrała sporą rzeszę aktywnych użytkowników, oraz całkiem pokaźną liczbę pozytywnych opinii i branżowych nagród. Nas jednak interesuje techniczna strona serwisu, który został napisany w Ruby on Rails.

Aleksander Dąbrowski: Czy użyłeś jakichś ciekawych gemów lub technologii? Jeśli tak, to jakich i do czego?

Damian Legawiec: Gametrade był pierwszym serwisem w Polsce gdzie wykorzystano nowe API Facebooka na dużą skalę ;) Sporo używam hpricota aby aktualizować bazę gier z zewnętrznych źródeł (16-17tys pozycji z okładkami). Użytkownicy mogą także pobrać specjalnie dla nich wygenerowaną wklejkę (obrazek) którą mogą umieścić na forach dyskusyjnych. Wygląda to np. tak . Generowane przez RMagick.

Oczywiście wyszukiwanie obsługuje Sphinx. Reszta gemów to raczej standard (paperclip,will_paginate, delayed_job, whenever, geokit, hoptoad, newrelic, redcloth).

AD: Czy piszesz testy i jakie masz ich pokrycie?

Zdecydowanie za mało, ale dzięki bardzo oddanym i aktywnym użytkownikom wszelkie bugi są wyłapywane w mgnieniu oka :) Najlepiej “pokryte” są modele (rspec), najmniej mam testów integracyjnych (cucumber).

AD: Na jakim serwerze działa gametrade.pl i ile zużywa zasobów?

DL: Gametrade działa na jednym dedykowanym serwerze w Hetzner.de (intel i7 quad, 8gb ram) a zużywa zależnie od ruchu. Nie będzie niespodzianką jeśli napiszę że najwięcej z zasobów konsumowany jest ram :) Load nie skacze powyżej 4 nawet w najbardziej gorących sytuacjach, przeważnie jest w granicach 1-2. Serwis od początku roku urósł trzykrotnie i obecnie notuje 3,5mln odsłon miesięcznie.

Sam portal działa na kombinacji Nginx + Passenger. Zastanawiam się nad Unicornem aby nie odczuwać tak boleśnie deployów, ale znowu Passenger3 obiecuje duży skok wydajności :)

AD: Jak optymalizujesz wydajność serwisu?

DL:

  • memcache (całe akcje, partiale)
  • tuning ustawień mysqla
  • cache zapytań na poziomie samego serwera bazy danych
  • denormalizacja bazy danych
  • oczywiście indeksy w bazie :)
  • “magiczna” opcja :include w ActiveRecord :)
  • Railsowe counter cache
  • ustawienia samego serwera aplikacji (passenger – ilość i długość “życia” instancji)
  • nginx zamiast apacza
  • przeniesienie ciężkich zadań do delayed joba (trzeba uważać, delayed job potrafi również mocno “zamulić”)

po stronie przeglądarki:

  • kompresowanie javascriptów i cssów
  • osobne subdomeny na statyczny content
  • last modified
  • gzipowanie

Należy również pamiętać że wszelkie zadania w cronie czy serwer pocztowy (zwłaszcza w aplikacjach wysyłających dużo powiadomień) też będą znacząco obciążać maszynę.

Oczywiście trzeba to wszystko monitorować (newrelic, request log analyzer), robienie poprawek wydajnościowych na zasadzie “wydaje mi się że to powinno pomóc” nie działa :)

Wolne zapytania mysqlowe każdy szybko znajdzie używając mysql slow query log.

AD: Wiem, że cześć funkcjonalności ze względu na wydajność przepisałeś na Racka. Uważasz, że taki zabieg się opłaca? Dublujesz przecież w ten sposób kod.

DL: Na Rails Metal dokładnie :) Oczywiście nie są to jakieś całe akcje/ekrany ale funkcje które bardzo często, bardzo szybko uderzają bazę np. autocomplete, pobranie rekordu jsonem, javascriptowe wklejki na zewnętrznych witrynach itp.

W przypadkach które się do tego nadają zdecydowanie się opłaca, działa szybciej dla użytkownika i mniej obciąża serwer. Jest to trochę brzydkie ale czasami trzeba ubrudzić ręce.

AD: Czy piszesz testy do elementów działająych pod Rackiem?

Nie :)

AD: Masz jakieś rady dla programistów pragnących stworzyć popularny serwis?

DL: Żeby się dwukrotnie zastanowili czy chcą to robić, bo nie wiedzą co czynią :)

A tak zupełnie serio – nie robić kolejnego facebooka, naszej klasy, twittera etc. Zdiagnozować problem (czego brakuje? jaka nisza? czy da się na tym zarobić?), zrobić jak najszybciej jak najprostszą wersję i wypuścić w świat. Zebrać feedback, iterować, iterować i jeszcze raz iterować. Po znalezieniu inwestorów, założeniu firmy itd zalecany jest zakup dużego zapasu persenu :)

AD: Wolisz Xbox czy PS3?

DL: Preferuje dobre gry, konsola nie ma znaczenia. Obecnie mój Xbox jest głośniejszy od odkurzacza więc częściej grywam na PS3 :)

AD: Dzięki i powodzenia w dalszym rozwijaniu gametrade.pl