2014-10-24 29 views
8

Ho 1500 piccoli oggetti da renderizzare per un webservice all'interno di un'applicazione rails 4. Io uso JSON come formato con jbuilder per i modelli. Ho già cambiato il motore JSON GU in app inizializzatore:Rails 4 come accelerare il rendering di JSON

require 'oj_mimic_json' 
#MultiJson.use :yajl 

Oj.mimic_JSON 

# jbuilder json templates 
Jbuilder.key_format camelize: :lower 

un singolo oggetto JSON reso simile a questa:

center: {lat: 45.962153536249, lon: 7.68207088549831} 
lat: 45.962153536249 
lon: 7.68207088549831 
n: "Zermatt-Cervinia" 
st: 80 
sy: 0 


Rendered json_partials/_snow_in_resort.json.jbuilder (0.5ms) 
Rendered json_partials/_snow_in_resort.json.jbuilder (0.5ms) 
.... 
Rendered resorts/find.json.jbuilder (4213.4ms) 
Completed 200 OK in 4351ms (Views: 3924.3ms | ActiveRecord: 306.8ms | Solr: 0.0ms) 

Ma ancora ho bisogno di 150 ms per 101 kb sul mio localhost che è troppo lento per l'attività che voglio realizzare sull'interfaccia utente. Cosa devo fare per accelerare qui? Quali cose dovrei controllare? Apprezzo l'aiuto. migliore, Philip

aggiornamento

ho ottimizzato le mie domande record attivo fino al ActiveRecord: 77.8ms, tuttavia, il rendering vista è ancora troppo lento

+0

C'è forse un modo per usare le minacce per eseguire il rendering in parallelo? – dc10

+0

Fornire un oggetto campione in un formato JSON. Intendi solo rendering o rendering + query SQL per ottenere oggetti? – olhor

+0

In altre parole, la tua risposta è sempre la stessa, cambia nel tempo o è completamente dinamica in base alla richiesta? – Shaunak

risposta

6

È possibile esplorare usando Caching HTTP usando vernice. Ecco un grande articolo che descrive diverse tecniche di memorizzazione nella cache (Framment Caching, HTTP Caching, ecc.) In Rails 4. Ha una buona spiegazione sulla cache delle risposte JSON.

Rails 4 e caching

http://www.slatestudio.com/blog/p/caching-in-rails-4-applications

Ecco un altro on Rails e Varnish

http://www.hward.com/scale-rails-with-varnish-http-caching-layer/

lacquer una gemma popolare con drop-nel supporto per vernici memorizzazione nella cache in rotaie

Se si desidera entrare in qualche dettaglio in più su ciò che è il caching HTTP, ecco un ottimo writeup

https://www.mnot.net/cache_docs/

Ryan Bates ha un ottimo tutorial on Rails Fusioni, ma si tratta di un episodio Pro

http://railscasts.com/episodes/321-http-caching

UPDATE 

Geocoder Gem

Sulla base di alcuni commenti di seguito, suggerirei di utilizzare la gemma Geocoder. È in circolazione da un po 'ed è ottimamente ottimizzato per la ricerca dei Punti di interesse, come quello che stai cercando di fare. Inoltre fa molto di più.

indice spaziale Se avete già provato, e non sono soddisfatte, si può si prega di inviare alcuni dettagli su quale tipo di ottimizzazioni che si sta utilizzando il database per accelerare la query? È possibile velocizzare significativamente le query POI utilizzando gli indici spaziali sulla tabella?

Ecco un buon articolo su indici spaziali:

http://daniel-azuma.com/articles/georails/part-6

Alcune idee di test delle prestazioni

potrebbe essere in grado di verificare se è davvero il rendering che sta rallentando giù arrivando con un buon test case. Prova a interrogare per le cose in alto, in mezzo e in fondo alla tabella punti. Anche per numero diverso di oggetti risposta nel JSON e numero diverso di proprietà nell'oggetto JSON. In questo momento vedo che lat, lon è ridondante. Prova a rimuoverli e confronta i tempi per un numero enorme di risultati, se è davvero il rendering che ti rallenta, meno le proprietà, risposte più veloci che dovresti vedere.

Inoltre, se le proprietà, (nome, st, SY, ecc ..) sono provenienti da rapporti invece che allo stesso tavolo come punti, provare a de-normalizzare vostro DB per vedere se si ottiene più velocemente vista di rendering ..

+0

Non si tratta di un problema di memorizzazione nella cache, poiché la risposta è sempre diversa, in base alla richiesta. – dc10

+0

puoi per favore fornire alcuni dettagli su che tipo di richiesta è? è una specie di ricerca di geocodifica o di punti di interesse? In tal caso potresti dover esplorare le opzioni di geo-indxing migliori nel tuo database. Inoltre, anche le richieste dinamiche beneficiano del caching HTTP ... ma per affrontare specificamente il caso, maggiori dettagli su quale tipo di richiesta, query, risposta saranno utili. – Shaunak

+0

Sto cercando snow_resorts in base alle coordinate geografiche. Ma ho già migliorato la query ad ActiveRecord: 77.8ms. Quindi non è un problema di query, penso. – dc10

Problemi correlati