Qual è il modo migliore per memorizzare le immagini nelle app mobili lato server e caricarle?
Ho dovuto recentemente risolvere lo stesso problema quindi sono felice di condividere la mia soluzione.
Il mio requisito era quello di costruire un sistema scalabile per ridimensionare e memorizzare nella cache le immagini al volo a qualsiasi risoluzione e qualità fosse necessaria. Volevo minimizzare l'IO per le immagini "calde". Cioè, se le immagini sono richieste spesso dovrebbero diventare "calde" su tutte le cache.
La mia soluzione si basa su groupcache. Groupcache è una cache LRU di lettura distribuita non in scadenza. A differenza della maggior parte delle soluzioni di cache, non è possibile aggiungere coppie chiave-valore a groupcache. Invece si definisce come recuperare il valore per una chiave specifica.
Quello che rende groupcache uno strumento così buono per questo problema è che quando più server nel gruppo groupcache richiedono la stessa chiave, i dati vengono recuperati solo una volta e poi distribuiti automaticamente agli altri server. Il caricamento di un'immagine non sarà mai più di un IO.
Questa soluzione è applicabile non solo alle immagini ma anche a tutto ciò che può essere tradotto in byte. Il time to live è ottenibile aggiungendo un timestamp arrotondato alla chiave della cache.
Ovviamente questa soluzione ha dei compromessi. Non è possibile memorizzare i dati su una chiave specifica. Le immagini non (ancora) calde verranno caricate dal disco o avranno bisogno di più viaggi di rete per recuperare i dati da un altro membro del gruppo di cache.
Un'ulteriore performance potrebbe essere ottenuta aggiungendo un bilanciatore di carico davanti che distribuisce il carico in base all'hash dell'url in modo che le possibilità di colpire una cache calda siano maggiori.
Sarei felice di sentire opinioni su questa soluzione.
Articoli simili
- Ho un nuovo parasole per il parabrezza della mia auto. Un lato riflettente e un lato carino. Quale lato dovrebbe essere rivolto al sole?
- Quali sono i compromessi del rendering lato client rispetto al rendering lato server?
- Posso usare solo un lato della porta MicroUSB 3.0 di un Samsung Galaxy S5 (il lato sinistro)?
- L'app Facebook per iPhone ridimensiona le foto prima di caricarle?