Rozwiązanie długotrwałego problemu z zapytaniem w aplikacji internetowej (żądanie asynchroniczne)

Oto problem

Użytkownik aplikacji WWW przedsiębiorstwa wykonuje zadanie, które powoduje długie (bardzo długie) zapytanie do bazy danych (lub inne zadanie wymagające intensywnego przetwarzania)

Problemy:

Limit czasu żądania - po chwili użytkownik może otrzymać limit czasu żądaniaLimit czasu sesji - jeśli nie są używane żadne metody przechowywania sesji, może wystąpić limit czasu sesjiZażądaj blokady wątkuponieważ wątek żądania nie powraca, może zablokować nowe wymagania (jeśli osiągnie limit puli)W niektórych serwerach aplikacji stan kondycji serwera może spowodować wymuszony restart węzła lub aplikacji (z powodu długiego wątku działającego żądania)Jeśli użytkownik opuści stronę:transakcja nie jest anulowana - skutkuje bezużytecznym przetwarzaniem, z którego nikt nie skorzystaużytkownik nie może wrócić do wyników po ich zakończeniubrak wskazania postępu - użytkownik po prostu czeka na odświeżenie strony

Jest kilka rozwiązań, które wymyśliłem, ale nie jestem pewien, czy wiem, co jest lepsze (we wszystkich aspektach, wydajności, najlepszych praktykach, elegancji i łatwości konserwacji) i chciałbym wiedzieć, jakie jest twoje zalecane rozwiązanie, a jeśli jest rozwiązanie, które przegapiłem? (prawdopodobnie tak i wiele)

Złe rozwiązanie: użyj wątku żądania jako wątku roboczego, zapisz stan postępu w sesji, sprawdź, czy połączenie AJAX sprawdza status (w sesji) w innym równoległym żądaniu

Rozwiązanie kompromisowe: utwórz własną pulę wątków, obsłuż wątek monitorowania, wątek roboczy i zajmij się klastrowaniem, synchronizując stany w rozproszonej pamięci podręcznej transakcyjnej lub w pamięci trwałej. powoduje to zwolnienie żądania, ale wątki creats, o których serwer aplikacji nie jest świadomy, nie będą zamykane w trakcie wycofywania. To do ciebie należy zamknięcie wątków w czysty sposób, a zawsze jest szansa, że ​​coś się skończy. To również nie jest sposób J2EE.

Rozwiązanie J2EE: używaj JMS do zadań asynchronicznych, o to właśnie chodzi

rozwiązanie Spring: użyj partii Spring

Co zrobiłbyś / zrobiłeś w swoich projektach? Jakie znasz inne rozwiązania? który z tych, które zauważyłem powyżej, jest twoim zdaniem zwycięzcą?

questionAnswers(4)

yourAnswerToTheQuestion