Wszystko,Czy AsyncHttpClient może wykonywać nieblokujące, asynchroniczne wywołania HTTP?
Próbuję podjąć decyzję, czy użyć aplikacji NodeJS lub Java dla mojej aplikacji. Będę komunikował się z CouchDB przez HTTP i chciałbym asynchronicznego nieblokującego się projektu, w którym mój wątek aplikacji może przetwarzać dodatkowe żądania podczas oczekiwania na odpowiedź zapytania z CouchDB.
Wolałbym używać Javy i szukałem AsyncHttpClient przez kilka dni jako potencjalne rozwiązanie. Mam jednak problem ze zrozumieniem biblioteki i myślę, że mogę mieć fundamentalne niezrozumienie czegoś.
Zamieściłem tu sedno: „Wniosek wysłany X” https://gist.github.com/conorgil/5505603
spodziewałbym to sens, aby wydrukować ORAZ "Odpowiedź X: coś" dla każdego żądania. Wygląda jednak na to, że wywołanie HTTP nie jest wykonywane (a zatem program obsługi nie jest wykonywany), dopóki wszystkie przyszłe wywołania get(). Uncommenting linii 23 f.get() sprawia, że kod działa zgodnie z oczekiwaniami, ale wywołanie Future # get() jest blokowanie, prawda? Czy istnieje sposób, aby po prostu dostarczyć funkcję zwrotną, która zostanie wykonana po uzyskaniu pełnej odpowiedzi HTTP bez blokowania?
Coś jak poniżej: 1) żądanie przychodzi w głównym wątku 2) asynchroniczne, nieblokujące wywołanie HTTP jest wykonywane w CouchDB. Procedura obsługi zakończyła rejestrację w celu przetworzenia odpowiedzi z CouchDB 3) główny wątek może teraz przetworzyć następne żądanie: 4) Odpowiedź HTTP z CouchDB pojawia się w pewnym momencie, a zarejestrowany handler jest wywoływany w celu wykonania logiki biznesowej 5) główny wątek kontynuuje tylko przetwarzanie żądań (dla żądań, które nie muszą uderzać w CouchDB, mogą być szybko reagowane)
Czy zasadniczo coś tutaj nie rozumiem? Czy można robić tego typu rzeczy w Javie? Czy AsyncHttpClient jest odpowiedzią? To pytanie jest powiązane, ale nie jest pewne, czy sytuacja zmieniła się od 2011 (Perform Async Connect with Java AsyncHttpClient Library?)
Ponieważ NodeJS uruchamia pętlę zdarzeń, to nieblokujące zachowanie asynchroniczne jest standardem. Wystarczy zarejestrować funkcję wywołania zwrotnego, aby obsłużyć odpowiedź DB, gdy została ona odebrana, a pętla zdarzeń po prostu przetworzy w międzyczasie inne rzeczy.
Wszelkie rady są mile widziane.
Dzięki Conor
Tak jest. Spójrz na vert.x –
node.js jest całkiem przyzwoity jako lekki odwrotny serwer proxy/brama z niewielką logiką aplikacji z couchdb po prostu z powodu interfejsu http na kanapie i łatwego asynchronicznego http węzła w węźle. Java jest bardziej wydajna dla ciężkiej logiki aplikacji. –