OkHttpClient mit Problem mit dem Mobilfunkanbieter

Aug 28 2020

Meine Anwendungs-API führt ein seltsames Verhalten aus. Eine der APIs meiner Live-App erwartet eine Antwortzeit von 2 bis 3 Sekunden, aber die Antwort dauert lange!

Testfälle:

  1. Funktioniert mit WIFI = Ja
  2. Funktioniert mit Airtel Carrier = Ja
  3. Funktioniert mit Jio Carrier = Ja
  4. Funktioniert in anderen Ländern Netzwerk = Ja
  5. Funktioniert im mobilen Browser mit Vodafone Idea Carrier = Ja
  6. Funktioniert mit derselben API mit IOS-App unter Verwendung von Vodafone Idea Carrier = Ja

Hauptproblem: Problem mit dem Vodafone Idea Carrier mit App = Very Slow

Fall 1.

 URL url = new URL("https://example.com");
                urlConnection = (HttpsURLConnection) url.openConnection();
                urlConnection.setReadTimeout(10000);
                urlConnection.setConnectTimeout(10000);
                int code = urlConnection.getResponseCode();
                if (code !=  200) {
                    throw new IOException("Invalid response from server: " + code);
                }

                BufferedReader rd = new BufferedReader(new InputStreamReader(
                        urlConnection.getInputStream()));
                String line;
                while ((line = rd.readLine()) != null) {
                    Log.e("data", line);
                }

Ergebnis:

  • Zum ersten Mal 40 bis 50 Sekunden.
  • Bei jedem nächsten aufeinanderfolgenden Anruf kehrt er erwartungsgemäß innerhalb von 2 bis 5 Sekunden zurück.

Fall 2:

OkHttpClient okHttpClient = new OkHttpClient.Builder().build();

        Request.Builder requestBuilder = new Request.Builder()
                .url("https://example.com")
                .addHeader("Content-Type", "application/json");
        Request request = requestBuilder.build();
        Log.e("APi", "REQUEST: "+request.toString());

        Call call1 = okHttpClient.newCall(request);
        call1.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                Log.e("APi", "APi Failed");
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                Log.e("APi", "APi isSuccessful:" + response.isSuccessful());
                Log.e("APi", "Response:" + response.body().string());
            }
        });

Ergebnis:

  • Jedes Mal dauert es 40 bis 50 Sekunden.

Fall 3:

    OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.SECONDS).build();
    
            Request.Builder requestBuilder = new Request.Builder()
                    .url("https://example.com")
                    .addHeader("Content-Type", "application/json");
            Request request = requestBuilder.build();
            Log.e("APi", "REQUEST: "+request.toString());
    
            Call call1 = okHttpClient.newCall(request);
            call1.enqueue(new Callback() {
                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {
                    Log.e("APi", "APi Failed");
                }
    
                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                    Log.e("APi", "APi isSuccessful:" + response.isSuccessful());
                    Log.e("APi", "Response:" + response.body().string());
                }
            });

Ergebnis:

  • Jedes Mal dauert es 5 bis 6 Sekunden.

Hinweis: Ich habe Angst, .connectTimeout (1, TimeUnit.SECONDS) als 1 Sekunde in der App zu verwenden. Es gab mehr API-Fehler und sieht auch nicht nach der richtigen Lösung aus.

CaseStudy aktualisieren:

https://github.com/square/okhttp Detail-Debug von OkHttpClient. es gibt unten Fehler 4 mal ca.
failed to connect to xxx.com/2001:4860:4802:36::15 (port XXX) from /2402:3a80:1b8f:ca21:847:21a8:5ffc:fc30 (port XXX) after 10000ms  

Paket okhttp3.internal.connection.RealConnection-Klasse. Es wird versucht, connectSocket einzurichten , es wird jedoch ein Fehler angezeigt .

-> Nach dem Hinzufügen von "www" www.example.com zu meiner Domain. Die Antwortzeit ändert sich für die okhttp-Bibliothek von ca. 40 Sekunden auf ca. 12 Sekunden.

Antworten

1 BertoldKolics Sep 07 2020 at 03:40

Es ist schwierig, das ganze Bild zu sehen, da Sie nicht erklären, wie Sie die nachfolgenden Verbindungen ausführen. Es ist durchaus möglich, dass Sie eine vorhandene Verbindung wiederverwenden. Standardmäßig hält HTTP / 1.1 die Verbindungen aufrecht.

Es könnte auch interessant sein, zu überprüfen, ob die Verwendung von HTTP im Klartext im Vergleich zu HTTPS einen Unterschied macht , da die Kosten für den Verbindungsaufbau bei HTTPS höher sind. Ihr Client führt möglicherweise auch weitere Überprüfungen basierend auf dem zurückgegebenen Zertifikat durch.

Wenn das Ändern des Hostnamens so viel Unterschied macht, würde ich mir auf jeden Fall ansehen, wie der Namensauflöser auf dem System konfiguriert ist.

Ich würde auch den Netzwerkverkehr erfassen und sehen, was lange dauert. tcpdump ist dein Freund oder du könntest immer in Betracht ziehen, wireshark zu verwenden

Wie andere vorgeschlagen haben, möchten Sie möglicherweise auch den IPv6-Stapel auf der Box deaktivieren , um die Ursache des Problems auszuschließen.