Asi největší odlišností při vývoji Facebooku je odkládání požadavků na
zdroje dat napříč všemi částmi aplikace. K tomu používáme dva koncepty -
tzv. Preparables a operátor yield, který jsme si přidali do našeho
kompilátoru PHP. To umožňuje použít architekturu kešování, která se umí
vypořádat i s velkým množstvím zápisu (někdo něco totiž neustále
„lajkuje“). Kupodivu to i celkem úzce souvisí s XHP, což je prostředek
ke znemožnění XSS.
4. Problém 1+N dotazů
▪ SELECT * FROM posts ORDER BY created DESC LIMIT 20
▪ SELECT * FROM comments WHERE post_id = 1
▪ SELECT * FROM likes WHERE comment_id = 11
▪ SELECT * FROM likes WHERE comment_id = 12
▪ SELECT * FROM likes WHERE comment_id = 13
▪ SELECT * FROM comments WHERE post_id = 2
▪ Tisíce dotazů na stránku
5. Hromadné získání dat
▪ SELECT * FROM posts ORDER BY created DESC LIMIT 20
▪ SELECT * FROM comments WHERE post_id IN (1, 2)
▪ SELECT * FROM likes WHERE comment_id IN (11, 12,
13)
6. Hromadné získání dat
▪ SELECT * FROM posts ORDER BY created DESC LIMIT 20
▪ SELECT * FROM comments WHERE post_id IN (1, 2)
▪ SELECT * FROM likes WHERE comment_id IN (11, 12,
13)
▪ SELECT * FROM users WHERE id IN (101, 102, 103)
▪ SELECT * FROM user_groups WHERE user_id = 101
▪ SELECT * FROM groups WHERE id IN (201, 202, 203)
▪ Stovky dotazů na stránku
7. Možné řešení – denormalizace
▪ SELECT* FROM posts_with_comments_and_their_likes
ORDER BY created DESC LIMIT 20
▪ Desítky dotazů na stránku
▪ Problémy
▪ Duplicita dat
▪ Vkládání a změna
8. Generátory
class PhotoSet {
function gen() {
yield wait_for($this->genAssociatedContent());
yield wait_for($this->genURI());
}
}
▪ Pro každou úroveň zanoření jedna komunikace s úložištěm
9. Preparables
class PhotoSet extends Preparable {
function prepare($pass) {
switch ($pass) {
case 1:
$this->prepareAssociatedContent();
return true;
case 2:
$this->prepareURI();
return false;
}
}
}
▪ Generátory pro chudé
15. XHP může být generátor nebo Preparable
class :fb:newsfeed {
function gen() {
yield wait_for();
}
function render() {
return <div />;
}
}
echo <fb:newsfeed user-id={$user_id} />;
16. (c) 2009 Facebook, Inc. or its licensors. "Facebook" is a registered trademark of Facebook, Inc.. All rights reserved. 1.0