Quando si parla di velocità di acesso ai dati, nulla è più veloce che non accedere al db, ma recuperare i dati dalla memoria.
E' arrivato il momento di fare in modo che i dati nel mio datalayer vengano messi in cache. Quando leggo un record, se questo rispetta certe regole lo metto in cache e da li lo recupero. Il problema è: se non posso sincronizzarlo con il db tramite SqlCacheDependency (ad esempio perchè non uso SqlServer2005) ed ho bisogno di dati quasi sempre aggiornati (questo implica che non posso usare nemmeno la seconda forma di SqlCacheDependency perchè troppo pesante), come sincronizzo il tutto? La prima risposta che mi sono dato è che semplicemente da codice rimuovo l'elemento dalla cache.
Ma quando ci si trova in ambienti in Server Farm con due o più macchine in cluster? Rimuovere l'oggetto non basta poichè verrebbe rimosso da una sola macchina e rimarrebbe inalterato nelle altre. Un meccanismo per sincronizzare la cache (tipo la Session) non esiste e questo è un bene. La cache deve essere solo veloce.
Tuttavia, non voglio rinunciare alle comodità della cache ed a questo punto ho avuto una specie di illuminazione. Bisogna semplicemente escogitare un metodo per mandare messaggi da un server all'altro per segnalare che un dato è diventato obsoleto e va eliminato.
Visto che sviluppo solo in 2.0 perchè non usare WCF? L'idea è semplice, su una macchina si aggiorna un dato in cache, questo dato viene eliminato e tramite un callback predefinito viene inviato un messaggio ad un servizio che si occupa di smistarlo alle altre macchine. Queste lo ricevono e aggiornano la propria cache. In questo modo posso aggiungere tutte le macchine che voglio e stare tranquillo che il messaggio verrà recapitato a tutte grazie alle feature di WCF. Inoltre il traffico e le performance sono ottimi perchè ciò che viaggia è un semplice messaggio con una stringa messi in formato binario quindi ottimizzatissimo. L'unica cosa che mi lascia l'amaro in bocca è stata l'impossibilità di realizzare la cosa in P2P per via di alcune limitazioni di WCF. al prossimo summit non mancherò di chiedere lumi in tal senso :).
Tutto questo sarà materia di un articolo futuro (visto il mix non so ancora se su ASPItalia o WINFXItalia) quindi prima o poi vedrete anche il codice (che non fa mai male)
Ciao stefano, qui in azienda abbiamo diverse macchine in clustering ma fortunatamente abbiamo uno storage comune a tutte e risolviamo facilemnte creando una dependency su un file. Alterato il file, la cache di tutte le macchine viene invalidata !!!
Tempo fa pensai ad un servizio win per la sincronizzazione o all'utilizzo di un webservice per far comunicare i vari server, ma non lo ho mai implementato, ora aspetto una tua implementazione a breve :D
ciauz
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




Stampa
Download 
10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!

Tempo fa avevo realizzato per test una cosa simile alla tua (ma niente cache, solo scambio di informazioni) per tenere aggiornate più macchine, ma all'epoca aveva usato il Remoting (ho avuto in passato una passione per questa tecnica di comunicazione). Il funzionamento era semplice, l'aggiornamento avveniva in modo "circolare", la macchina 1 inviava l'informazione alla 2, la 2 alla 3 a la 3 ancora alla 1 fino a quando l'informazione era aggiornata su tutte le macchine.
Il problema era nel caso una macchina non fosse raggiungibile. Cosa sarebbe successo nel caso la macchina 2 fosse stata giù e la 1 non poteva comunicare? Nel caso la macchina 3 inviava dei suoi dati aggiornati alla 1 che aveva i suoi aggiornati. In questo caso avevo aggiunto il controllo su quale dato fosse più recente...
Il problema più grave era nel caso di più macchine offline che potevano isolare una o più macchine...
Aspetto pure io il tuo lavoro
Ciao
Continua »»» | Rispondi »»»