Ho litigato con problemi simili.
Prima di tutto, prendiamo la nostra terminologia corretta.
- Memcached: un processo in esecuzione su un server da qualche parte (d è per il demone) che memorizza in realtà coppie chiave-valore in memoria.
- cache_store: Archiviazione cache Rails (
Rails.cache
) con una singola API che può essere configurata per utilizzare diverse implementazioni software Ruby. Un'impostazione per config.cache_store
è :memory_store
per utilizzare un'implementazione in memoria. Un'altra impostazione è :dalli_store
che specifica utilizzando la gemma Dalli, che sotto il cofano effettua una connessione remota, eventualmente, al server memcached.
- Dalli Store: Presumo intendi la cache di Rails supportata dalla gemma dalli, che memorizza fisicamente i valori in memcached.
- Rack :: Cache: middleware rack che inserisce intestazioni (scadenza, Cache-Control, ETag, ecc.) Nelle risposte HTTP e funge anche da cache del proxy inverso, gestendo le richieste prima che colpiscano lo stack Rails quando possibile. Vedi website.
Per consentire a Rack :: Cache di gestire le richieste prima che colpiscano lo stack Rails e il resto dell'app, è necessario memorizzare le risposte + i metadati da qualche parte. Dove memorizza le cose sono configurate dall'impostazione config.action_dispatch.rack_cache = { ... }
.
Avviso, questo è un diverso impostazione da config.cache_store = :dalli_store
. Non devono essere correlati. Penso che da qui provenga molta confusione. In pratica, però, potremmo volere che entrambi usassero memcached, il che significa usare l'implementazione dalli. Tuttavia, ognuno di essi ha la propria istanza Dalli::Client
. (Inoltre, il tuo session_store potrebbe essere correlato, ma non deve essere.)
Lo stack di cedro Heroku ha uno ephemeral file system che non può essere condiviso tra i dynos. Tuttavia, Heroku stessi recommend using tmp file storage with Rack::Cache solo per il entitystore
, con memcached utilizzato per la metastore
.
Quanto a ciò che effettivamente viene memorizzato nel metastore Rack :: Cache, questi sono i documenti da rack-cache v1.2 Rack::Cache::MetaStore
classe:
The MetaStore is responsible for storing meta information about a
request/response pair keyed by the request's URL.
The meta store keeps a list of request/response pairs for each canonical
request URL. A request/response pair is a two element Array of the form:
[request, response]
The +request+ element is a Hash of Rack environment keys. Only protocol
keys (i.e., those that start with "HTTP_") are stored. The +response+
element is a Hash of cached HTTP response headers for the paired request.
Quindi, per rispondere alla tua domanda, intestazioni di richiesta HTTP e le intestazioni di risposta HTTP vengono memorizzati nel Rack :: Cache metastore. D'altra parte, lo storestore di Rack :: Cache memorizza interi corpi di risposta (ad esempio HTML).
Dal you can't use page caching reliably on Heroku, questo significa che si potrebbero utilizzare la cache azione e caching dei frammenti. Il caching di azioni e frammenti utilizza l'archivio cache di Rails (non la cache del rack). Ma se li hai impostati entrambi per utilizzare fisicamente lo stesso server memcached, entrambi contribuiranno all'uso della memoria. L'azione e il caching parziale memorizzano l'HTML effettivo.
Per ottenere un quadro più chiaro del vostro utilizzo effettivo, se si sta utilizzando memcachier eseguire il seguente comando per aprire un cruscotto di analisi nel tuo browser.
heroku addons:open memcachier
Vedi this question per ulteriori informazioni su come ottenere statistiche memcached.
Jonathan - grazie per questo. Sebbene siano passati anni da quando ho fatto questa domanda (e ho ricevuto una risposta), la tua risposta risolve molto meglio i miei problemi originali. Se solo lo avessi trovato in primavera! Upvote/accettato. – Brandon
La tua risposta ha sollevato un'altra domanda. Cosa succede se Rack :: Cache memorizza i metadati in memcached (ad esempio Memcachier) e il corpo della risposta in '/ tmp' in Heroku, e quindi'/tmp' viene cancellato? Suppongo che Rack :: Cache sia abbastanza intelligente da non ostacolare il deposito di file che viene eliminato dietro di esso. – Brandon
Questo è corretto. Quando qualcosa viene trovato nel metastore ma non nel negozio dell'entità, Rack :: Cache fa la cosa giusta attivando un errore di cache. I metodi di origine relavant sono [Rack :: Cache :: Context # lookup] (https://github.com/rtomayko/rack-cache/blob/1.2/lib/rack/cache/context.rb#L163) e [Rack :: :: cache MetaStore # lookup] (https://github.com/rtomayko/rack-cache/blob/1.2/lib/rack/cache/metastore.rb#L28). –