Biztosíték programtervezési minta

szoftverfejlesztési módszer

A biztosíték tervezési mintát a modern szoftverfejlesztésben használják. Célja a hibák felismerése és a felismert hibák megismétlődésének megelőzése, amely hibák a fenntartási idő alatt a külső szolgáltatások ideiglenes elérhetetlenségéből vagy váratlan rendszerproblémákból adódnak.

Használati eset szerkesztés

Tegyük fel, hogy egy alkalmazás percenként százszor kapcsolódik az adatbázishoz, és az adatbázis összeomlik! A felhasználó és a tervező ki akarják küszöbölni ezt a hibát. Gyors és hatékony hibakezelést akarnak; a tervező nem akarja megvárni az időtúllépést.

Biztosítékkal ellenőrizhető a külső szolgáltatás elérhetősége. A külső szolgáltatás lehet adatbázis vagy webszolgáltatás.

A biztosítéknak detektálnia kell a hibákat, és meg kell előznie, hogy az alkalmazás olyan akciót kezdeményezzen, amiről megjósolható, hogy sikertelen lesz.

Megvalósítása szerkesztés

A megvalósítás azt igényli, hogy a biztosíték megtartsa a kapcsolat állapotát több kérésen át. Emiatt a biztosítékban működő állapotgépnek bizonyos értelemben konkurrensen kell futnia a rajta átmenő kérésekkel. Ez elérhető aszinkron módon.

Többnódusú (klaszterezett) szerveren a szolgáltatás állapotát az összes nódusnak ismernie kell, ezért a megvalósításnak perzisztens adatréteget kell tartalmaznia, cache-elnie kell. Tartalmazhat hálózati cache-t, mint Memcached vagy Redis, vagy helyi cache-t.

A biztosíték feljegyzi a szolgáltatás állapotát egy adott időszakban.

A szolgáltatás meghívása előtt a tároló rétegtől kérdezik le annak állapotát.

Hatása a performanciára szerkesztés

A biztosító negatívan hat a legtöbb nem funkcionális tulajdonságra, viszont javítja a biztonságot. Hogy mennyire, az függ az adatrétegtől és a külső szolgáltatásoktól. Ebben a legfontosabb a cache típusa, legyen az helyi, hálózati, lemez vagy memória alapú.

Példa szerkesztés

Az alábbi példa PHP nyelvű, és a MySQL szerver állapotát APC megosztott memória cache tárolja.

Ellenőrzés szerkesztés

A következő szkript a crontabban beállított időszakonként fut..

$db = mysql_connect('localhost','user','pass');
if ($db === false) {
    apc_store('dbStatus', 'down');
} else {
    apc_store('dbStatus', 'up');
    @mysql_close($db);
}

Használata szerkesztés

if (apc_fetch('dbStatus') === 'down') {
    echo "The database server is currently not available. Please try again in a minute.";
    exit;
}
$db  = mysql_connect('localhost', 'user', 'pass');
$res = mysql_db_query('database', 'SELECT * FROM table');

Források szerkesztés

Fordítás szerkesztés

Ez a szócikk részben vagy egészben a Circuit breaker design pattern című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.