Optimistic offline lock pattern

Stefanescu Mihai 7 months ago Design Patterns

Acest deisgn pattern, optimistic offline lock este o tehnica de a manageui acces-ul concurent la datele comune intr-un sistem distribuit.
Acest pattern se bazeaza pe presupunerea ca conflictele intre update-uri vor fi rare, iar majoritatea update-urilor pot fi rezolvate fara conflicte.

Ideea din spatele acestui pattern este aceea ca fiecare client al aplicatiei mentine o copie a datelor comune si isi poate updata copia independent de ceilalti clienti. Cand un client vrea sa updateze datele comune prima data verifica daca s-a modificat ceva de catre alt client in intervalul de timp din care el si-a luat versiunea lui de date. Daca nu s-a modificat nimic, update-ul este aplicat si modificarea este propagata catre ceilalti clienti. Totusi, daca datele au fost modificate de alt client intre timp, update-ul nu este aplicat, iar clientul primeste un mesaj de conflict. Clientul poate alege fie sa suprascrie datele modificate de ceilalti clienti sau sa uneasca modificarea lui cu a altor clienti.

Acest pattern este des folosit in scenariile in care exista o problema de durata de transmisiune a datelor prin retea sau exista posibilitatea ca un client sa devina offline, de exemplu o aplicatie de mobil care se poate deconecta de la internet. Pentru ca se poate lucra cu copia datelor salvata local, clientul isi poate continua treaba chiar daca nu mai are semnal/internet.

Totusi, este important de mentionat ca acest pattern nu este potrivit pentru un sistem in care conflictele de date sunt frecvente sau consistenta datelor este critica.

Mai jos am sa incerc sa dau un exemplu in PHP pentru modul de functionare al acestui pattern:

1. Cand un client isi ia datele de la server, primeste si salveaza si un timestamp ce indica timpul ultimei modificari pe acest set de date.

$data = file_get_contents('https://invata-programare.ro/datele_de_care_am_nevoie.json');
$timestamp = file_get_contents('https://invata-programare.ro/ultima_modificare_a_datelor.txt');

2. Salvez datele local

file_put_contents('datele_de_care_am_nevoie.json', $data);
file_put_contents('ultima_modificare_a_datelor.txt', $timestamp);

3. Imi fac update-ul dorit pe copia mea a datelor

$localData = json_decode(file_get_contents('datele_de_care_am_nevoie.json'));
$localData->informatiaMea = 'noua valoare pentru aceasta informatie';
$localData = json_encode($localData);

4. Verific timestamp-ul local cu cel de pe server:

$localTimestamp = file_get_contents('ultima_modificare_a_datelor.txt');
$serverTimestamp = file_get_contents('https://invata-programare.ro/ultima_modificare_a_datelor.txt');

5. Daca datele de modificare coincid pot trimite update-ul catre server:

if ($localTimestamp == $serverTimestamp) {

	$response = file_get_contents('https://invata-programare.ro/update.php', false, stream_context_create([
        'http' => [
            'method' => 'POST',
            'header' => 'Content-type: application/json',
            'content' => $localData,
        ],
    ]));
    if ($response == 'conflict') {
        // am un conflict, trebuie sa il rezolv
    }
}

Atentie aici, daca server-ul ne indica un conflict trebuie sa il tratam, fie suprascriem modificarile de pe server fie unim modificarile.

Ce trebuie mentionat din nou este faptul ca acest pattern porneste de la ideea ca o sa avem putine conflicte si putem sa le rezolvam rapid/usor.

Programator de ~8 ani, am lucrat la proiecte din mai multe industrstrii, de la eCommerce la telecomunicatii la automatizari. In acest timp am folosi diferite tehnologii, de la PHP, MySQL, PostgreSql, RabbitMq, Redis, Memcached si altele.


Get in touch
Pentru nelamuriri, dubii, comentarii si chestii de pe suflet ne putem auzi pe Discord, Reddit sau poti deschide o discutie noua pe forum

precio de busiral en Argentina # 1 month ago I blog frequently and I truly appreciate your content. The article has truly peaked my interest. I am going to book mark your website and keep checking for new information about once a week. I opted in for your Feed as well.
clomipramine 10 en venta en línea # 1 month ago Hi there mates, fastidious article and nice arguments commented at this place, I am truly enjoying by these.
Kaitlyn # 4 weeks ago These are actually fantastic ideas in regarding blogging. You have touched some good factors here. Any way keep up wrinting.
Hugh # 3 weeks ago Hello just wanted to give you a quick heads up. The words in your post seem to be running off the screen in Firefox. I'm not sure if this is a format issue or something to do with web browser compatibility but I figured I'd post to let you know. The design and style look great though! Hope you get the issue solved soon. Kudos
Einkauf von aricept in Europa # 1 week ago I every time emailed this web site post page to all my contacts, as if like to read it then my contacts will too.
duetact 16 mg disponible en farmacia de São Paulo # 1 week ago Wonderful, what a blog it is! This weblog presents valuable facts to us, keep it up.
Deutschland # 4 days ago Thank you a bunch for sharing this with all of us you really recognise what you are speaking approximately! Bookmarked. Kindly also talk over with my website =). We may have a hyperlink alternate contract among us
Club-ul este dedicat membrilor si ofera access la mai multe zone ale website-ului.
Login Register

🔖 Bookmarks
✨ Pentru a sustine aceasta comunitate am sa te rog sa te autentifici sau sa te inregistrezi!

🌪️ Discord
Back to top
Folosim cookie-uri pentru a oferi functionalitatile critice ale aplicatiei Invata-Programare. Folosim cookie-uri si pentru a analiza traficul, pentru care e nevoie de consimtamantul dvs. explicit.