Layanan 503 Tidak Tersedia - Penutupan dini oleh server backend

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Gejala

Aplikasi klien mendapatkan status respons HTTP 503 dengan pesan tersebut Service Unavailable setelah panggilan proxy API.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 503 Service Unavailable

Selain itu, Anda mungkin melihat pesan error berikut:

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
       }
    }
}

Kemungkinan Penyebab

Penyebab Deskripsi Petunjuk pemecahan masalah berlaku untuk
Server target menutup koneksi sebelum waktunya Server target mengakhiri koneksi sebelum waktunya saat Pemroses Pesan masih mengirimkan payload permintaan. Pengguna Edge Public dan Private Cloud

Langkah-langkah diagnosis umum

Menentukan ID Pesan dari permintaan yang gagal

Alat rekaman aktivitas

Cara menentukan ID pesan dari permintaan yang gagal menggunakan alat Trace:

  1. Jika masalah masih aktif, aktifkan sesi rekaman aktivitas untuk API yang terpengaruh.
  2. Lakukan panggilan API dan rekonstruksi masalah - 503 Service Unavailable dengan kode error messaging.adaptors.http.flow.ServiceUnavailable.
  3. Pilih salah satu permintaan yang gagal.
  4. Buka fase AX, dan tentukan ID pesan (X-Apigee.Message-ID) permintaan dengan men-scroll ke bawah di Fase Details seperti yang ditunjukkan dalam gambar berikut.

    ID Pesan di bagian Detail Fase

Log akses NGINX

Untuk menentukan ID pesan dari permintaan yang gagal menggunakan log akses NGINX:

Anda juga dapat melihat log NGINX Access untuk menentukan ID pesan untuk error 503. Hal ini sangat berguna jika masalahnya pernah terjadi sebelumnya atau jika masalahnya hanya sesekali saja dan Anda tidak dapat merekam aktivitas di UI. Gunakan langkah-langkah berikut untuk menentukan informasi ini dari log akses NGINX:

  1. Periksa log akses NGINX: (/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log)
  2. Telusuri apakah ada Error 503 untuk proxy API tertentu selama durasi tertentu (jika masalah terjadi sebelumnya) atau jika ada permintaan yang masih gagal dengan 503.
  3. Jika ada Error 503 dengan X-Apigee-fault-code messaging.adaptors.http.flow.ServiceAvailable, catat ID pesan untuk satu atau beberapa permintaan seperti yang ditunjukkan pada contoh berikut:

    Contoh Entri yang menunjukkan Error 503

    Contoh entri yang menunjukkan kode status, ID pesan, sumber fault, dan kode fault

Penyebab: Server target menutup koneksi sebelum waktunya

