Wednesday, April 1, 2009

Yorum Mimarisi

Bir site dusunelim; insanlar herkes tarafindan okunabilecek sorular soruyorlar, o sorularin altinda cevaplar oluyor. Ana sorular bir anahtar-deger tabanindaki bir listede depolanacak demek ki... bu baglamda ilk aklimiza gelen cozum, "sorular" adinda bir anahtar yaratarak herkesin bu anahtar altindaki listeyi alarak, ona yeni "soru objelerini" eklemesidir. Son sorulari gormek isteyen ayni sekilde bu bilinen isimden objeye erisir. Bir anahtar-deger tabaninda "sorular" anahtari tek bir taban bolumune (database shard) yani makinaya gider.

Fakat bu durumda verinin yatay bolunme fikri ihlal edilmis olur. Pek cok app server ayni makinaya hucum eder, cakismalar baslar, yavaslik basgosterir.

Cozumumuzu iyilestirmek mumkun mu?

Highscalability.com sitesindeki bir yazidaki fikirlerden hareket edelim: Cok guzel bir ornek paylasilmis; bu ornek "bolunmus sayac (sharded counter)" ornegidir. Sistemin bir toplam sayisini global bir sayac uzerinden idare etmesi gerekmektedir, burada ilk akla gelen "sayac" adinda bir anahtari herkesin guncellemeye ugrasmasidir. Cok kullanicili bir ortamda bu yapi, tek makinadaki tek objeye dogru saldiran baglanicilarin varligidir ve bunu sonucu kitlenme olusacaktir.

Cozum ilginc: Bir degil, pek cok sayac yarat. Sayac1, sayac2, sayac3 gibi.. Bu sayaclar ayri objeler, ve buyuk bir ihtimal ayri taban bolumleri / makinalar uzerinde gideceklerdir, o zaman sayaci arttirmak isteyen herhangi bir kullanici "rasgele" bir sekilde bu sayaclardan birini secer ve degerini arttirir. Genel toplam alinmak istediginde ne olur? O zaman okuyucu tum sayaclari okur, tum sayaclardan gelen sayilari birbirine toplar, ve global toplam elde edilmis olur!

Bu sayede hem guncelleme islemi dagitik hale gelir, hala dogru toplam elde edilir, hem de okuma islemi daha ucuz bir operasyon oldugu icin bir sey kaybedilmis olmaz.

Yazinin dagitik anahtar-deger tabanlariyla sistem tasarlayanlara tavsiyeleri soyle ozetlenebilir: 1) mimarinizi yazimlari olcekleyecek sekilde hazirlayin 2) yazimlardaki cakismalari azaltacak sekilde tasarlayin 3) yazimlari paralelize edebildigimiz kadar paralellestirin 4) Okumanin ucuz oldugunu unutmayin.

Simdi bu fikri yorum altayapisina uygulayalim:

Son yorumlar listesi bir degil pek cok olacak. Tabii ki bu pek cok listelerin anahtarlari sistem tarafindan "onceden bilinen (well-known)" isimler olacak. Yeni bir soru sormak isteyen app server, rasgele sekilde bu anahtarlar arasindan birini sececek, o listeye erisecek ve eklemeyi ona yapacak.

Kullanici "son sorulari" gormek istediginde ne yapacak? Tum listeleri alacak, listeyi birlestirecek, uzerinde siralama (sort) yapacak, ve sayfa sayfa bu final listeyi kullaniciya sunacak.

Yazimlar dagitilmis olacak. Tek kaynaga dogru yarisma kavrami ortadan kaybolacak.

Voldemort forumunda ilgili bazi yorumlar:

No comments: