Olyan egyszerűnek tűnik az egész, szimpla kis alkalmazás, 140 karakter, ugyanmár! Csakhogy ezen a szinten minden sokkal bonyolultabb. Óriási mázlink van, hogy Magyarország akkora, amekkora: rendszerint nem futunk bele olyan problémákba, mint a "nagyok kint".
Szerverek, architektúra, satöbbi. Mi van a szoknya (motorháztető) alatt? Próbáljuk meg kitalálni, hogy miért állnak le állandóan. Lesz konklúzió is!
A Twitter Ruby on Rails-re íródott, amit a kifejezetten erre írt Mongrel webszerveren futnak (állítólag a leggyorsabb/leghatékonyabb RoR megoldás, nem tudom, én csak egy lesajnált PHP-s vagyok). A Twitter 180db RoR instance-t használ. (fogd fel afféle "virtuális" szerverként).
Az adatbázis-szerverük MySQL. Azért használ sok nagy webes szolgáltatás MySQL-t, mert olcsó és könnyű rá fejleszteni. Az igazi nagy cluster adatbázis-szerverek méregdrágák és felborítják a webkettes üzleti modellt. (A MySQL cluster üzemmódja sajnos nem elég jó, kell hozzá még pár verzió. Erről egy későbbi posztban majd, egyszer.)
Most figyelj: 1 db MySQL szerverük van (meg egy slave a statisztikákhoz és riportokhoz). Ha ezt a szervert használnák az adatbázis olvasásához, akkor egyáltalán nem tudnának működni: ez csak arra van, hogy tárolják az adatokat (insert/update/delete).
16GB-nyi memcached cache. A trükk itt van, memóriában tárolnak egy csomó mindent és így a lekérdezésekhez szinte egyáltalán nem kell a MySQL-t használni. Ez a megoldás egyre-másra terjed: van egyszem MySQL a perzisztens, merevlemezen tárolt adatokhoz és valamilyen elosztott-megosztott memóriás izé az olvasáshoz. A fürtözött IMDB - in memory database dolog hamarosan nagy buzz lesz, majd egy későbbi posztban erről is.
Az egész Twitter 8 db Sun X4100S vason fut. A MySQL-nek természetesen egy kimaxolt példányt adtak, 8 maggal meg minden.
A Twitter egy-adatbázisszerveres koncepciója a probléma. Szegény 2400 kérést kap minden másodpercben, tehát fullon megy. Hiába cache-elik az olvasásokat, a Twitter már van annyira népszerű, hogy az adatbázis írása szűk keresztmetszet. Hiába olyan egyszerű a Twitter adatbázisa, hogy egyetemistáknak is kiadható vizsgafeladatként a megtervezése (emlékszel, amikor a normalizálást próbálták belédverni?).
A saját bevallásuk szerint is akkor szokott lerohadni a rendszer, amikor sokan állnak neki sok follow-nak, azaz mikor sokan kezdenek követni, sokan kezdenek "barátkozásba". Ez nyilván több adatbázis-műveletet eredményez, mint egy szimpla Twitter status update.
Sokszor előfordul, hogy márketing célokból valaki kigyűjt néhány ezer Twitter felhasználónevet és follow-ra rakja. Az ilyenek mindig kiakasztják a rendszert, aztán a Twitteresek szépen kitörlik őket felhasználóstul-mindenestül.
600 feldolgozandó kérés érkezik másodpercenként, ebből csak 60 a Twitter saját oldala, a többi API kérés (third party alkalmazások, asztali olvasók meg kismillió mashup). A 600 kérés általában 2-300 kapcsolattól érkezik.
Egy kérést átlagosan 0.2 másodperc alatt szolgálnak ki, ami nagyon sok (egy szerver mindössze 3-4 kérést tud teljesíteni egyszerre...) Mutatja, hogy a rendszer teljesítőképességének határán dolgozik. Én éppen most optimalizálom az összes általam fejlesztett rendszert, és azok akkor válaszolnak 0.2 alatt, ha kiiktatok egy csomó optimalizálást.
Egy adatbáziskérést 0.05-0.1 másodperc alatt futtatnak le, ez megintcsak kábé tízszerese a jónak. Pengeélen táncolnak.
Nem mondják meg, hogy hány felhasználójuk van, csak annyit, hogy több mint 350e. Mivel meglehetősen aktív a táboruk, ezért feltételezhetően nincs annyi alvó account, mint mondjuk az iWiW-en.
Az SMS-ek küldésére költik a legtöbb pénzt, mert ehhez külsős SMS gateway-ek szükségesek, amik nagyon drágák. Ezek úgy működnek, hogy vagy egy API-n keresztül küldöd nekik a küldendőt, vagy e-mailt küldesz egy meghatározott címre és azt küldik tovább SMS-ben.
A kezdeti leállásoknál nem tudták mi van, mert elfelejtettek monitoring cuccot telepíteni, semmi statisztikájuk nem volt... a Twitter tényleg amatőr szintről indult és belefutottak szinte az összes elképzelhető skálázódási ügybe.
Később rengeteg felesleges időt töltöttek külsős fejlesztők tanácsainak kipróbálásával átütő eredmény nélkül, ezért most már inkább házon belül próbálják megoldani a problémákat.
Rájöttek, hogy nem az alkalmazott nyelvtől függ a teljesítmény, hanem az alkalmazás szerkezetétől. Hiába váltanának X nyelvről Y-ra, az a max. 20-30%-os haszon nem elég.
Nagyságrendekben kell gondolkozni.
Ha a webes dolgodhoz egy másodperc alatt átlagban több, mint 50 kérés esik be, ott egészen más szaktudásra van szükség, a "sima" fejlesztő már nem elég. Ha ez a szám több, mint 100, akkor még több skill kell. Sőt, a megoldandó problémák nagysága exponenciálisan nő.
Én hamarosan belefutok egy ilyenbe, ezért tanulom ezerrel a praktikákat és tolom a cloud computing-ot.
Magyarra lefordítva napi 50e látogatás (nem Webaudit-os fos view! igazi!) fölött már okosan kell, 100e fölött pedig hűha van. Ezen a szinten már egy lekérdezés megtervezése sem az SQL megírásából áll és minimum háromrétegű az adatok elérése (local cache, elosztott cache, adatbázis).
iMect means internet, media and other cool things. We're a small company located in Hungary. There is a big footer on every page where you can discover what we do and what happens with us.
Az iMect jelentése: internet, média és egyéb király dolgok. Egy kis magyar cég vagyunk. Minden oldalon van egy nagy lábléc, ahol felfedezheted, hogy mivel foglalkozunk.