Escalabilidad horizontal
HybridCache soporta escalabilidad del tipo horizontal, gracias a la abstraccion de los storages medias. Se puede agregar tantos storages medias como uno quiera, e HybridCache se encargara de balancear el uso.
Cuando hablamos de escalabilidad, normalmente nos referimos a la vertical, que es escalar hacia arriba, osea escalar un nodo en particular levantando mas procesos, memoria, subnodos, etc. Esto está limitado por el servicio en si, y no todos soportan escalabilidad vertical, como es el caso de memcache.
Ahora cuando hablamos de escalabilidad horizontal, no vamos hacia arriba, sino hacia los costados, y es que ya no depende del servicio en sí, sino que lo manejamos nosotros, pudiendo balancear entre varios nodos.
Al contar con un array de storages medias, a la hora de utilizar alguno, HybridCache puede utilizar 2 formas de decidir cual, una es simplemente al azar (util para Replicacion) y generando codigos hash de los identificadores o internamente keys de la data cacheada, se puede ver mas en metodos de balanceo.
Para escalar vamos a usar el modo por hash, que igual es el default.
Vamos a poner un escenario de ejemplo, y es poniendo varios servidores Memcached, de esta forma podemos ir incorporando nodos al array al tiempo que lo vallamos necesitando. Un buen esquema puede ser:
Para implementar esto, primero tenemos que trabajar con el metodo de balanceo por hash, este viene por defecto pero puede ser seteado a mano para garantizar funcionamiento con versiones futuras o distintas configuraciones en el mismo script:
<?php
// Metodo por define
define('CACHE_BALANCE_METHOD',Cache::B_HASH);
// o tambien en cada instancia
$cache->balanceMethod = Cache::B_HASH;
Luego simplemente podemos agregar los storages medias:
<?php
use Hybrid\Storages\Memcache as MemcacheStorage;
Cache::addStorageMedia( new MemcacheStorage('10.1.30.1') );
Cache::addStorageMedia( new MemcacheStorage('10.1.30.2') );
Cache::addStorageMedia( new MemcacheStorage('10.1.30.3') );
Cache::addStorageMedia( new MemcacheStorage('10.1.30.4') );
Cache::addStorageMedia( new MemcacheStorage('10.1.30.5') );
De esa forma, cada vez que se requiera un recurso de cache, se leera y grabara en uno de los nodos del array.
Es obvio que si cambiamos el orden del array o lo modificamos cambiara el modo en que balancee los valores, asi que si metemos otro nodo o simplemente modificamos el array, podemos esperar a que la vieja cache caduque o simplemente reiniciar los servicios.