2016-11-02 3 views
1

Ich versuche, mein Verständnis von was blocking bedeutet in Bezug auf Anforderungen an einen Webserver zu festigen und wenn es klug ist, Anforderungen an einen separaten Arbeiter (date sidekiq) zu übergeben.Wann Arbeit von Webserver zu Arbeiter übergeben

Betrachten Sie die folgenden Beispiele:

  1. Anmeldung mit Facebook

    def sign_in 
        response = Faraday.get("https://graph.facebook.com/me?fields=id,email&access_token=#{some_token}") 
        user_info = JSON.parse(response.body) 
        @user = User.find_by(uid: user_info["id"]) 
        ... 
    end 
    
  2. Senden Push-Benachrichtigung über Google Firebase

    def send_push_notification 
        ... 
        fcm = FCM.new(FCM_KEY) 
        registration_ids = [recipient_token] 
        resp = fcm.send(registration_ids, data: {body: notification_params[:body]}) 
        ... 
    end 
    

In beiden Beispielen die Bahn erf Die Kosten für einen Drittanbieterdienst sind synchron und möglicherweise kostspielig. Intuitiv würde ich versuchen, diese Fälle mit einem separaten Arbeiter zu behandeln, weil sie die Hauptanwendung Block sind. Aber ich bin nicht 100% sicher, was blockiert bedeutet. Bedeutet es, dass wenn 100 Benutzer versuchen, sign_in und jeder Faraday.get Anruf dauert 1 Sekunde dauert es 100 Sekunden für alle Benutzer, um sich anzumelden?

+0

Zum Senden einer Benachrichtigung über FCM können Sie den Hintergrundprozess verwenden. wie sidekiq, delayed_job, ect. und das ist der richtige Weg zum integrierten Benachrichtigungsmodul in der Anwendung. –

+0

@DarpanChhatravala Yeah!Ich würde gerne über den letzten Teil der Frage hören, der fragt: "Ich bin mir nicht 100% sicher, was Blockieren bedeutet. Bedeutet das, dass wenn 100 Benutzer versuchen, sign_in und jeder Aufruf von Faraday.get 1 dauert Zweitens dauert es 100 Sekunden, bis sich alle Benutzer angemeldet haben. " –

+0

Ich habe keine Implementierung exp mit mir Ich wurde einmal ein Blog gelesen, Sie können versuchen, Edelstein 'Faraday-Request-Timer' zu implementieren. Von diesem erhalten Sie die gesamte angeforderte Zeit. hoffe das wird dir helfen :) –

Antwort

1

Bedeutet es, dass, wenn es 100 Benutzer, die versuchen zu sign_in sind und jeder Faraday.get Anruf dauert 1 Sekunde, es 100 Sekunden für all Benutzer sie anmelden nehmen?

Vereinfachte Antwort: ja.

In einem sehr einfachen Szenario wird der 1. Benutzer 1 Sekunde warten, der 2. Benutzer wird 2 Sekunden warten und so weiter.

Wenn Ihre Anwendung/der Web-Server die Benutzeranforderung nicht abbricht, wartet der 100. Benutzer 100 Sekunden.

Ein bisschen detaillierter: hängt davon ab.

Heutzutage haben moderne Webanwendungen (wie Puma) mehr als einen Prozessarbeiter, der in Ihrer Maschine ausgeführt wird. Dies bedeutet, dass Ihre Anwendung mehr als eine Anfrage gleichzeitig verarbeiten kann.

Beispiel: Wenn Puma für die Verwendung von 2 Arbeitern konfiguriert ist, verarbeitet Ihre Anwendung die Anforderungen von 2 Benutzern gleichzeitig.

Somit warten der 1. und 2. Benutzer 1 Sekunde, der 3. und 4. Benutzer warten 2 Sekunden und der 99. und 100. Benutzer wartet 50 Sekunden.

Da jeder Puma-Prozess eine beträchtliche Menge an CPU und Speicher verbraucht, können Sie keine unbegrenzten Mitarbeiter haben. Deshalb ist es sehr interessant, einen Hintergrundprozess zu haben, um diese Push-Benachrichtigungen zu senden.

In Sidekiq (zum Beispiel) sind die Kosten, um einen Job an einen Mitarbeiter zu delegieren, extrem langsam und daher werden die Benutzer Ihrer Website nicht bestraft.

Verwandte Themen