Chi di voi ha utilizzato almeno qualche volta Umbraco, conosce sicuramente il meccanismo potente delle macro.
Come probabilmente sapete, le macro hanno la possibilità di essere “cachate” (utilizzano la cache nativa di ASP.NET) per evitare che vengano interpretate ogni volta. Questa funzionalità è, però, tanto utile quanto pericolosa. Il rischio, infatti, è di “abusare” in maniera eccessiva di questa facilitazione, soprattutto quando si parla di macro XSLT.
Un esempio: chiunque lavori in XSLT da più di qualche ora sa che ci sono dei selettori che in generale è meglio evitare. Qualcosa come
$currentPage/ancestor-or-self::node//node
Permette di risalire tutto l’albero di umbraco e prendere _tutti_ i nodi figli, per effettuare magari qualche filtro. Il problema con questo approccio è che, ovviamente, finchè l’albero rimane sotto la quarantina di pagine non ci sono troppi problemi. Con siti medio complessi, il tempo di parsing dell’XML, che può raggiungere svariati megabyte, diventa proibitivo. Come risultato, l’application pool impiega una vita a partire e, quando la cache scade, il sito può subire dei forti rallentamenti a causa di questo genere di istruzioni, poichè Umbraco deve reinterpretare la macro prima di metterla in cache.
Il mio consiglio è: ricordatevi che Umbraco viene fornito con una base dati. Niente ci vieta di “espanderlo” con delle nostre classi. In certi casi può essere necessario creare delle tabelle di appoggio, e caricare i dati “pesanti” con lavori asincroni. In altri casi, può essere semplicemente sufficente leggere direttamente i dati dal database. Ho visto ultimamente fare una query XSLT per restituire l’ultimo contenuto aggiornato… quando in realtà sarebbe bastata una stored procedure che prendeva l’ultimo record con published = 1 dalla tabella cmsDocument, ordinandolo per data. Una query assolutamente banale per un motore come SQL Server, ma che trasposta in XSLT può diventare un vero problema.
In conclusione, pensiamo sempre se non ci sono modi migliori per effettuare operazioni che possono insistere su tutto l’albero dei contenuti, o su una gran parte di essi.