Anda sedang melihat dokumentasi Apigee Edge.
Buka
dokumentasi Apigee X. info
Gejala
Aplikasi klien mendapatkan status respons HTTP 503
dengan pesan
Service Unavailable
mengikuti 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 yang berlaku untuk |
---|---|---|
Server target menutup koneksi lebih awal | Server target mengakhiri koneksi lebih awal saat Pemroses Pesan masih mengirim payload permintaan. | Pengguna Edge Publik dan Private Cloud |
Langkah-langkah diagnosis umum
Menentukan ID Pesan dari permintaan yang gagal
Alat pelacak
Untuk menentukan ID pesan dari permintaan yang gagal menggunakan alat Trace:
- Jika masalah masih aktif, aktifkan sesi rekaman aktivitas untuk API yang terpengaruh.
- Lakukan panggilan API dan rekonstruksi masalah -
503 Service Unavailable
dengan kode errormessaging.adaptors.http.flow.ServiceUnavailable.
- Pilih salah satu permintaan yang gagal.
- Pilih fase AX, dan tentukan ID pesan
(
X-Apigee.Message-ID
) dari permintaan tersebut dengan men-scroll ke bawah di bagian Phase Details seperti ditunjukkan dalam gambar berikut.
Log akses NGINX
Untuk menentukan ID pesan dari permintaan yang gagal menggunakan log akses NGINX:
Anda juga dapat melihat log Akses NGINX guna menentukan ID pesan untuk error 503
.
Cara ini sangat berguna jika masalah pernah terjadi sebelumnya, atau jika masalah hanya sesekali
dan Anda tidak dapat menangkap rekaman aktivitas di UI. Gunakan langkah-langkah berikut untuk menentukan informasi ini dari log akses NGINX:
- Periksa log akses NGINX: (
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
) - Telusuri untuk melihat apakah ada Error
503
untuk proxy API tertentu selama durasi tertentu (jika masalah terjadi sebelumnya) atau apakah ada permintaan yang masih gagal dengan503
. - Jika terdapat Error
503
dengan X-Apigee-fault-code messaging.adaptors.http.flow.Service nonaktif, catat ID pesan untuk satu atau beberapa permintaan seperti yang ditunjukkan pada contoh berikut:Contoh Entri yang menampilkan Error
503
Penyebab: Server target menutup koneksi lebih awal
Diagnosis
- Jika Anda adalah pengguna Cloud Publik atau Private Cloud:
- Gunakan Alat Pelacakan (seperti yang dijelaskan dalam Langkah-langkah diagnosis umum)
dan pastikan Anda telah menetapkan kedua hal berikut di panel Analytics Data Recorded:
- X-Apigee.fault-code:
messaging.adaptors.http.flow.ServiceUnavailable
- X-Apigee.fault-source:
target
- X-Apigee.fault-code:
- Gunakan alat Trace (seperti yang dijelaskan dalam Langkah-langkah diagnosis umum)
dan pastikan kedua hal berikut telah ditetapkan di panel Error tepat setelah
properti status
TARGET_REQ_FLOW
:- error.class:
com.apigee.errors.http.server.ServiceUnavailableException
- error.cause:
Broken pipe
- error.class:
- Buka Menggunakan tcpdump untuk penyelidikan lebih lanjut.
- Gunakan Alat Pelacakan (seperti yang dijelaskan dalam Langkah-langkah diagnosis umum)
dan pastikan Anda telah menetapkan kedua hal berikut di panel Analytics Data Recorded:
- Jika Anda adalah pengguna Private Cloud:
- Tentukan ID pesan dari permintaan yang gagal.
- Telusuri ID pesan di log Message Processor (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Anda akan melihat salah satu pengecualian berikut:
Pengecualian #1: java.io.IOException: Terjadi error pipe 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: Broken pipe2021-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 meskipun 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 alamat IP dan nomor port server backend yang di-resolve.- Atribut
bytesWritten=76295
dalam pesan error di atas menunjukkan bahwa Pemroses Pesan telah mengirimkan payload sebesar76295
byte ke server backend saat koneksi ditutup sebelum waktunya. - Atribut
bytesRead=0
menunjukkan bahwa Pemroses Pesan belum menerima data apa pun (respons) dari server backend. - Untuk menyelidiki masalah ini lebih lanjut, kumpulkan
tcpdump
di server backend atau Message Processor dan analisis seperti yang dijelaskan di bawah.
Menggunakan {i>tcpdump<i}
-
Ambil
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
- Analisis
tcpdump
yang ditangkap:Contoh output tcpdump (dikumpulkan di Prosesor Pesan):
Dalam
tcpdump
di atas, Anda dapat melihat hal berikut:- Dalam paket
4
, Pemroses Pesan mengirim permintaanPOST
ke server backend. - Dalam paket
5
,8
,9
,10
,11
, Pemroses Pesan terus mengirim payload permintaan ke server backend. - Dalam paket
6
dan7
,server backend merespons denganACK
untuk sebagian payload permintaan yang diterima dari Pemroses Pesan. - Namun, dalam paket
12
, server backend akan merespons denganFIN ACK
yang memulai penutupan koneksi, bukan denganACK
untuk paket data aplikasi yang diterima lalu merespons dengan payload respons. - Hal ini menunjukkan dengan jelas bahwa server backend menutup koneksi lebih awal saat Pemroses Pesan masih mengirim payload permintaan.
- Hal ini menyebabkan Prosesor Pesan mencatat error
IOException: Broken Pipe
dan menampilkan503
ke klien
- Dalam paket
Resolusi
- Bekerja samalah dengan salah satu atau tim aplikasi dan jaringan Anda untuk menganalisis dan memperbaiki masalah pemutusan koneksi prematur di sisi server backend.
- Pastikan bahwa aplikasi server backend tidak kehabisan waktu atau mereset koneksi sebelum menerima seluruh payload permintaan.
- Jika Anda memiliki lapisan atau perangkat jaringan perantara antara Apigee dan server backend, pastikan bahwa waktu tidak habis sebelum seluruh payload permintaan diterima.
Jika masalah masih berlanjut, buka Harus mengumpulkan informasi diagnostik.
Harus mengumpulkan informasi diagnostik
Jika masalah berlanjut bahkan setelah mengikuti petunjuk di atas, kumpulkan informasi diagnostik berikut, 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 error503
- 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 error503
terjadi di masa lalu.
Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:
- Pesan error lengkap yang diamati untuk permintaan yang gagal
- Organisasi, Nama Lingkungan, dan nama Proxy API yang Anda amati error
503
-nya - Paket Proxy API
- File rekaman aktivitas yang berisi permintaan dengan error
503 Service Unavailable
- 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 error
503
terjadi Tcpdumps
mengumpulkan di Pemroses Pesan dan server backend saat error terjadi