Cache: IJournal v memcache
- RadekDvorak
- Člen | 11
Zdravím všechny,
snažím se zprovoznit cache v Nette. Budu ji používat v prostředí, kdy je
zátěž rozkládána mezi více web serverů. Přesto bych rád, aby cache byla
sdílená. Používám memcache, tudíž je MemcachedStorage jasnou volbou.
Pochopil jsem, že pro funkcionalitu mj. tagů musím použít objekt
implementující IJournal. V současnosti však existuje jedině FileJournal,
který nemůžu použít, protože ukládá data na disk do souboru. Jeho
implementaci zevrubně nechápu, napadlo mě ji přepracovat (ohackovat) na
memcache.
Zámky bych emuloval přes add a delete v memcache, pro souborové operace s handlerem si představuju blok z memcache načíst do php://memory nebo php://temp. Řízení interní cache přes mtime bych asi vynechal nebo emuloval přes $cas_token.
Ocenil bych rady a názory nejen jak to napsat, aby to fungovalo, ale aby to bylo přijatelné do Nette.
- dada-amater
- Bronze Partner | 52
Mas to nejak otestovane? Resim neco podobneho, tak bych to rad pouzil. Moznost TAGovat mi chybi.
- RadekDvorak
- Člen | 11
Nedá se na to spolehnout. Memcache zahazuje data, i když není úplně plná, tudíž dochází ke ztrátám celého žurnálu. Upřednostnil jsem proto standardní fileJournal.
- dada-amater
- Bronze Partner | 52
To ja vim, proto pouzivam memcache redundanci. Jde mi ale o to, ze mame vice frontend serveru. A kazdby by mel svuj journal, coz je spatne. Kazdy request loadbalancer preda jednomu z X serveru. Pokud bych pouzival napriklad nfs, tak se to uplne posere, neumi zamikat. Reseni je implementovat to do databaze, ale je to dost neefektivni.
- RadekDvorak
- Člen | 11
Našemu adminovi na nfs posixové zamykání funguje. Proto používáme fileJournal.
Výše uvedený kód je spíš pracovní nástřel, nebyl určen do produkčního prostředí, ale pro testování varianty řešení.
- dada-amater
- Bronze Partner | 52
Asi to tak je, ze nfs4 uz to zamykani umi. Resil nejak vas admin cachovani nfs? Testoval jsem to, zamykani funguje, ale nekdy trva, kdyz server A uvolni zamek, server B ceka nekdy i dlouhy vteriny. V praxi je to pak nepouzitelny, kdyz cely server B ceka, nez A neco doresi.
- Filip Procházka
- Moderator | 4668
Pokud chcete memory storage s journalem a cachí s vyřešeným zamykáním, tak bych skromně doporučil raději kdyby/redis, který je production-ready ;)
- dada-amater
- Bronze Partner | 52
Diky Filipe
<?php
namespace Nette\Caching\Storages;
use Nette,
Nette\Caching\Cache;
class RedisJournal extends Nette\Object implements IJournal {
//kdo to dopise? :-)
}
?>