vlákna a paralelní procesy v php rubrika: Programování: PHP

5 dzejkob
položil/-a 16.4.2014

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?

odkaz
Anonym
odpověděl/-a 16.4.2014

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:

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.