OkHttpClient dengan masalah Operator Seluler

Aug 28 2020

API Aplikasi saya melakukan perilaku aneh. Salah satu api aplikasi langsung saya mengharapkan waktu respons 2 hingga 3 detik, tetapi butuh waktu lama untuk merespons!

Kasus Uji:

  1. Bekerja dengan WIFI = Ya
  2. Bekerja dengan operator Airtel = Ya
  3. Bekerja dengan Jio carrier = Yes
  4. Bekerja di jaringan negara lain = Ya
  5. Bekerja di browser seluler dengan Vodafone Idea carrier = Yes
  6. Bekerja dengan API yang Sama dengan aplikasi IOS menggunakan Vodafone Idea carrier = Yes

Masalah Utama: Masalah dengan pembawa Ide Vodafone menggunakan App = Sangat Lambat

Kasus 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);
                }

Hasil:

  • Pertama kali 40 hingga 50 detik.
  • Pada setiap panggilan berturut-turut berikutnya, telepon akan kembali dalam 2 hingga 5 detik sesuai harapan.

Kasus 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());
            }
        });

Hasil:

  • Setiap waktu membutuhkan waktu 40 hingga 50 detik.

Kasus 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());
                }
            });

Hasil:

  • Setiap kali dibutuhkan 5 sampai 6 detik.

Catatan: Saya takut untuk menggunakan .connectTimeout (1, TimeUnit.SECONDS) sebagai 1 detik di aplikasi Ini mulai memberikan lebih banyak kegagalan api dan tidak terlihat solusi yang benar juga.

Perbarui CaseStudy:

https://github.com/square/okhttp Detail debug OkHttpClient. itu memberikan kesalahan di bawah ini 4 kali kira-kira.
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 kelas okhttp3.internal.connection.RealConnection. mencoba membuat connectSocket tetapi mendapatkan error.

-> Setelah menambahkan "www" www.example.com ke dalam domain saya. Waktu respons berubah dari 40 detik menjadi 12 detik kira-kira untuk perpustakaan okhttp.

Jawaban

1 BertoldKolics Sep 07 2020 at 03:40

Sulit untuk melihat gambaran keseluruhan karena Anda tidak menjelaskan bagaimana Anda menjalankan koneksi selanjutnya. Sangat mungkin Anda menggunakan kembali koneksi yang ada. Secara default, HTTP / 1.1 menjaga koneksi tetap hidup.

Memeriksa untuk melihat apakah menggunakan HTTP teks biasa vs. HTTPS membuat perbedaan juga bisa menarik, karena biaya penyiapan sambungan lebih tinggi dengan HTTPS. Klien Anda juga dapat melakukan lebih banyak verifikasi berdasarkan sertifikat yang dikembalikan.

Jika mengubah nama host membuat banyak perbedaan, maka saya pasti akan melihat bagaimana resolver nama dikonfigurasi pada sistem.

Saya juga akan menangkap lalu lintas jaringan dan melihat apa yang memakan waktu lama. tcpdump adalah teman Anda atau Anda selalu dapat mempertimbangkan untuk menggunakan wireshark

Seperti yang disarankan orang lain, Anda mungkin juga ingin menonaktifkan tumpukan IPv6 pada kotak untuk mengesampingkan sebagai sumber masalah.