Diagnosis

  1. Jika Anda adalah pengguna Public Cloud atau Private Cloud:
    1. Menggunakan alat Rekaman Aktivitas (seperti yang dijelaskan dalam Langkah-langkah diagnosis umum) dan pastikan Anda telah menetapkan kedua hal berikut di panel Data Analytics Dicatat:
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. Menggunakan alat Rekaman Aktivitas (seperti yang dijelaskan dalam Langkah-langkah diagnosis umum) dan pastikan bahwa kedua hal berikut sudah disetel di panel Error segera setelah properti state TARGET_REQ_FLOW:
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. Buka Menggunakan tcpdump untuk penyelidikan lebih lanjut.
  2. Jika Anda adalah pengguna Private Cloud:
    • Tentukan ID pesan permintaan yang gagal.
    • Menelusuri ID pesan di log Pemroses Pesan (/opt/apigee/var/log/edge-message-processor/logs/system.log).
    • Anda akan melihat salah satu pengecualian berikut:

      Pengecualian #1: java.io.IOException: Terjadi error saat menulis ke channel ClientOutputChannel

      2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy
      rev:1 messageid:myorg-opdk-test-1-30312-13747-1  NIOThread@1
      INFO  HTTP.SERVICE - ExceptionHandler.handleException() :
      Exception java.io.IOException: Broken pipe occurred while writing to channel
      ClientOutputChannel(ClientChannel[Connected:
      Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1
      bytesRead=0 bytesWritten=76295 age=2012ms  lastIO=2ms  isOpen=false)
      

      atau

      Pengecualian #2: Pengecualian onExceptionWrite: {}
      java.io.IOException: Pipa rusak

      2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test
      rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1
      NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() :
      ClientChannel[Connected: Remote:IP:PORT
      Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms  lastIO=2
      ms  isOpen=false.onExceptionWrite exception: {}
      java.io.IOException: Broken pipe
      
    • Kedua pengecualian ini menunjukkan bahwa saat Pemroses Pesan masih menulis payload permintaan ke server backend, koneksi ditutup sebelum waktunya oleh server backend. Oleh karena itu, Pemroses Pesan akan menampilkan pengecualian java.io.IOException: Broken pipe.
    • Remote:IP:PORT menunjukkan server backend yang di-resolve Alamat IP dan nomor port.
    • Atribut bytesWritten=76295 dalam pesan error di atas menunjukkan bahwa Pemroses Pesan telah mengirimkan payload 76295 byte ke backend server ketika koneksi tertutup sebelum waktunya.
    • Atribut bytesRead=0 menunjukkan bahwa Pemroses Pesan belum menerima data (respons) dari server backend.
    • Untuk menyelidiki masalah ini lebih lanjut, kumpulkan tcpdump di backend server atau Pemroses Pesan dan analisisnya seperti yang dijelaskan di bawah ini.

Menggunakan tcpdump

  1. Mengambil tcpdump di server backend atau Pemroses Pesan dengan perintah berikut:

    Perintah untuk mengumpulkan tcpdump di server backend:

    tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
    

    Perintah untuk mengumpulkan tcpdump di Pemroses Pesan:

    tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
    
  2. Menganalisis tcpdump yang diambil:

    Contoh output tcpdump (dikumpulkan di Pemroses Pesan):

    alt_text

    Di tcpdump di atas, Anda dapat melihat hal berikut:

    1. Dalam paket 4, Pemroses Pesan mengirim permintaan POST ke server backend.
    2. Dalam paket 5, 8, 9, 10, 11, Pemroses Pesan terus mengirim payload permintaan ke server backend.
    3. Dalam paket 6 dan 7,server backend merespons dengan ACK untuk bagian payload permintaan yang diterima dari Pemroses Pesan.
    4. Namun, dalam paket 12, merespons dengan ACK bukan paket data aplikasi yang diterima dan kemudian merespons dengan memberikan respons payload, server backend akan merespons dengan FIN ACK yang memulai penutupan koneksi.
    5. Contoh ini menunjukkan bahwa server backend menutup koneksi sebelum waktunya saat Pemroses Pesan masih mengirim {i>payload<i} permintaan.
    6. Ini menyebabkan Pemroses Pesan merekam IOException: Broken Pipe error dan menampilkan 503 ke klien

Resolusi

  1. Bekerja samalah dengan salah satu atau kedua tim aplikasi dan jaringan Anda untuk menganalisis dan memperbaiki masalah pemutusan koneksi prematur di sisi server backend.
  2. Pastikan aplikasi server backend tidak mengalami waktu habis atau mereset koneksi sebelum menerima seluruh payload permintaan.
  3. Jika Anda memiliki perangkat atau lapisan jaringan perantara antara Apigee dan server backend, pastikan tidak terjadi time out sebelum seluruh payload permintaan diterima.

Jika masalah masih berlanjut, buka Harus mengumpulkan informasi diagnostik.

Harus mengumpulkan informasi diagnostik

Jika masalah berlanjut bahkan setelah mengikuti instruksi di atas, kumpulkan informasi diagnostik, lalu hubungi Dukungan Apigee Edge:

Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:

  • Nama organisasi
  • Nama lingkungan
  • Nama Proxy API
  • Selesaikan perintah curl untuk mereproduksi error 503
  • File rekaman aktivitas yang berisi permintaan dengan error 503 Service Unavailable
  • Jika error 503 tidak terjadi saat ini, berikan jangka waktu dengan informasi zona waktu saat terjadi error 503 di masa lalu.

Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:

  • Pesan error lengkap yang diamati untuk permintaan yang gagal
  • Nama Proxy Organisasi, Lingkungan, dan Nama Proxy API yang Anda amati 503 error
  • Paket Proxy API
  • File rekaman aktivitas yang berisi permintaan dengan 503 Service Unavailable error
  • Log akses NGINX
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  • Log Pemroses Pesan
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • Jangka waktu dengan informasi zona waktu saat terjadi error 503
  • Tcpdumps dikumpulkan di Pemroses Pesan dan server backend ketika terjadi kesalahan