हम k8s क्लस्टर पर तैनात अपने जावा ऐप्स में okhttp का उपयोग करते हैं। हमारे स्रोत ऐप में istio सक्षम नहीं है और दूत साइडकार के साथ गंतव्य से जुड़ता है। कनेक्टिविटी चेन इस तरह दिखती है:

एसआरसी --------> दूत -> डीएसटी

तो वास्तव में एसआरसी ऐप सीधे डीएसटी ऐप से नहीं, बल्कि उसके सामने प्रॉक्सी प्रॉक्सी के लिए एक कनेक्शन स्थापित करता है। जब डीएसटी ऐप्स बंद हो जाते हैं, तो यह डीएसटी और दूत के बीच सभी कनेक्शन समाप्त कर देता है, लेकिन एसआरसी और दूत के बीच कनेक्शन खुला रहता है। इसलिए SRC ऐप में 503 एरर आने लगते हैं। SRC से DST को एक अन्य संदेश भी 503 मिलता है क्योंकि हम okhttp के कनेक्शन पूल में स्थापित निष्क्रिय कनेक्शन का पुन: उपयोग करते रहते हैं। इस समस्या का समाधान कनेक्शन पूल से निष्क्रिय कनेक्शनों में से एक का उपयोग करने के बजाय नए टीसीपी कनेक्शन को फिर से स्थापित करना है। क्या प्राप्त एकल HTTP 503 के आधार पर संपूर्ण TCP कनेक्शन को समाप्त करने के लिए okhttp को कॉन्फ़िगर करना संभव है?

1
jado 5 नवम्बर 2020, 15:46

1 उत्तर

सबसे बढ़िया उत्तर

कुछ इस तरह काम करना चाहिए

import okhttp3.OkHttpClient
import okhttp3.Request

fun main() {
  val client = OkHttpClient.Builder()
    .eventListenerFactory(LoggingEventListener.Factory())
    .addNetworkInterceptor { chain ->
      chain.proceed(chain.request()).also { response ->
        println(response.code)
        if (response.code == 503) {
          println("closing")
          chain.connection()?.socket()?.close()
        }
      }
    }
    .build()

  val response1 = client.newCall(Request.Builder().url("https://httpbin.org/get").build()).execute()

  val response2 = client.newCall(Request.Builder().url("https://httpbin.org/status/503").build()).execute()

  val response3 = client.newCall(Request.Builder().url("https://httpbin.org/get").build()).execute()
}
1
Yuri Schimke 6 नवम्बर 2020, 08:12