oprocz znanych projektow takich jak, cassandra, memcached czy nginx wymienione takze te z mniejszym buzzem:
- Qizmt (map reduce w C#)
- Kestrel (distributed message queue used by Twitter)
oprocz znanych projektow takich jak, cassandra, memcached czy nginx wymienione takze te z mniejszym buzzem:
http://www.slideshare.net/guestdfd1ec/design-patterns-for-distributed-nonrelational-databases#
poruszone algorytmy bloom filter, clock vectors, consistent hashing, gossip
http://www.linux-mag.com/cache/7711/1.html
deliberacje o postix io ktore ma juz 22 lata i bylo zaprojektowane nieadekwatnie do dzisiejszych volumenów.
http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/
usystematyzowana wiedza na styczen 2009 o rozproszonych key-value storach. brak tokyocabineta, redisa i innych pokazuje dynamiczny rozwoj w tym obszarze w roku 2009.
http://highscalability.com/blog/2010/2/19/twitters-plan-to-analyze-100-billion-tweets.html
omówienie prezentacji lidera analityków twitter’a Kevina Weil’a. slajdy pokazują proces wyboru technologii do przenalizowania 10 bilionów twittów w celu wydobycia wiedzy biznesowej na temat serwisu.
http://royal.pingdom.com/2010/02/23/nginx-the-little-russian-web-server-taking-on-the-giants/
historia nginx /endżineks/, web serwera rozwijanego przez jednego Rosjanina. napisany asynchronicznie utrzymuje obecnie 16 milionów web serwisów. sukcesywnie zastepuje bedacego w stagnacji lighttpd. w artykule wywiad z autorem Igorem Sysoev’em.
http://www.kegel.com/c10k.html
nadszedł czas, aby serwery webowe obsługiwały 10 tysięcy klientów rownolegle.
czestą operacją jest usuwanie elementow z wektora stl za pomocą iteratora w pętli. zeby to zrobić bezpiecznie, należy ustawic iterator na element ktory zwrocilo erase().
#define erase_iter_from_loop(iter, vec) \
iter = vec.erase(iter); \
if (iter == vec.end()) break; \
iter–;
przykład:
for (vector<x>::iterator i = y.begin(); i != y.end(); i++) {
erase_iter_from_loop(i, y);
}
http://www.facebook.com/note.php?note_id=280583813919
w facebooku przypada jeden inżynier na ponad milion użytkowników. ciekawe prawda?
od kiedy powstalo, php bylo i jest najpowszechniejszym jezykiem do programowania stron i aplikacji www. prostote nauki, pisania, czytania i debugowania docenil facebook. wrazliwe fragmenty, ktore najbardziej wplywaja na wydajnosc, maja byc szybkie lub konsumuja zbyt duzo CPU przepisuja w C++ na php extension korzystajac z zend api. dobre zbalansowanie szybkosci developowania (php) z wydajnoscia (C++). przy okazji poszukiwania udzialu php w rynku znalazlem web framework w C++ (CppCMS). nietrafniony pomysl. nieznajomosc mechanizmow.
http://www.linux-mag.com/cache/7589/1.html
jak szacowac koszt i wydajnosc projektowanego, lub juz dzialajacego systemu:

przyklad z artykulu: projektujemy system i myslismy czy wybrac baze danych pobierajaca dane z dysku, czy baze ktora trzyma calosc danych w pamieci? jesli przewidujemy ze danych bedzie wiecej niz jestesmy w stanie trzymac w RAM na jednej maszynie, musimy kupic ich wiecej i stworzyc klaster. koszt systemu rosnie, ale taki system bedzie wydajnieszy, bo pobranie z pamieci + przeslanie przez siec lokalna jest kilka razy szybsze niz pobranie z dysku.
http://www.linux-mag.com/id/7615
rzeczy, ktore powinnismy wpisac/przestawic po instalacji
http://royal.pingdom.com/2010/01/15/the-9-most-important-events-in-open-source-history/

jako uzupelnienie polecam pierwsze rozdzialy ksiazki Thomasa Friedmana “Świat jest płaski”, w ktorych autor opisuje powstanie netscape’a i apache. powstanie i powodzenie tych dwoch projektow mialo ogromne znaczenie w postepujacym procesie globalizacji.
http://about.digg.com/blog/database-capabilities-high-volume-environment
ladnie usystematyzowana wiedza o nierelacyjnych bazach danych z przykladowymi zamknietymi i otwartymi projektami.
http://highscalability.com/blog/2009/10/13/why-are-facebook-digg-and-twitter-so-hard-to-scale.html
facebook przygotowujac strone do wyswietlenia stosuje ‘tradycyjny’ sposob, czyli pobiera z roznych czesci systemu dane i sklada z nich dokument (Pull On Demand). z kolei digg serwuje strone, ktora juz czeka przygotowana wczesniej w pamieci lub na dysku, poniewaz przy kazdej zmianie (nowy komentarz, nowy post), przebudowuje wszystkie strony (Push on Change), ktorych update dotyka. podejscie digga wymaga wiecej zasobow sprzetowych ale odplaca sie szybkoscia.
http://wiki.apache.org/hadoop/PoweredB
klastry hadoop’a maja w swoim podorężu najwieksi gracze w internecie: adobe, aol, facebook, ibm, imagehack, last.fm, yahoo (ponad 25,000 w klastrze). google uzywa swojego nie open source’owego map reduce.
aby zrozumiec idee map reduce i hadoop’a w szczegolnosci, polecam pierwsze 2 linki a dopiero potem 3-ci:
w zolnierskich slowach:
http://code.google.com/p/redis/wiki/TwitterAlikeExample
ten dokument pozwala ‘zlapac’ idee przejscia z projektowania serwisow na relacyjnej bazie danych na baze klucz-wartosc. pokazana na bazie redis koncepcja nosql.
zadanie 1: zmienic we wszystkich nazwach plikow w biezacym katalogu spacje na podkreslenia.
zadanie 2: wylistowac pary (kolejny numer, plik) z biezacego katalogu. np.
0 bin
1 boot
2 cdrom
3 dev
4 etc
5 home
rozwiazanie zadania 1:
for x in `ls | tr ” ” “_”`; do echo $x; mv ” `echo $x | tr “_” ” “` ” $x; done
rozwiazanie zadania 2:
i=0; for x in `ls `; do i=$(( i + 1 )); echo $i $x; done
http://developer.yahoo.com/performance/rules.html
male rzeczy, ktore latwo moga umknac a potrafia zrobic roznice. wielu poczatkujacych developerow nie zdaje sobie sprawy z tych optymalizacji.
za potrzeba chwili napisalem na kolanie skrypt umozliwiajacy szybkie pobranie wszystkich plikow ze strony udostepnionych w serwisie przeklej.pl. [wymaga zrobienia wciec]
import os, sys
if len(sys.argv) < 2:
print “usage: python przeklej.pl url”
sys.exit(0)url = sys.argv[1]
print ’sciagam html z ‘, url, ‘… ‘
os.system(“wget ” + url + ” -O przeklej.out.html”)
pliki = {}
for x in open(“przeklej.out.html”):
if “plik/” in x:
b = x.find(“plik/”)
y = x[b+5:]
b = y.find(“\””)
if b >= 0:
p = y[0:b]
pliki[p] = 0i = 0
for x in pliki:
toks = x.split(“-”)
id = toks[-1:][0]
title = x[0:len(x)-len(id)-1]
ext = title.split(“-”)[-1:][0]download = “download/” + id + “/” + title
os.system(“wget www.przeklej.pl/” + download + ” –referer www.przeklej.pl/plik/” + x + ” -O ” + title + “.” + ext)
i += 1