Przeczytałem mnóstwo materiałów w Internecie na temat bezpieczeństwa i wydajności wątków w różnych wersjach ruby i szyn i myślę, że rozumiem te rzeczy całkiem dobrze w tym momencie.Jak wdrożyć asynchroniczną aplikację szyny wątków?
To, co wydaje się dziwnie omijać podczas dyskusji, to jak wdrożyć asynchroniczną aplikację Rails. Mówiąc o wątków i synchronizacji w aplikacji, są dwie rzeczy, które ludzie chcą zoptymalizować:
- wykorzystaniu wszystkich rdzeni procesora z wykorzystaniem minimalny RAM
- mogąc służyć nowych żądań podczas gdy poprzednie wnioski czekają na IO
Punkt 1 to miejsce, w którym ludzie (słusznie) są podekscytowani JRuby. Na to pytanie mam tylko próby optymalizacji pkt 2.
powiedzieć, jest to jedyny kontroler w moim app:
TheController < ActionController::Base
def fast
render :text => "hello"
end
def slow
render :text => User.count.to_s
end
end
fast
ma IO i może służyć setek lub tysięcy zapytań na sekundę, a slow
musi przesłać żądanie przez sieć, czekać na wykonanie pracy, a następnie odebrać odpowiedź przez sieć, a zatem jest znacznie wolniejsza niż fast
.
Idealne wdrożenie umożliwiłoby spełnienie setek zgłoszeń do fast
, podczas gdy żądanie na slow
czeka na IO.
To, co wydaje się brakować w dyskusjach w Internecie, to, która warstwa stosu jest odpowiedzialna za włączenie tej współbieżności. thin ma flagę --threaded
, która będzie "wywoływała aplikację Rack w wątkach [eksperymentalnych]" - czy to uruchamia nowy wątek dla każdego przychodzącego żądania? Buforuje instancje aplikacji szafy w wątkach, które utrzymują się i czekają na przychodzące żądania?
Czy cienki jest jedyny sposób, czy są inne? Czy środowisko wykonawcze ruby ma znaczenie dla optymalizacji punktu 2?
Wątpię, aby twoja wersja rubinowa miała dużo do powiedzenia w odniesieniu do punktu 2. Byłaby to bardziej zależna od implementacji współbieżności serwera i od tego, jak układane są szyny. – providence