2011-12-22 13 views
5

Posiadam kilkuletnie doświadczenie w tworzeniu aplikacji internetowych przy użyciu PHP, a także intensywnie pracowałem z Javą (jednak nigdy przy tworzeniu aplikacji internetowych). Kończę duży projekt, nad którym pracowałem przez ostatnie sześć miesięcy zbudowane w PHP/CodeIgniter i hostowane z CloudControl (zapewnia automatyczne udostępnianie serwerów i skalowalność).Pytania dotyczące języka Java na potrzeby programowania WWW od programisty PHP

Projekt poszło dobrze, a PHP zaspokaja moje potrzeby - ale teraz jestem w początkowej fazie opracowywania aplikacji internetowej, która będzie skierowana do użytkowników korporacyjnych i rozważam użycie Java (być może "Grails") w połączeniu z AWS Elastic Beanstalk.

Moje pierwsze pytanie to: wielowątkowość, jak często jest używana w tworzeniu aplikacji internetowych w Javie? W mojej aplikacji PHP mój serwer mógł zostać poproszony o wykonanie wywołania API na facebooku w odpowiedzi na prośbę użytkownika (powiedz, post na ścianie użytkownika). Aby nie dopuścić do tego, aby mój proces PHP czekał na zakończenie wywołania interfejsu API przed powrotem do użytkownika, użyłem serwerów zadań kolejkowania Gearman z pracownikami, aby odciążyć pracę z głównego serwera aplikacji do pracownika działającego w tle.

Czy programista Java po prostu zakręciłby wątek tylko po to, aby obsłużyć wywołanie API i aby główny proces powrócił do użytkownika? Czy to jest największa siła rozwoju Javy nad PHP? Dzięki!

+1

Przez pewien czas żywiłem się obydwoma językami. Moja bardzo skromna opinia brzmi: siła Java to dostępność API i bibliotek. Dla PHP szybkie jest zbudowanie prototypu lub wersji funkcjonalnej. Spójrz na mnie teraz, wybrałem java po raz kolejny na nowy projekt, ponieważ wiedziałem, że mogę używać Apache POI zamiast PHPExcel ... rodzaj lenistwa. :) – Alfabravo

+1

Wiem, że umiejętność tworzenia nowych wątków jest nowością dla programisty PHP (takiego jak ja) i możliwość korzystania z tej fajnej funkcji, której tak rozpaczliwie brakuje w PHP, powoduje powstanie całego szeregu "ooh, mogłem zrobić to, i to, i te rzeczy "typu myśli - ale bądźcie oszczędni. Słyszałem zbyt wiele opowieści programistów pochodzących z PHP na jakiś język, który pozwala na wielowątkowość, i dostaję się do sytuacji, w której rozpoczęli 100 wątków, aby wykonać zadanie czegoś, co można rozsądnie zrobić w 3, a następnie zastanawiają się, dlaczego serwer działa jak pies. – DaveRandom

+0

Użyłem wątków, gdy użytkownicy potrzebują danych, aby były dostępne (wydajność to funkcja!), A zebranie wszystkiego wymagałoby długiego czasu oczekiwania w jednym wątku. Jestem pewien, że jest wiele innych przypadków, w których okazuje się to pomocne, ale nie jest to srebrna kula ani pierwsza myśl przy budowaniu czegoś. – Alfabravo

Odpowiedz

2

Czy programista Java po prostu zakręciłby wątek tylko po to, aby obsłużyć wywołanie API i aby główny proces powrócił do użytkownika?

To zależy.

Jeśli to zrobisz, oryginalny wątek może zająć się czymś innym, ale jeśli nie jest zaprojektowany jako oparty na zdarzeniach, to w końcu będzie musiał poczekać na zakończenie wątku dodatkowego ... z powrotem tam, gdzie zacząłeś. (Faktycznie jesteś gorzej ... bo już teraz uzyskałem 2 wątków oczekujących.)


W przypadku serwera WWW, realizowanego za pomocą klasycznych serwletów Java, każde żądanie użytkownika jest prowadzony we własnym wątku. Prostym podejściem byłoby wykonanie wywołania API w wątku żądania. To blokuje wątek, ale inne wątki mogą pracować nad innymi żądaniami, gdy to się dzieje. Zakładając, że masz wystarczająco dużo wątków w puli wątków kontenera WWW, działa to dobrze ... chociaż w końcu zużywasz dużo zasobów (pamięci) na stosy wątków.

Najnowsze wersje specyfikacji serwletów Java dodały obsługę przetwarzania asynchronicznego. Nie jestem w stanie przyspieszyć szczegółów, ale teoretycznie pozwoliłoby to odłączyć wątek żądania od żądania, podczas gdy ten ostatni robił coś, co trwało długo. Jednak nie jestem przekonany, że to pomogłoby tutaj ... chyba że po stronie klienta implementacja API, która była w stanie równolegle uruchomić wiele jednoczesnych żądań, używając małej (i ograniczonej) liczby wątków Java.

Są prawdopodobnie inne alternatywy, ale może to być o wiele więcej pracy.


Moja rada to od samego początku proste rozwiązanie. Po prostu wykonaj wywołanie API w wątku żądania i skonfiguruj swój serwer WWW tak, aby używał rozsądnej liczby wątków żądań.

Są szanse, że będziesz mógł uciec "marnując" trochę pamięci, aby uzyskać wydajność, której naprawdę potrzebujesz. W dłuższej perspektywie może zajdzie potrzeba rozwiązania tego problemu, ale do tego momentu będziesz miał czas, aby dowiedzieć się więcej o bardziej skalowalnych alternatywach.

+0

OK Teraz widzę, że wszystkie wątki zainicjowane przez proces muszą zostać ukończone, zanim wątek wykonania, który został uruchomiony przez żądanie użytkownika, zostanie zakończony. Z moim hostem PHP, CloudControl, mam tylko dwa procesy na skrzynkę. Aby zmniejszyć potrzebę dostarczania dodatkowych skrzynek, użyłem serwera kolejkowania zadań i uruchomiłem kilku pracowników w tle oczekujących na zadania - pozwalając na zwrócenie głównego wątku, gdy nie trzeba czekać na wynik wywołania API –

Powiązane problemy