Mobil Operatör sorunu ile OkHttpClient
Uygulama API'm tuhaf davranışlar sergiliyor. Canlı uygulamamın API'lerinden birinin yanıt süresi 2-3 saniye bekledi, ancak yanıt vermesi uzun zaman alıyor!
Test Durumları:
- WIFI ile çalışır = Evet
- Airtel taşıyıcıyla çalışır = Evet
- Jio taşıyıcıyla çalışır = Evet
- Diğer ülkeler ağında çalışıyor = Evet
- Vodafone Idea operatörüyle mobil tarayıcıda çalışır = Evet
- Vodafone Idea taşıyıcı kullanan IOS uygulamasıyla Aynı API ile çalışır = Evet
Ana Sorun: Uygulama kullanan Vodafone Idea operatöründe sorun = Çok Yavaş
Dava 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);
}
Sonuç:
- İlk kez 40 ila 50 saniye.
- Bir sonraki ardışık aramada, beklentiye göre 2 ila 5 saniye içinde geri dönecektir.
Durum 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());
}
});
Sonuç:
- Her seferinde 40 ila 50 saniye sürer.
Durum 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());
}
});
Sonuç:
- Her seferinde 5 ila 6 saniye sürer.
Not: .connectTimeout (1, TimeUnit.SECONDS) uygulamasını uygulamada 1 saniye olarak kullanmaktan korkuyorum Daha fazla api hatası vermeye başladı ve doğru çözüm de görünmüyor.
CaseStudy'yi güncelleyin:
https://github.com/square/okhttp OkHttpClient'in ayrıntılı hata ayıklaması. yaklaşık 4 kez aşağıdaki hata verir.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 sınıfı. connectSocket kurmaya çalışıyor ama hata alıyorum.
-> "www" www.example.com'u etki alanıma ekledikten sonra . Okhttp kitaplığı için yanıt süresi yaklaşık 40 saniyeden 12 saniyeye değiştirilir.
Yanıtlar
Tüm resmi görmek zordur çünkü sonraki bağlantıları nasıl yürüttüğünüzü açıklamazsınız. Mevcut bir bağlantıyı yeniden kullanıyor olmanız tamamen mümkündür. Varsayılan olarak, HTTP / 1.1 bağlantıları canlı tutar.
HTTPS ile bağlantı kurulum maliyeti daha yüksek olduğundan, düz metin HTTP ile HTTPS'nin kullanılmasının bir fark yaratıp yaratmadığını kontrol etmek ilginç olabilir. Müşteriniz ayrıca iade edilen sertifikaya bağlı olarak daha fazla doğrulama yapabilir.
Ana bilgisayar adını değiştirmek çok fazla fark yaratıyorsa, o zaman sistemde isim çözümleyicinin nasıl yapılandırıldığına kesinlikle bakarım .
Ayrıca ağ trafiğini de kaydeder ve neyin uzun sürdüğünü görürdüm. tcpdump senin arkadaşın veya her zaman wireshark kullanmayı düşünebilirsin
Başkalarının da önerdiği gibi, sorunun kaynağını dışlamak için kutudaki IPv6 yığınını devre dışı bırakmak isteyebilirsiniz .