Najlepsze praktyki zarządzania długimi uruchomieniami zadań asynchronicznych

12

Jestem na etapie projektowania projektu, w którym użytkownik końcowy prześle żądanie ze strony internetowej, które spowoduje odrodzenie długo działającego asynchronicznego przetworzonego zadania. Czy istnieje „najlepsza praktyka” dla tego problemu? Czy usługi internetowe i brokerzy usług są dobrym rozwiązaniem? Czy ma tu zastosowanie kolejka wiadomości Microsoft?

John Ruf
źródło
Jeśli robisz to przez Internet, a zajmuje to bardzo dużo czasu, możesz wysłać wiadomość tekstową lub e-mail do użytkownika po zakończeniu.
Job

Odpowiedzi:

6

Nie wiem o „najlepszych praktykach”. Znam najczęstsze błędy.

Pierwszy błąd: sam DOS

Do przetworzenia długotrwałego zadania używasz modułu obsługi sieci. Może to być złe lub bardzo złe, w zależności od procentu trafień, które stają się długotrwale wykonanymi zadaniami, jak długo trwają i ile utrzymujesz ciągłego ruchu.

Chcesz się upewnić, że nie otrzymujesz więcej niż 1 długotrwale zadanie w ciągu czasu potrzebnego do jego ukończenia. Jeśli zrobisz to sam DOS. Będzie się również pogarszać wraz ze wzrostem natężenia ruchu, przy założeniu, że odsetek i czas pozostaną spójne. Jest to jeden z tych problemów, który sam narzuca ograniczenie wzrostu ruchu.

Drugi błąd: odradzanie się z modułu obsługi sieci

Przywołanie procesu z modułu obsługi sieci do obsługi długotrwałego procesu może być trudny, aw rezultacie również podatny na błędy.

  • Musisz poprawnie oddzielić się od rodzica, w przeciwnym razie moduł obsługi sieci czeka na zakończenie procesu przez dziecko.
  • Gdy rozwidlasz dziecko w systemie uniksowym, dziedziczy ono otwarte uchwyty od rodzica. Zostaną one automatycznie zamknięte, chyba że zostaną zastąpione. Obejmuje to między innymi połączenia z bazą danych, uchwyty plików, inne otwarte połączenia sieciowe. Wszystkie zostaną zamknięte po zakończeniu procesu potomnego.

Opcje

Zwykle używam at(1)do czystego odcięcia się od modułu obsługi bez rozwidlania.

Możesz także użyć implementacji odpytywania za pomocą cron.

Możesz komunikować się z innym procesem serwera, który obsługuje przetwarzanie. Że komunikacja może odbywać się z sockets, pipeslub wyższym poziomie abstrakcji, jak REST wywołania HTTP lub routing wiadomości kolejki.

dietbuddha
źródło
2

Podejrzewam, że mówisz o kilku minutach.

Jeśli zajmie to kilka minut, możesz uruchomić wątek roboczy w tle i wyświetlić postęp w interfejsie użytkownika. Wiele aplikacji internetowych korzysta z tej metody.

Jeśli jest to więcej niż, powiedzmy, 5 minut, możesz chcieć przekazać zadanie specjalnej usłudze. Jednym z przykładów są raporty generowane przez Google Analytics.

Kolejki Microsoft Messaging można używać do przesyłania informacji z systemu do innego lub komponentu do innego.


źródło
Jak języki takie jak PHP to osiągają? Znam kilka aplikacji internetowych, które to robią, ale są napisane w PHP
TheLQ
Nie jestem ekspertem od PHP, ale myślę, że zamiast wątku uruchamianego przez tę samą stronę, nazywa się inny. Tak właśnie dzieje się z AJAX.