vlákna a paralelní procesy v php rubrika: Programování: PHP
Mám komplexní aplikaci psanou v php, která neměla být psána v php ale to už je jedno.
S aplikací pracuje více uživatelů a v některých případech může akce uživatele spustit jiné mechanismy, které mohou trvat déle, ovšem jejich dokončení není bezpodmínečně nezbytné pro další práci se systémem. Typycky jde o aktualizaci keší nebo výpočty. Nejde dokonce o žádné propastné prasárny, keše umí aktualizovat relevantní segmenty a počítá se více méně pouze to co je potřeba. I když by některé procesy pořád optimalizovat šly, tak v některých případech to už není reálné minimálně časově.
Potřeboval bych tedy nějaký "vláknovač" - oddělený event-collector který by uměl:
- spustit se okamžitě v odděleném vlákně + popř. prodlevy ale to už může být ve vnitřní logice
- událost musí běžet i po skončení hlavního php skriptu a nesmí se nijak ovlivňovat
- nějakou kolekci pending/processing events
- přístup k nějakému internímu stavu události - stačí aby šlo číst to co se vydeleguje - nějaký getProcessState, haveOrderById atd. (vlastní metody)
- posílání signálů událostem - tedy třeba stopProcess() a logika toho procesu by to zaznamenala a vlákno skončilo
- nějaký kritický místa a kolize není třeba řešit - to umí databáze
pak se nad tím dá postavit lecos. Klíčové je to, aby se daly vyřešit situace, že uživatelé "naklikají" 10 stejných událostí nebo to v místech kde to je potřeba dokázalo čekat na pending events.
Řešení, že by se pouze konkrétní stavy označily nějakým příznakem "invalidated" a aktualizovaly pouze při přístupu není řešením jednak proto, že nejsou všechny přístupy čtení zachyceny tak, aby to mohlo stavy aktualizovat a přepočítat a pak se plýtvá časem kdy se nic nedějě a stroj může počítat.
Napadají mě některý řešení - to nejprasáčtější asi je jedna sql tabulka s eventy a cron task co v nejmenších intervalech spouští nějakou prasárnu, co kontroluje zda se nemá spustit událost a zajišťuje komunikační mechanismy. To jenom zmiňuju, že mě to napadlo - jinak to jako řešení nepovažuji.
O trochu menší prasárna by byla novou událost spustit přes shell-exec nebo něco takového a stavy ukládat třeba do memcache. Tady odpadá nějaká periodická kontrola jenom to musí aktualizovat stavy v memcache když se změní. Tedy pouze pokud shell-exec vyhodí nový proces a nečeká na dokončení.
Jaké řešení napadá vás? Řešili jste podobný problém?
Jak tady píší ostatní - použít systémy pro frontu/ zprávy jako je https://www.rabbitmq.com nebo mrkni sem http://queues.io/
Pro zobrazení všech 9 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem: