Sunt foarte multe de spus legat de fine-tuningul aplicatiilor web pentru a rezista, sau a nu „crapa in totalitate” in perioade de varf, cum este Black Friday.

Vom vorbi despre cateva chestii la modul general.  Sa rescrii aplicatia de magazin pentru a rula „in the cloud”, sa faci replicare sau alte chestii avansate, nu vor fi subiectul acestui articol.

Optimizare magazine online de Black Friday – metoda „semihard”(ware)

Indiferent de platforma folosita, fie ca e solutie custom de magazin online sau opensource de tip: magento, prestashop, opencart,  etc., cea mai ieftina optimizare pe care o poti face e sa imparti serviciile pe mai multe masini (a se citi: servere/vps-uri). Prin „ieftin” nu inteleg bani, ci timp de lucru cat mai redus si rescrieri relativ minore pe partea de cod.

1. Serverul web pe o masina fizica separata (server 1)
2. MySQL pe alta masina fizica separata (server 2)
3. Continutul static servit prin CDN-uri, avand ca server web nginx. (e relativ ieftin sa achizitionezi CDN-uri cu aceste ocazii speciale si sa muti tot continutul static pe ele: poze, css-uri, javascript-uri, etc.)
4. Homepage-ul sa fie o pagina html statica pe durata Black Friday-ului (eventual cu cele mai hot oferte ale magazinului) – o miscare logica deoarece prima pagina va primi cele mai multe hit-uri.
5. Sa utilizezi un serviciu extern de trimis mailuri a.i. sa degrevezi serverul si de acest task.

Ideal ar fi ca serverele sa fie cat mai rapide, sa fie dotate cu mult ram si SSD-uri. Este incredibil cat de mult ajuta timpul mic de acces al SSD-urilor si numarul mare de IOPS al acestora

Poti continua optimizarea magazinului online cu metoda „soft”

1. E greu sa optimizezi daca nu stii unde e buba. Primul pas e sa afli ce incetineste.

2. Ca sa afli ce incetineste iti trebuie un tool. Eu as recomanda un combo intre serviciile fenomenale oferite de www.newrelic.com si o monitorizare a MySQL-ului cu JetProfiler. Trebuie sa afli urgent care portiune de cod e Cenusareasa sau ce slow query iti trage site-ul in jos, si sa-l optimizezi la sange.

Interogari intr-un magazin online de BF

3. Daca e vorba de un query puturos poti sa-l spargi in queries mai mici si mai rapide. Ar trebui sa eviti JOIN-uri complicate si neaparat sa folosesti caching. Ai un layer de DB ? Foloseste-l. Stocheaza query-urile repetate in RAM (Memcached poate fi o solutie) si da-le un timp de expirare in functie de necesitatile tale pe pagina respectiva. Daca nu ai memcached instalat, poti salva pe disk (de asta ai ssd-uri) in fisiere text rezultatul interogarii sub forma de array serializat. Numele fisierului poate fi chiar md5($sql) si data de expirare o poti compara cu data crearii fisierului. Astfel extragi rezultatul unui query complicat fara „sa dai” in MySQL. Daca lucrezi cu un framework (Symfony, Codeigniter, Cake, etc) sau ORM (Doctrine), cu siguranta ai deja in cutie uneltele necesare cachingului pt baza de date..

3. Simplifica codul, renunta temporar la anumite functionalitati din paginile cele mai accesate (doar de Black Friday). E mai important sa mearga site-ul schiop, decat sa primesti eroare 503.

