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