Pemutus sirkuit melindungi sistem Anda saat kinerja backend menurun. Konfigurasikan kondisi trip, durasi terbuka, dan backend fallback untuk instans khusus.
Batasan
-
Hanya berlaku untuk instans khusus.
-
Maksimum 512 karakter per ekspresi.
-
Ukuran maksimum konfigurasi plug-in: 50 KB.
1. Ikhtisar
Secara default, jika terjadi 1.000 timeout pada backend API dalam waktu 30 detik, pemutus sirkuit akan trip dan memasuki status terbuka selama 90 detik. Selama periode ini, semua permintaan mengembalikan Status=503 dengan kode kesalahan X-Ca-Error-Code=D503CB. Setelah 90 detik, pemutus sirkuit memasuki status half-open dan mengizinkan sejumlah kecil permintaan lewat. Jika backend pulih, pemutus sirkuit menutup dan permintaan dilanjutkan secara normal.
Pada dedicated instance, circuit breaker plugin memungkinkan Anda menyesuaikan pengaturan circuit breaker berikut:
-
Kondisi trip: pemutus sirkuit trip ketika jumlah timeout atau kesalahan tertentu pada backend melebihi ambang batas dalam rentang waktu tertentu.
-
Rentang waktu evaluasi untuk kondisi trip.
-
Durasi terbuka setelah pemutus sirkuit trip.
-
Backend fallback untuk permintaan saat pemutus sirkuit dalam status terbuka.
2. Konfigurasi
Konfigurasi plug-in pemutus sirkuit hanya berlaku untuk API pada instans khusus. Pada instans serverless, konfigurasi pemutus sirkuit default tetap digunakan meskipun plug-in telah diikat ke API.
2.1 Mengonfigurasi kebijakan degradasi berdasarkan timeout backend
Konfigurasikan kebijakan degradasi berdasarkan timeout backend. Permintaan dianggap sebagai timeout jika backend tidak memberikan respons dalam periode timeout yang ditentukan oleh API.
timeoutThreshold: 15 # Ambang batas jumlah kejadian timeout di backend.
windowInSeconds: 30 # Rentang waktu selama jumlah kejadian timeout di backend diperiksa oleh pemutus sirkuit untuk menentukan apakah akan trip.
openTimeoutSeconds: 15 # Durasi pemutus sirkuit tetap terbuka setelah trip.
downgradeBackend: # Backend tujuan permintaan API saat pemutus sirkuit terbuka.
type: mock
statusCode: 418
Bidang:
-
timeoutThreshold: jumlah timeout backend yang memicu pemutus sirkuit. Nilai maksimum: 5.000. Nilai yang terlalu kecil dapat menyebabkan trip terlalu sering. -
windowInSeconds: rentang waktu evaluasi. Nilai valid: 10 hingga 90. Satuan: detik. -
openTimeoutSeconds: durasi pemutus sirkuit tetap terbuka. Nilai valid: 15 hingga 300. Satuan: detik. -
downgradeBackend: opsional. Backend fallback yang digunakan saat pemutus sirkuit terbuka.
2.2 Mengonfigurasi kebijakan degradasi berdasarkan waktu respons backend
Konfigurasikan kebijakan degradasi berdasarkan waktu respons backend, diukur sejak gerbang mengirim permintaan hingga menerima respons.
errorThreshold: 10 # Ambang batas jumlah kejadian respons lambat di backend.
windowInSeconds: 60 # Rentang waktu selama jumlah kejadian respons lambat di backend diperiksa oleh pemutus sirkuit untuk menentukan apakah akan trip.
openTimeoutSeconds: 120 # Durasi pemutus sirkuit tetap terbuka setelah trip.
errorCondition: "$LatencyMilliSeconds > 500" # Ekspresi kondisional yang digunakan untuk menentukan apakah respons backend dihitung sebagai respons lambat. Dalam contoh ini, jika waktu respons backend melebihi 500 ms, respons tersebut dianggap lambat.
downgradeBackend: # Backend tujuan permintaan API saat pemutus sirkuit terbuka.
type: mock
statusCode: 403
Bidang:
-
errorThreshold: jumlah respons lambat yang memicu pemutus sirkuit. -
windowInSeconds: rentang waktu evaluasi. Nilai valid: 10 hingga 90. Satuan: detik. -
openTimeoutSeconds: durasi pemutus sirkuit tetap terbuka. Nilai valid: 15 hingga 300. Satuan: detik. -
errorCondition: ekspresi yang mendefinisikan respons lambat. Variabel yang tersedia:$LatencyMilliSeconds(milidetik) dan$LatencySeconds(detik). -
downgradeBackend: opsional. Backend fallback yang digunakan saat pemutus sirkuit terbuka.
2.3 Mengonfigurasi kebijakan degradasi berdasarkan kode kesalahan backend
Konfigurasikan kebijakan degradasi berdasarkan kode kesalahan backend.
errorCondition: "$StatusCode == 503" # Ekspresi kondisional yang menentukan kesalahan yang jumlah kemunculannya diperiksa oleh pemutus sirkuit untuk menentukan apakah akan trip.
errorThreshold: 1000 # Ambang batas jumlah kemunculan kesalahan yang ditentukan.
windowInSeconds: 30 # Rentang waktu selama jumlah kemunculan kesalahan yang ditentukan di backend diperiksa oleh pemutus sirkuit untuk menentukan apakah akan trip.
openTimeoutSeconds: 15 # Durasi pemutus sirkuit tetap terbuka setelah trip.
downgradeBackend: # Backend tujuan permintaan API saat pemutus sirkuit terbuka.
type: "HTTP"
address: "http://api.foo.com"
path: "/system-busy.json"
method: GET
-
errorCondition: ekspresi kesalahan. Variabel yang tersedia:$StatusCode(kode respons) dan$LatencySeconds(latensi dalam detik).-
Sebagai contoh, ekspresi
$StatusCode = 503 or $StatusCode = 504bernilai true jika kode status respons backend adalah 503 atau 504. -
Sebagai contoh,
$LatencySeconds > 30menunjukkan bahwa waktu tunggu melebihi 30 detik.
-
-
errorThreshold: jumlah kesalahan yang sesuai yang memicu pemutus sirkuit. -
windowsInSeconds: jendela waktu evaluasi. Nilai yang valid: 10 hingga 90. Satuan: detik. -
openTimeoutSeconds: durasi pemutus sirkuit tetap terbuka. Nilai valid: 15 hingga 300. Satuan: detik. -
downgradeBackend: opsional. Backend fallback yang digunakan saat pemutus sirkuit terbuka.
2.4 Kontrol status akurat
API Gateway berjalan pada beberapa node kluster, masing-masing mempertahankan status pemutus sirkuitnya sendiri. Hal ini dapat menyebabkan ketidakkonsistenan status antar node. Untuk mengaktifkan status pemutus sirkuit yang konsisten secara global, tambahkan bidang useGlobalState ke konfigurasi plug-in Anda:
---
timeoutThreshold: 15 # Ambang batas jumlah kejadian timeout di backend.
windowInSeconds: 30 # Rentang waktu selama jumlah kejadian timeout di backend diperiksa oleh pemutus sirkuit untuk menentukan apakah akan trip.
openTimeoutSeconds: 15 # Durasi pemutus sirkuit tetap terbuka setelah trip.
useGlobalState: true # Kontrol status akurat diaktifkan.
downgradeBackend: # Backend tujuan permintaan API saat pemutus sirkuit terbuka.
type: mock
statusCode: 302
body: |
<result>
<errorCode>I's a teapot</errorCode>
</result>
Nilai default useGlobalState adalah false. Menyetelnya ke true mengaktifkan status akurat dengan sedikit overhead performa, yang tidak memengaruhi QPS dan SLA yang dijamin oleh instans Anda.
2.5 Mengonfigurasi kebijakan degradasi berdasarkan persentase
Pemutus sirkuit trip ketika salah satu dari empat kondisi berikut terpenuhi. Semua kondisi memiliki prioritas yang sama.
-
errorThreshold: jumlah kesalahan backend (yang sesuai denganerrorCondition) yang memicu pemutus sirkuit. -
timeoutThreshold: jumlah timeout backend yang memicu pemutus sirkuit. -
errorThresholdByPercent: ambang batas laju kesalahan, dievaluasi terhadap laju kesalahan pada rentang waktu sebelumnya. -
timeoutThresholdByPercent: ambang batas laju timeout sebagai persentase dari total permintaan dalam rentang waktu.
Contoh:
---
windowInSeconds: 3 # Rentang waktu selama pemutus sirkuit menentukan apakah akan trip. Nilai valid: 10 hingga 90. Satuan: detik.
openTimeoutSeconds: 3
errorThreshold: 90 # Ambang batas jumlah kemunculan kesalahan yang ditentukan.
timeoutThreshold: 90 # Ambang batas jumlah kemunculan timeout.
errorThresholdByPercent: 20 # Ambang batas persentase permintaan yang mengalami kesalahan tertentu terhadap total permintaan.
timeoutThresholdByPercent: 20 # Ambang batas persentase permintaan yang mengalami timeout terhadap total permintaan.
errorCondition: "$StatusCode = 500" # Kondisi kesalahan.
downgradeBackend:
type: mock
statusCode: 418
body: |
<result>
<errorCode>I's a teapot</errorCode>
</result>
-
Ambang batas persentase memerlukan minimal 100 permintaan dalam rentang waktu agar berlaku.
-
Dalam contoh ini,
errorThreshold: 90dantimeoutThreshold: 90menyebabkan pemutus sirkuit trip jika jumlah kesalahan atau timeout melebihi 90 dalam rentang waktu. -
errorThresholdByPercent: 20dantimeoutThresholdByPercent: 20memicu pemutus sirkuit jika rentang waktu sebelumnya memiliki minimal 100 permintaan dan laju kesalahan atau timeout melebihi 20%. -
Kebijakan timeout berbasis persentase didukung mulai versi Juni 2023.
2.6 Membatasi laju permintaan saat pemutus sirkuit trip
Saat pemutus sirkuit trip, konfigurasi pembatasan laju temporary diterapkan pada seluruh traffic selama pemutus sirkuit dalam status terbuka atau half-open:
---
windowInSeconds: 1 # Rentang waktu selama pemutus sirkuit memeriksa jumlah kejadian timeout di backend.
openTimeoutSeconds: 15 # Durasi pemutus sirkuit tetap terbuka setelah trip.
errorThreshold: 3
errorCondition: "$LatencyMilliSeconds > 1"
downgradeTrafficLimit: # Backend tujuan permintaan API saat pemutus sirkuit terbuka.
limit: 2
period: MINUTE
3. Konfigurasi backend fallback
Gunakan downgradeBackend untuk menentukan backend fallback saat pemutus sirkuit terbuka. Konfigurasi backend harus sesuai dengan format spesifikasi API yang digunakan di API Gateway (Impor file Swagger untuk membuat API dengan ekstensi API Gateway). Jenis backend berikut didukung:
-
Backend HTTP
---
backend:
type: HTTP
address: "http://10.10.100.2:8000"
path: "/users/{userId}"
method: GET
timeout: 7000
-
Backend HTTP (VPC)
---
backend:
type: HTTP-VPC
vpcAccessName: vpcAccess1
path: "/users/{userId}"
method: GET
timeout: 10000
-
Function Compute
---
backend:
type: FC
fcRegion: cn-shanghai
serviceName: fcService
functionName: fcFunction
arn: "acs:ram::111111111:role/aliyunapigatewayaccessingfcrole"
-
MOCK
---
backend:
type: MOCK
mockResult: "mock result sample"
mockStatusCode: 200
mockHeaders:
- name: Content-Type
value: text-plain
- name: Content-Language
value: zhCN
4. Kode kesalahan
|
Kode kesalahan |
Kode status HTTP |
Pesan |
Deskripsi |
|
D503BB |
503 |
Backend circuit breaker busy |
API dilindungi oleh pemutus sirkuitnya. |
|
D503CB |
503 |
Backend circuit breaker open, ${Reason} |
Pemutus sirkuit dalam status terbuka. Periksa kinerja backend sebelum menguji ulang panggilan API. |