[dev] Session Prefs Caching
Michael M Slusarz
slusarz at horde.org
Mon Apr 14 05:15:05 UTC 2014
A problem that I've been mulling over for the last few weeks.
The problem is when the prefs data starts getting larger, we are
hauling around this data in a storage container that must be read from
the backend/transmitted on network on every single page access.
Horde_Pack helps with the size issue, and the data segmentation in
Horde_Session ensures that we don't need to unserialize the data for
the apps we don't use. But my unscientific examination of my personal
session data indicates 2/3 of a typical session is taken up by this
data.
It has become an issue since I'm currently writing support for adding
images to HTML signature data for a client. The problem is that
realistically the only place to save this data is embedded within the
HTML signature data itself (data URLs). But images are most likely
incompressible data, and potentially large (say 30 kb). And there is
no reason to be carrying around this kind of data when we are only
using it in a single location ... and its a location where it would be
perfectly acceptable to allow access to the prefs backend to get this
data rather than needing to cache it.
I'm trying to figure out the right balance of caching, and features
like HTML sig data to me is tipping the scales for getting rid of
in-session prefs caching. Since this is a fairly big change, I'm
looking for input.
Possible solutions:
1.) On-demand access. I think this should be done regardless of what
caching solution we decide on. Currently, every time we push an
application on the stack we retrieve the prefs regardless of whether
we use them or not. We could save at least some accesses by either 1)
editing Horde_Prefs or 2) adding an abstraction layer to the Scope
object where we don't load the underlying Scope unless we need it.
I'd imagine there are many page accesses where we never access prefs
at all, especially AJAX-y actions.
1a.) Extension to this idea is to only load app prefs scope at first.
Only if pref is not found in app scope do we need to load base horde
prefs.
2.) Move all Prefs caching to Horde_Cache. Simplest solution.
Doesn't deal with inefficiencies in our current Horde_Prefs
architecture (i.e. we still need to load the large prefs values even
if we don't use them). But requires minimal coding.
3.) Incremental prefs loading. Only load/cache prefs values that are
actually used. No idea what kind of load this would cause on backends
though, and this is probably more inefficient during the retrieval
stage.
4.) "Global defaults" scope. Now, each user has a scope object that
combines their personal preferences with the current app defaults. We
can remove the default prefs from this object and instead add this as
a separate scope, which is only queried if not found in the personal
prefs data. Benefit: the default scope should be the same for most
users, so this data could be stored in a globally accessible cache key.
5.) Add ability to flag a particular cache entry as 'non-cacheable' in
config/prefs.php. Entries such as identity data or PGP keys should
not be stored in session cache data and should instead be loaded
on-demand only. Unfortunately, the way Horde_Prefs_Scope is written
as of now, this would be difficult to do as the non-cacheable state is
not available at the time of storage/caching without doing something
like re-reading the prefs.php file, which is not ideal.
michael
___________________________________
Michael Slusarz [slusarz at horde.org]
More information about the dev
mailing list