Dolna linia: Próbuję zrozumieć, czy ColdFusion może korzystać z trwałego połączenia http poza pojedynczym żądaniem za pośrednictwem znacznika CFHTTP. Niektóre z tych postów to "co znalazłem/wypróbowałem".Opis ciągłych połączeń HTTP w ColdFusion
Mój system: CF10 IIS7.5 Windows 7
Jestem obecnie spinanie do ElasticSearch poprzez interfejs HTTP odpoczynku, który będzie miał wielkość połączeń cfhttp. W takim przypadku ColdFusion jest klientem, a ElasticSearch jest serwerem. Zgodnie z zaleceniami, zdałem nagłówek keep-alive wraz z żądaniem cfhttp, ale okazało się, że CFHTTP wydawało się zawsze dodać ścisły prawo po to skutkuje tym nagłówku:
<!--- Calling tag --->
<cfhttp url="loc.mysite.com?endpoint"
method="POST"
result="ret">
<cfhttpparam type="HEADER" name="Keep-Alive" value="300">
<cfhttpparam type="HEADER" name="Connection" value="keep-alive">
<cfhttpparam type="xml" value="#body#" />
</cfhttp>
<!--- Results in this header. (dumping getHTTPrequestdata() on a dummy page) --->
connection: keep-alive,closed
Po pierwsze, nie mogę dowiedzieć się, jak zapobiec zamknięcie się nie występuje.
Po drugie, nie mogę ustalić, czy ColdFusion użyje ponownie połączenia, nawet jeśli zostanie wysłane bez zamknięcia podczas tego samego żądania lub poza tym żądaniem. Najwyraźniej ma to związek z tym, jak w tym momencie Java wchodzi w interakcję z systemem operacyjnym. Początkowo myślałem, że poradzi sobie z nim magia ColdFusion, ale zaczynam myśleć, że nie używa ona żadnej wymyślnej magii łączenia Java.
Po trzecie, nie mogę znaleźć żadnej dokumentacji dotyczącej łączenia połączeń HTTP w ColdFusion. Pętla połączenia DB jest w porządku, ale buforowanie http jest prawdopodobnie stosunkowo nowym wymaganiem.
Po czwarte, stwierdziłem, że CFX_http5 nadal działa w ColdFusion 10 z Tomcat (jakie są szanse). Chociaż dobrze sprawdza się w przypadku wielowątkowych żądań, niewiele mówi się o tym, w jaki sposób wykorzystywany jest keep-alive. Bez jego zakupu nie mogę przetestować go w pętli. Nie dodaje zamkniętego nagłówka. Wysyła żywy, jak się spodziewałam.
Po szóste (edytowane ciężko od pierwszego wpisu) Po szóste, system Windows ma domyślną liczbę tymczasowych lub "efemerycznych" portów, z których może korzystać, aby odradzać nowe wychodzące połączenia TCP. Domyślnie, gdy połączenie zostanie otwarte, Windows będzie utrzymywał go przy życiu przez dwie minuty (chociaż jest po prostu opuszczony i zajmuje miejsce w tym miejscu). Jest to konfiguracja TCP, więc nagłówki HTTP nie są tutaj bezpośrednio używane. Domyślna liczba dostępnych portów to 5 000 mniej 1024 = 3076 portów. Oznacza to, że wszystkie instancje ColdFusion na pudełku mogą zawierać maksymalnie 3076 żądań http w dowolnym dwuminutowym oknie bez powodowania zakorkowania oczekiwania na dostępnym porcie połączenia. Jeśli zbyt wiele żądań zostanie zalanych (nie mam pojęcia w którym momencie), pojawi się błąd "połączenie zamknięte". To przypomina mi zbieranie śmieci na prymitywnym poziomie. A zatem zwiększ poziom w rejestrze (patrz post) poniżej i unikaj tych dławików, ale nadal występują opóźnienia w konfiguracji/opóźnieniu połączenia, a to rozwiązanie nie będzie skalowane.
Aktualizacja: CFX_HTTP5 obsługuje połączenia podtrzymujące i trwałe zgodnie z oczekiwaniami w ramach pojedynczego żądania ColdFusion. Mój test zapytania 150K do mojego punktu końcowego ElasticSearch poprzednio trwał 15 minut. Z CFX_HTTP5 trwało to 4 minuty. Ponadto udało mi się przełączyć rejestr z powrotem na domyślną liczbę portów. Następnym krokiem jest ustalenie, czy HTTPComponents będzie działać. Mam to prawie działa.
Aktualizacja 2:: Zbudowano niestandardowe połączenie HTTP za pomocą zaproponowanych poniżej składników HTTP. Użyłem podstawowego menedżera puli połączeń z ustawieniami domyślnymi. Nie próbowałem go jeszcze dostroić. Proces zakończył się za 5 minut, co jest odrobinę wolniejsze niż cfx_http5, ale wciąż jest dużo szybszy niż cfhttp. Ponadto nie wykonałem testów z wieloma żądaniami ColdFusion, aby naprawdę przetestować pulę połączeń.
Aktualizacja 3: Sprawdziłem, czy HTTPComponents rzeczywiście tworzy poprawną pulę połączeń. Jednak z tym wiąże się obowiązek właściwego zarządzania tymi połączeniami i samą pulą, aby zapewnić, że jest ona dobrym zarządcą zasobów systemowych. Byłem w stanie uruchomić kilka milionów żądań HTTP z kilku różnych jednoczesnych żądań, jednocześnie otwierając jedynie niewielką garść połączeń HTTP. Z dzienników mogłem sprawdzić, ile połączeń było używanych, bezczynnych lub uruchomionych. To naprawdę nie jest tak dużo kodu, ludzie stojący za projektem mają świetną dokumentację.
HTTPComponents Connection Pool:
Single request, unlimited CFHTTP to same connection = single open TCP connection
N-requests = <N open TCP connections.
CFHTTP
N-CFHTTP calls + N-CFHTTP calls in previous 60 seconds = open TCP connections
referencyjny: znalazłem, że Java jest to dostępne, co pokazuje, że jest to w sferze możliwości, ale kto wie, jak Adobe wdrożył CFHTTP Persistent Http client connections in java
CFX_http5 niestandardowy tag używa C++ dla zwyczaju połączeń HTTP, więc możliwe jest, że rozumie on łączenie połączeń. http://www.cftagstore.com/tags/cfxhttp5.cfm
Powiązane pytanie: Maintain Outbound TCP Connection Pool in ColdFusion
o Windows Max Connections/porty Efemeryczne http://kb.globalscape.com/KnowledgebaseArticle10438.aspx
Doskonały pomysł na HTTPClient . Zamierzam również kupić CFX_http5 i dać temu wir. Chociaż jest to kilka lat i jest porzucone, to jest to lepsze rozwiązanie niż niektóre wsparcie wbudowanych tagów i silników na przestrzeni lat (Query of Queries, regex, cfhttp, cfpop, itp.). Jednak otrzymujemy CFPOD i CFTWITTER! –
Jeśli zauważysz, że HTTPClient lub inne rozwiązanie działa, czy możesz pisać tutaj? Jestem pewien, że wiele osób byłoby bardzo zainteresowanych rozwiązaniem, które pozwala na stałe połączenia HTTP przez CF (lub Java przez CF). Dzięki! – Brian
Zaktualizowano, że działa CFX_HTTP5. Teraz pracuję nad httpcomponentami. –