Biztosíték programtervezési minta
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]- Example of PHP implementation with diagrams
- Example of C# implementation from Anders Lybeckers using Polly
- Polly NuGet package
- Example of C# implementation from Alexandr Nikitin
- Implementation in Python
- Stability patterns applied in a RESTful architecture Archiválva 2016. december 7-i dátummal a Wayback Machine-ben
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.