Założony w 2004 roku Facebook jest największą siecią społecznościową świata i miliardowym biznesem, etyka którego budzi coraz większe kontrowersje. Wciąż jednak, niezależnie od poglądów, stos technologiczny wykorzystywany przez ten serwis do obsługi olbrzymiego ruchu może być fascynujący. Sprawdźmy, jak działa Facebook.
Garść statystyk
Aby zdać sobie sprawę, jak ogromnym wyzwaniem dla inżynierów jest zapewnienie stałej, nieprzerwanej dostępności tej sieci społecznościowej, rzućmy okiem na ostatnie statystyki:
2,6 miliarda – tylu użytkowników z całego świata odwiedza Facebooka przynajmniej raz na miesiąc. Jeśli ta liczba nie jest wystarczająco imponująca, warto wspomnieć, że 1,73 miliarda użytkowników loguje się na platformie dzień w dzień.
Co minutę użytkownicy dodają ponad 300 tysięcy nowych statusów, wgrywają 150 tysięcy zdjęć i dzielą się 50 tysiącami linków.
4 petabajty – tyle nowych danych jest dodawanych przez użytkowników każdego dnia. Co sekundę tworzone są miliony nowych rzędów w bazie danych, a przeszukiwane dziesiątki miliardów z nich.
8 miliardów – to zaś liczba wyświetleń treści wideo w ciągu jednego dnia, z czego 20% to transmisje na żywo.
Ta olbrzymia ilość danych jest przetwarzana z wykorzystaniem rozmieszczonych na całym świecie serwerowni o powierzchni ponad 140 hektarów. W każdej z nich znajdują się natomiast miliony serwerów. Nawet takie zasoby stają się niewystarczające, a Facebook ciągle buduje nowe centra danych do obsługi rosnącego ruchu.
Oprogramowanie, które zapewnia skalowalność Facebookowi
Facebook wciąż korzysta z czegoś na wzór jakże popularnego stosu LAMP, rozbudowanego oczywiście w znaczący sposób. Serwery działają w oparciu o system Linux, nie jest to jednak żadna z popularnych dystrybucji, ale specjalnie zmodyfikowane rozwiązanie dostosowane do maksymalnej przepustowości sieciowej. Backend wciąż napisany jest w języku PHP, ale samo przetwarzanie tego kodu zachodzi z wykorzystaniem specjalnego kompilatora. Znajdziemy tu również bazę MySQL – ta jednak wykorzystywana jest na zasadzie magazynu typu klucz-wartość, zaś logika została przeniesiona na webserwery w celu zapewnienia większej wydajności i łatwiejszej optymalizacji. W stosie technologicznym Facebooka znajdziemy także inne technologie, zarówno te powszechnie dostępne, jak i specjalne, dedykowane rozwiązania. Te ostatnie są często udostępniane jako open-source, co czyni je możliwymi do przetestowania dla każdego zainteresowanego.
Czytaj więcej: Instalacja stosu LAMP na Debianie – poradnik
Memcached
To oprogramowanie znane jest chyba każdemu programiście webowemu, nawet jeśli jego popularność spada w ostatnich latach na korzyść Redisa. System buforowania pamięci Memcached tworzy warstwę pamięci podręcznej pomiędzy webserwerami, a serwerami baz danych MySQL, skracając przy tym radykalnie opóźnienia. Przez lata Facebookowi udało się wprowadzić znaczną ilość modyfikacji i usprawnień do samego Memcached oraz wykorzystywanego stosu sieciowego dla jeszcze lepszego cache’owania najczęściej wywoływanych zapytań. Wykorzystywane są tysiące serwerów Memcached z zapisanymi dziesiątkami terabajtów danych – jest to prawdopodobnie największe wdrożenie tego systemu na świecie.
HipHop oraz HipHop Virtual Machine (HHVM)
PHP jest językiem skryptowym, te zaś nie należą do najwydajniejszych w porównaniu do języków niższego poziomu – i to nawet pomimo znaczącej poprawy, która nadeszła wraz z wydaniem PHP 7 i kolejnych aktualizacji. Żeby obejść ten problem bez konieczności przepisywania całego backendu, inżynierowie Facebooka stworzyli w przeciągu 18 miesięcy HipHop, specjalny konwerter tłumaczący kod PHP na C++, który następnie jest kompilowany i wykonywany. Przełożyło się to na znacznie lepszą wydajność i bardziej optymalne wykorzystanie zasobów webserwerów.
HipHop przestał jednak być rozwijany w 2013 roku, kiedy to został zastąpiony przez jeszcze bardziej rozbudowane rozwiązanie HHVM, czyli HipHop Virtual Machine. Działa ono jak kompilator JIT (just-in-time), tłumacząc kod w języku Hack (specjalny dialekt PHP wykorzystywany przez Facebooka) na wysokopoziomowy kod bajtowy HHBC, a następnie wykonując kolejne tłumaczenie – tym razem na kod maszynowy dla architektury x86-64. Po drodze kod przechodzi jeszcze dodatkową analizę i optymalizację. HHVM przypomina w swoim działaniu maszynę wirtualną Javy (JVM) lub znany z C# mechanizm CLR. Wykorzystanie HipHop Virtual Machine pozwoliło osiągnąć o 15% wyższą wydajność w stosunku do oryginalnego rozwiązania HipHop.
Haystack
Heystack to stworzony przez Facebooka magazyn obiektowy służący do przechowywania i wyszukiwania zdjęć wgranych przez użytkowników platformy. Radzi sobie z obsługą ponad 20 miliardów obrazków, przy czym każdy jest przechowywane w czterech kopiach różniących się rozdzielczością. Heystack komunikuje się bezpośrednio z przeglądarką użytkownika, oszczędzając przy tym pracy webserwerom. Wykorzystuje on własne mechanizmy pamięci podręcznej w celu jeszcze wydajniejszego serwowania tych wszystkich zdjęć śmiesznych kotków, na które codziennie patrzą miliardy oczu.
BigPipe
BigPipe to specjalny system dynamicznego udostępniania stron internetowych i aplikacji Facebooka. Pozwala dzielić je na sekcje nazywane “pagelets”, z których każda jest serwowana równolegle, ale niezależnie od siebie. Przykładowo, okienko czatu jest w tej metodzie odrębną sekcją od tablicy z postami. Dzięki zastosowaniu BigPipe, użytkownik dostanie (niemal) w pełni funkcjonalny serwis nawet wtedy, gdyby któraś z sekcji uległa tymczasowej awarii – jej niedostępność nie wpłynie bowiem negatywnie na pozostałe.
Scribe
Facebook generuje olbrzymie ilości logów każdego dnia, podzielonych na setki różnych kategorii. W celu ich prostszego gromadzenia i przetwarzania stworzono narzędzie Scribe – skalowalny, odporny na awarie sieci oraz pojedynczych węzłów serwer, którego zadaniem jest zbieranie logów w czasie rzeczywistym z wielu źródeł. Dodatkowo, Scribe został zaprojektowany w ten sposób, aby oszczędzać na zużyciu dysków oraz transferach danych. Od 2019 roku narzędzie to nie jest już jednak rozwijane przez Facebooka, który prawdopodobnie postawił na inne, jeszcze wydajniejsze rozwiązanie.
Hadoop oraz Hive
Apache Hadoop jest to open-source’owa implementacja MapReduce, platformy do przetwarzania równoległego na klastrach serwerów. Pozwala wykonywać obliczenia na olbrzymich zbiorach danych, a takimi, jak wiemy, dysponuje Facebook, który wykorzystuje Hadoop do wykonywania zadań analitycznych. Hive to natomiast specjalne narzędzie umożliwiające wykonywanie zapytań SQL dla zbiorów danych Hadoop, co ułatwia jego użytkowanie dla pracowników niebędących profesjonalnymi programistami.
Thrift
Facebook wykorzystuje kilka różnych języków programowania dla poszczególnych usług. Od PHP oraz jego dialektu o nazwie Hack, przez Erlang używany do budowy czatu, aż po Pythona, Javę i C++, a prawdopodobnie także kilka innych języków. Aby “spiąć” je wszystkie w całość i zapewnić niezakłóconą komunikację między usługami, Facebook wykorzystuje opracowany wewnętrznie framework Thrift. Można powiedzieć, że stanowi on formę facebookowego lingua franca.
Varnish
Varnish to akcelerator HTTP, który może służyć jako load-balancer oraz zapewniać mechanizmy pamięci podręcznej. Facebook używa Varnisha głównie do udostępniania zdjęć, obsługując przy tym miliardy zapytań każdego dnia.
React
O React.js słyszała chyba każda osoba zainteresowana tworzeniem aplikacji webowych. Ta biblioteka JavaScript powstała w 2011 roku nakładem pracy jednego z inżynierów Facebooka. Dziś jest powszechnie wykorzystywana w multum różnych zewnętrznych projektów, ale jej twórcy bynajmniej o niej nie zapomnieli – przy pomocy Reacta zbudowano m.in. nowy układ głównej witryny Facebooka, a także dostępne przez przeglądarkę wersje Instagrama i WhatsAppa. Użytkowana jest także kolekcja algorytmów React Fiber służąca do renderowania grafiki.
Dodatkowe metody radzenia sobie ze skalowaniem w skali globalnej
Powyżej wymieniłem kilka przykładów oprogramowania, które umożliwia Facebookowi poprawną pracę i ciągłą dostępność. Obsługa tak olbrzymiego systemu jest jednak zadaniem niezmiernie złożonym, warto więc wspomnieć dodatkowo o innych metodach stosowanych przez inżynierów Facebooka w celu zapewnienia globalnego skalowania serwisu.
Gatekeeper
Często zdarza się, że nowości zapowiadane przez Facebooka trafiają jedynie do części użytkowników, podczas gdy pozostali muszą obejść się smakiem przez pewien, niekiedy dłuższy, czas. Tak właśnie jest przykładowo z nowym, zupełnie przebudowanym layoutem serwisu. Stoi za tym rozwiązanie Gatekeeper – system umożliwiający uruchamianie różnych zestawów kodu dla wybranych grup użytkowników. Przy pomocy Gatekeepera Facebook wykonuje stopniowe wdrożenia poszczególnych funkcji, testy A/B lub udostępnia swoim pracownikom nieco zmodyfikowaną wersję serwisu. Dodatkowo, Gatekeeper umożliwia wykonanie tzw. ciemnych uruchomień (ang. dark launches) – nowe funkcje są dodawane do serwisu lub aplikacji zanim jeszcze staną się widoczne u docelowych użytkowników (zazwyczaj na dwa tygodnie przed tym etapem), co pozwala wcześniej wykryć potencjalne błędy.
Profilowanie i monitoring
Facebook oczywiście bardzo dokładnie monitoruje wszystkie swoje systemy. Tak dokładnie, że monitoringowi podlega praca nawet poszczególnych funkcji PHP – w tym celu wykorzystywane jest narzędzie XHProf.
Tymczasowe wyłączanie funkcjonalności
Nawet pomimo olbrzymiej mocy obliczeniowej serwerów oraz multum dokonanych optymalizacji, systemy Facebooka mogą ulec potencjalnemu przeciążeniu lub awarii. Inżynierowie mogą przy pomocy zestawu przełączników stopniowo wyłączać mniej ważne funkcje, a w ten sposób zapewnić więcej zasobów tym najczęściej wykorzystywanym.
CDN
Dla możliwie najwydajniejszego udostępniania treści w dowolnym miejscu na świecie Facebook korzysta nie tylko z rozmieszczonych na całym globie serwerowni, ale także prywatnej sieci typu Content Delivery Network. To właśnie za pośrednictwem CDN udostępniane są treści statyczne, takie jak obrazki, wideo lub gotowe pliki hipertekstowe.
Ciągła optymalizacja
Facebook, wraz z należącymi do spółki WhatsAppem oraz Instagramem, nie rośnie już może tak dynamicznie pod kątem ilości nowych użytkowników jak niegdyś, ale ilość danych przechowywanych i przetwarzanych przez platformę zwiększa się bardzo szybko z roku na rok.
Praca inżynierów Facebooka polega więc w sporej mierze na wyszukiwaniu wąskich gardeł i ciągłym podnoszeniu skalowalności. Przykładowo, sam system służący do przechowywania zdjęć został już kilkukrotnie przepisany w miarę rozwoju serwisu. Z pewnością najbliższe lata przyniosą kolejne ciekawe mechanizmy służące do obsługi ogromnego ruchu i równie ogromnej ilości danych.
Obsługa sieci społecznościowej, która ma więcej “obywateli” niż dowolne państwo, jest z pewnością olbrzymim wyzwaniem.