Zamykání zdrojů v PHP rubrika: Programování: PHP

2 jan.rybar
položil/-a 18.2.2015

PHP sice není úplně ideální jazyk pro paralelní zpracování fronty požadavků, ale jde to obejít za pomoci RabbitMQ či jiných Message Queue systemů. Jak byste ale řešili situaci, kdy si každý proces potřebuje zamknout určité zdroje, ke kterým musí být přistupováno exkluzivně? Příkladem může být následující problém:

Databáze prvků je rozdělena do několika tisíc skupin, kdy každý prvek patří právě do jedné. Prvky určité skupiny můžou být ovlivňovány vždy jen jedním procesem.
Proces dostane ke zpracování dokument. Z tohoto dokumentu si zjistí skupiny, se kterými bude pracovat. Ty si potřebuje najednou zamknout. Dokument zpracuje, uvolní zámky a čeká na další dokument ke zpracování.

Jaké řešení tohoto problému se nabízejí? Napadlo mě řešení přes na pozadí běžící aplikaci. S PHP by mohla komunikovat pomocí socketů. PHP by poslalo zdroje, které jsou potřeba zamknout. Odpověď by byla buďto 0 (při detekci deadlocku či po stanoveném timeout) nebo 1 ve chvíli, kdy jsou všechny zdroje zamknuté pro žádající proces. Po dokončení by požádalo o uvolnění.

Máte někdo s tímto přístupem zkušenosti? Existuje takový skript k okamžitému použití? Dá se u socketů detekovat pád PHP procesu a automatické uvolnění zamknutých zdrojů?

odkaz Vyřešeno
2 jan.rybar
odpověděl/-a 19.2.2015

Usoudil jsem, že Apache Helix je zbytečné přidání závislosti. Nepotřebuju zámky distribuovat, vše běží na jednom serveru. Proto je architektura, kterou nabízí Helix, kanón na vrabce. Stačí kouknout na jejich Core Concept a milion různých pojmů, když mi stačí slovo zámek.

Použiju MySQL. Nabízí krásné funkce GET_LOCK, RELEASE_LOCK. Jména zámků jsou zamknuté napříč připojeními k danému serveru. U GET_LOCK lze zadat timeout, který když vyprší, tak MySQL vrátí 0. Nezasahují do transakcí a jsou uvolněny i když dojde k náhlému přerušení procesu. Přesně co potřebuji, ideální řešení. Specializovaný software bych musel nastudovat, nechat nainstalovat na server, dlouhodobě otestovat, napsat PHP knihovnu pro komunikaci, odladit problémy, atd.

Dokumentace k MySQL: http://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#func...

Pro zobrazení všech 4 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.