Thanks for the information.
I have some further questions, mostly to give me a clearer idea of your
- Are you only looking at caching redirection (i.e. 3xx) responses?
- Are you looking to cache the responses in memory, on disk, or both?
- When you say ‘invalidate’, do you mean purge (i.e. remove the cached
entry from the cache)?
- How are you intending on purging the caches? Here are some possible
ways with pros/cons
using ttl’s (expiry times) for each cached object individually
Pros : provides the most granularity and will probably give the
smoothest load to backends
Cons : adds slight overhead to the request, and complexity in
writing it (if the caching part is done from scratch)
purging all objects at once whenever you wanted
Pros : very simple to implement
Cons : might cause a temporary rush on the backends when objects are
purging a subsection of the objects on a regular basis (e.g. 1/32 of
the objects every 30 mins)
Pros : very simple to implement, much less of a rush on backends
Cons : limited granularity
How many objects are we looking at caching roughly? thousands,
millions, tens/hundreds of millions?
How many worker processes do you/will you use on the Nginx
installation (if you use more than 1, then this adds complexity to the
caching process, and makes memory caching a pain - to the extent that
you might as well use memcached for it).
Are you definitely looking at having an internal cache, or would you
be happy with using memcached? One idea I thought of is to check for
cached pages memcached first for a cached header, then serving from the
backend if no header-only object is found. A header-only response would
then put the object in memcached.
Pros : you could put objects/control the cache separately to the
Nginx installation, perhaps saving some overhead
Cons : for non-header-only objects, there would be the slight extra
overhead of checking memcached on each request (which would obviously be
slower than using an in-memory cache)
What kind of load does your server get (average req/s etc)?
I will probably have a few more questions later, but the answers to the
above should give me a better idea of what you want, and give me a
better idea of a good way to implement your task.