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 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 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 konkurensen 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 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 Az alábbi példa PHP nyelvű, és a MySQL szerver állapotát APC megosztott memória cache tárolja.
Ellenőrzé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
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 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
Fordítás
Kategória:Programtervezési minták