2017-01-13 17 views
5

fasthttp Serwer jest do 10 razy szybszy niż sieć/http.W pakietach golang, dlaczego fasthttp jest szybszy od net/http?

Co sprawia, że ​​jest to o wiele szybsze pod względem implementacji (na poziomie kodowania)?
W jaki sposób zarządza przychodzącymi żądaniami, które różnią się od innych?

+4

Główny powód: fasthttp to ** nie ** pełna implementacja protokołu HTTP. fasthttp może być wystarczająco dobre dla większości rzeczy HTTP, ale nie dla wszystkiego. – Volker

+0

@Volker ... Czy możesz powiedzieć jakie rzeczy zostały pominięte w fasthttp –

+1

Na początek, brak obsługi http/2 https://github.com/valyala/fasthttp/issues/144 – nishanths

Odpowiedz

9

Artykuł "http implementation fasthttp in golang" od husobee wspomina:

dobrze, to jest o wiele lepsze wdrożenie kilku powodów:

  1. Model basen pracownik jest modelem alokacji zero, jako pracowników są już zainicjalizowane i są gotowe do wyświetlenia, podczas gdy w implementacji stdlib go c.serve() musi przydzielić pamięć dla goroutine.
  2. Model puli pracującej jest łatwiejszy do dostrojenia, ponieważ można zwiększyć/zmniejszyć rozmiar bufora liczby jednostek roboczych, które można zaakceptować, w porównaniu do modelu pożaru i zapomnienia w modelu stdlib. Model puli pracującej pozwala, aby programy obsługi były bardziej połączone z serwerem za pośrednictwem komunikacji kanałowej, jeśli serwer musi na przykład zostać zamknięty, byłby w stanie łatwiej komunikować się z pracownikami niż w implementacji stdlib.
  3. Podpis podpowiedzi funkcji treser jest lepszy, ponieważ przyjmuje tylko kontekst obejmujący zarówno żądanie, jak i program piszący potrzebny do obsługi. jest to SZCZEGÓLNIE lepsze od standardowej biblioteki, ponieważ wszystko, co dostajesz ze stdlib, jest pisarzem żądania i odpowiedzi ... Praca w go1.7 w celu uwzględnienia kontekstu w żądaniu jest raczej hackem, aby dać ludziom to, czego naprawdę chcą (kontekst) bez rozbijania nikogo.

Ogólnie lepszym rozwiązaniem jest napisanie serwera z modelem puli pracującej do obsługi żądań, w przeciwieństwie do tworzenia "wątku" na żądanie, bez możliwości dławienia po wyjęciu z pudełka.

+1

@ amit-verma, proszę jednak wziąć pod uwagę, że jednym z powodów, dla których ten pakiet jest szybszy, jest postawa autora ["standardy są dla przegranych"] (https://groups.google.com/d/msg/golang-nuts/OaQu4QezAr0/ AtrwY00LBgAJ). Dlatego gdybym był tobą, zaczynałbym od 'net/http', aby być bezpiecznym: ludzie, którzy są w CS/IT * do * mają naturalną tendencję do nadmiernego optymalizowania, bo wszyscy lubimy nasze systemy. "najlepszy". Niestety w świecie rzeczywistym * łatwość konserwacji * przez większość czasu jest szybsza. – kostix

+1

@ amit-verma, No chyba że jesteś Facebookiem i możesz, na przykład, zaoferować youserlf do ujawnienia się w projektach z szalonymi wysiłkami konserwacyjnymi, takimi jak sprawienie, żeby PHP faktycznie działało na ich obciążenia ;-) Co mam na myśli, 'net/http' to Sprawdzone pod względem brawurowym i zgodne ze standardami oraz posiada za sobą podstawowy zespół Go. Czy naprawdę potrzebujesz teraz nieprzerobionej prędkości 'fasthttp' dla twojego projektu *? * Czy masz wąskie gardła? Czy profilowałeś go i wykluczyłeś zwykłych winowajców (jak nieefektywne alokacje/mnóstwo wskaźników do wskaźników do wskaźników itp.)? – kostix

+0

@AmitVerma, staram się odpowiedzieć na ostatnie fragmenty mojego poprzedniego komentarza: "Czy naprawdę potrzebujesz teraz szybkiej prędkości fasthttp dla swojego projektu? Czy masz wąskie gardła? Czy sprofilowałeś to i wykluczyłeś zwykłych winowajców (jak nieefektywne alokacje/mnóstwo wskaźników do wskaźników do wskaźników itp.)? "Wygląda na to, że wpadasz we wspólną pułapkę, w którą wpada większość początkujących programistów.To jest "ja * wiem * mój program * musi * być powolny * tutaj dokładnie" * mantra - bez jakiegokolwiek profilowania. To jest leniwe i lepiej oduczyć się tego nawyku przed wykonaniem jakiejkolwiek płatnej pracy produkcyjnej. – kostix