AppEngine tipy pro pokročilé (Java)
“AppEngine, AppEngine! Kde SDK tvé stáhnouti mohu, bych Ideu svou potěšila?” Tak volá Julie, předtím než se pustí do nového projektu. Alespoň v překladu profesora Hilského.
Julčo! Mám pro tebe několik tipů, které jsem prezentoval na letošním DevFestu.
Prvních 5 tipů
Tomucha: Pokud používáš JDO nebo JPA, neděláš dobře.
Julie: Ale já jsem na to zvyklá z relačních databází, umím to a funguje mi to.
Tomucha: No právě. JPA i JDO jsou nástroje pro relační databáze, kdežto Objectify je napsané na míru AppEnginu a perfektně mu rozumí. Pokud chceš vytěžit maximum z toho co ti AppEngine dovoluje a napsat server efektivně (= levný provoz), běž do Objectify.
Tomucha: V životě 14leté Italky z 16. století jsou chvíle, kdy prostě potřebuje nad tabulkou unique index. Pokud potřebuje jen jeden a jeho hodnota se nemění, může hodnotu schovat do primárního klíče, to funguje perfektně.
Julie: A co když mi jeden index nestačí, nebo nechci použít primární klíč? Třeba email uživatele chci unikátní, ale chci mít možnost ho měnit. Navíc jako identifikaci uživatele ho nechci používat, je to citlivý údaj.
Tomucha: Vyrobíš si speciální entitu, která pro tebe bude všechny unikátní klíče udržovat. Jejím primárním klíčem bude string složený z toho co má být unikátní (viz. obrázek) a jejím jediným dalším sloupcem bude identifikace vlastníka téhle unikátní hodnoty.
Julie: Aha! A protože AppEngine umožňuje transakci až nad 5ti entity groupami, můžu unikátnost zajistit v rámci transakce, jako to máš v bublině “zápis” na obrázku výše.
Tomucha: A pokud jde o ten email v PK … Správně říkáš, že není moudré použít citlivý údaj jako primární klíč, ale vždycky tam můžeš dát jeho hash. To je pořád lepší než tyhle ruční UniqueIndex-y. Ale pokud potřebuješ ten email měnit, nic jiného ti nezbude.
Tomucha: Představ si modelovou situaci. Chceš ukládat informace o změnách peněz na nějakém účtu. Kdy, kolik a komu. Víš co je idempotence?
Julie: Může se stát, že se blok transakce pustí vícekrát a to i když se zápis už provedl. Idempotence transakcí znamená, že mi to nebude vadit a že transakční blok je napsaný tak, že nedojde k nekonzistenci mých dat.
Tomucha: Přesně. Pokud jako primární klíč záznamu o změně použiješ například sekvenci přidělenou AppEngine, máš zaděláno na problém.
Julie: Takže si primární klíč sestavím sama, například z timestampu a dalších údajů. Takový variabilní symbol. A udělám to ještě předtím, než transakci otevřu. I kdyby se zápis provedl vícekrát, v nejhorším jen přepíšu existující záznam tím samým.
Julie: Neměl bys nějaký tip, jak do transakce nacpat víc entity group něž pět? Někdy by se to hodilo, zvlášť s těma unique indexama.
Tomucha: Přímo do transakce jich víc nedostanem, ale v rámci transakce je možné naplánovat task. Ten se skutečně naplánuje, jen když transakce proběhne úspěšně. A pak se bude opakovat tak dlouho, dokud neuspěje. Čili - pokud máš v rámci transakce určitý blok operací, který nemusí nutně proběhnout hned a u kterého ti stačí, že proběhne někdy brzo, dej to do tasku.
Julie: Třeba co?
Tomucha: Třeba když chceš po přidání komentáře k článku uložit k článku celkový počet komentářů (denormalizace datového modelu). To můžeš udělat kdykoliv později a spočítáš to správně, i když mezitím přibudou další komentáře.
Julie: 50 centů za 10 tisíc dotazů? To je zlodějna!
Tomucha: Je to tak, SearchAPI je drahé.
Julie: Ale moji uživatelé chtějí hledat podle deseti různých parametrů a ještě to různě třídit, přece nemůžu mít v datastoru tolik indexů, to mě na zápisech bude stát tolik co SearchAPI.
Tomucha: Hele …
Tomucha: … většinou stejně takhle podrobně nehledají. Zobrazíš jim seznam nejnovějších nebo tak něco. To skutečné hledání použiješ málokdy.
Julie: Takže?
Tomucha: Takže si sice buduj index v SearchAPI, ale pro ty většinové dotazy používej obyčejné indexované datastore queries. Až když přijde speciální dotaz, zeptej se SearchAPI. Ale stačí, když si do něj sáhneš jen pro primární klíče, zbytek už si pak vyzobeš z datastoru.
Julie: Přes Objectify.
Tomucha: Který to má asi beztak v memcache, takže to máš zadarmo. A to by pro teď mohlo stačit, ještě mi pár tipů z přednášky zbývá, ale to zas příště. Kromě toho se támhle blíží tvůj starej a vypadá poněkud vytočeně.
Přichází Romeo. V ruce drží kord a na sobě má tričko MS Azure.
Romeo: Julie! Co je to za chlapa? Doufám, že to neni nějakej Javista!
Tomucha se dekuje.