OkHttpClient dengan masalah Operator Seluler
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:
- Bekerja dengan WIFI = Ya
- Bekerja dengan operator Airtel = Ya
- Bekerja dengan Jio carrier = Yes
- Bekerja di jaringan negara lain = Ya
- Bekerja di browser seluler dengan Vodafone Idea carrier = Yes
- 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
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.