4. Din experienta mea, cautarea in magazin este cea care „da temelie” site-ului. Folosesti cumva `SELECT nume_coloana WHERE nume_coloana LIKE ‘%text%’`? Mai prost de atat nu se poate. E timpul sa treci la Full Text Search. Dar nici asta nu te salva prea mult timp. MySQL este ingrozitor de lent cand este vorba de cautare. Iti recomand chestii serioase de tip Sphinx sau Solr. Cu Sphinx cel putin, setezi ca data source un SQL care sa-ti extraga datele din MySQL (de exemplu), il setezi intr-un cronjob ca sa-ti indexeze baza de date la intervalul dorit si vei avea o cautare de zeci de ori mai rapida, chiar si decat cea de tip Full Text Search din MySQL. Dupa ce am implementat Sphinx-ul in solutia noastra proprietara e-commerce, am uitat de telefoane de tip: „a picat serverul”.

5. De indecsi pe coloanele pe care faci JOIN-uri sau indecsi pe coloana pe care faci search nici nu mai amintesc. Avem pretentii totusi :)

6. Ideal e sa ai cat mai putine HIT-uri pe disk. Numele pozelor ar trebui sa fie stocate in baza de date, ca sa nu faci file_exists().

7. Designul site-ului sa fie intr-un sprite, cu pozele din el optimizate la maxim, folosind de exemplu www.kraken.io In plus, tot javascriptul si  CSS-ul sa fie minificat, chiar daca e livrat prin CDN-uri.

8. Daca folosesti mod_deflate sau mod_gzip, acum e momentul sa le dezactivezi. Comprimarea consuma cicluri de procesor si in acest moment ai nevoie de CPU power si nu de economie la banda.

9. Byte code caching. Instalat un APC, eAccelerator sau ceva similar.

10. Ar fi super daca ai scapa de Apache si ai trece complet pe nginx + php-fpm pe serverul web. Problema e ca pierzi .htaccess-ul. De aceea, ar trebui sa rescrii aplicatia si sa routezi totul prin index.php. Deja ai aceasta functionalitate? Super, la gunoi cu Apache-ul. Schimba setup-ul serverului tau sau da-i de lucru sys-adminului, daca nu esti un guru de linux.

11. Varnish. Poate fi scaparea ta la ora 00:00. Dar asta e destul de complicat de setat. In principiu, e in fata serverului web si face caching. Moare Apache sau nginx? El va continua sa serveasca pagini din cache, chiar si expirate. Esti mort, dar nimeni nu stie :). Daca folosesti Varnish, ar trebui sa folosesti session_start() doar daca se logheaza utilizatorul, si sa faci caching doar daca nu ai sesiune. Poti exclude si anumite URL-uri cum ar fi cele de tip „/cosul-meu” sau „/finalizeaza-comanda”, care in niciun caz nu le vrei servite din cache.

12. Acum ar trebui sa simulezi un Black Friday si sa lovesti serverele cat poti de tare cu blitz.io
Pentru un cont nou ai 10 credite gratuite, suficient cat sa-ti testezi setup-ul cu cati useri concurenti  estimezi ca o sa ai la ora 00:00 si sa vezi in newrelic.com ce crapa prima data. De asemenea, cu ajutorul lui Jet Profiler o sa identifici cu usurinta interogarile lente care apar in conditii de high load.

Am obosit… e 21 Noiembrie 2013 23:25 si incep sa cada magazinele  de „Black Friday-ul romanesc”, setat arbitrar pe 22 Noiembrie, inventia eMag si Flanco. Dar sa nu ne temem. In Romania, Black Friday se poate intinde si pe o saptamana intreaga, sau chiar la foc dublu, 22 si 29. „Nu trage dom’ Semaca, sunt eu… Lascarica!”

P.S.: Domo a murit deja. RIP! 2Parale ce faci? Elefantul a murit cel mai gratios iar F64 desi a mers cu mici sughituri, isi tortureaza adminul in beci fara mila!

Domo mort de BF 2parale a murit si el de BF F64 s-a descurcat onorabil.. in cea mai mare parte a timpului
Elefant.ro

Succes la optimizat magazinul tau online pentru un viitor Black Friday de succes!

„Contributors” cu sfaturi la acest articol: Marian Ursache (motorai.ro), Marian Craciun, George Ciochinaru