Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Pola pemutus sirkuit
Niat
Pola pemutus sirkuit dapat mencegah layanan penelepon mencoba kembali panggilan ke layanan lain (callee) ketika panggilan sebelumnya menyebabkan batas waktu atau kegagalan berulang. Pola ini juga digunakan untuk mendeteksi kapan layanan callee berfungsi kembali.
Motivasi
Ketika beberapa layanan mikro berkolaborasi untuk menangani permintaan, satu atau beberapa layanan mungkin menjadi tidak tersedia atau menunjukkan latensi tinggi. Ketika aplikasi kompleks menggunakan layanan mikro, pemadaman dalam satu layanan mikro dapat menyebabkan kegagalan aplikasi. Layanan mikro berkomunikasi melalui panggilan prosedur jarak jauh, dan kesalahan sementara dapat terjadi dalam konektivitas jaringan, menyebabkan kegagalan. (Kesalahan sementara dapat ditangani dengan menggunakan coba lagi dengan pola backoff.) Selama eksekusi sinkron, berjenjang batas waktu atau kegagalan dapat menyebabkan pengalaman pengguna yang buruk.
Namun, dalam beberapa situasi, kegagalan bisa memakan waktu lebih lama untuk diselesaikan — misalnya, ketika layanan callee sedang down atau pertentangan database menghasilkan batas waktu. Dalam kasus seperti itu, jika layanan panggilan mencoba ulang panggilan berulang kali, percobaan ulang ini dapat mengakibatkan pertentangan jaringan dan konsumsi kumpulan thread database. Selain itu, jika beberapa pengguna mencoba ulang aplikasi berulang kali, ini akan memperburuk masalah dan dapat menyebabkan penurunan kinerja di seluruh aplikasi.
Pola pemutus sirkuit dipopulerkan oleh Michael Nygard dalam bukunya, Release It (Nygard 2018). Pola desain ini dapat mencegah layanan penelepon mencoba kembali panggilan layanan yang sebelumnya menyebabkan batas waktu atau kegagalan berulang. Itu juga dapat mendeteksi kapan layanan callee berfungsi kembali.
Benda pemutus sirkuit bekerja seperti pemutus sirkuit listrik yang secara otomatis mengganggu arus ketika ada kelainan pada rangkaian. Pemutus sirkuit listrik mematikan, atau tersandung, aliran arus ketika ada kesalahan. Demikian pula, objek pemutus sirkuit terletak di antara penelepon dan layanan callee, dan tersandung jika panggilan tidak tersedia.
Kekeliruan komputasi terdistribusi
Selama pemadaman jaringan, aplikasi mungkin menunggu balasan tanpa batas waktu dan terus mengkonsumsi sumber daya aplikasi. Kegagalan untuk mencoba kembali operasi ketika jaringan tersedia juga dapat menyebabkan degradasi aplikasi. Jika API panggilan ke database atau layanan eksternal habis karena masalah jaringan, panggilan berulang tanpa pemutus sirkuit dapat mempengaruhi biaya dan kinerja.
Penerapan
Gunakan pola ini ketika:
-
Layanan penelepon membuat panggilan yang kemungkinan besar akan gagal.
-
Latensi tinggi yang ditunjukkan oleh layanan callee (misalnya, ketika koneksi database lambat) menyebabkan batas waktu ke layanan callee.
-
Layanan penelepon membuat panggilan sinkron, tetapi layanan callee tidak tersedia atau menunjukkan latensi tinggi.
Masalah dan pertimbangan
-
Implementasi agnostik layanan: Untuk mencegah pembongkaran kode, kami menyarankan Anda menerapkan objek pemutus sirkuit dengan cara microservice-agnostic dan -driven. API
-
Penutupan sirkuit dengan callee: Ketika callee pulih dari masalah kinerja atau kegagalan, mereka dapat memperbarui status sirkuit ke.
CLOSED
Ini adalah perpanjangan dari pola pemutus sirkuit dan dapat diimplementasikan jika tujuan waktu pemulihan Anda (RTO) membutuhkannya. -
Panggilan multithreaded: Nilai batas waktu kedaluwarsa didefinisikan sebagai periode waktu sirkuit tetap tersandung sebelum panggilan dirutekan lagi untuk memeriksa ketersediaan layanan. Ketika layanan callee dipanggil dalam beberapa utas, panggilan pertama yang gagal menentukan nilai batas waktu kedaluwarsa. Implementasi Anda harus memastikan bahwa panggilan berikutnya tidak memindahkan batas waktu kedaluwarsa tanpa henti.
-
Paksa membuka atau menutup sirkuit: Administrator sistem harus memiliki kemampuan untuk membuka atau menutup sirkuit. Ini dapat dilakukan dengan memperbarui nilai batas waktu kedaluwarsa dalam tabel database.
-
Observabilitas: Aplikasi harus mengatur logging untuk mengidentifikasi panggilan yang gagal saat pemutus sirkuit terbuka.
Implementasi
Arsitektur tingkat tinggi
Dalam contoh berikut, penelepon adalah layanan pesanan dan yang dipanggil adalah layanan pembayaran.
Ketika tidak ada kegagalan, layanan pesanan merutekan semua panggilan ke layanan pembayaran oleh pemutus sirkuit, seperti yang ditunjukkan diagram berikut.
![Pola pemutus sirkuit tanpa kegagalan.](images/circuit-breaker-1.png)
Jika waktu layanan pembayaran habis, pemutus sirkuit dapat mendeteksi batas waktu dan melacak kegagalan.
![Pemutus sirkuit dengan kegagalan layanan pembayaran.](images/circuit-breaker-2.png)
Jika batas waktu melebihi ambang batas yang ditentukan, aplikasi membuka sirkuit. Saat sirkuit terbuka, objek pemutus sirkuit tidak merutekan panggilan ke layanan pembayaran. Ini mengembalikan kegagalan langsung ketika layanan pesanan memanggil layanan pembayaran.
![Pemutus sirkuit berhenti merutekan ke layanan pembayaran.](images/circuit-breaker-3.png)
Objek pemutus sirkuit secara berkala mencoba untuk melihat apakah panggilan ke layanan pembayaran berhasil.
![Pemutus sirkuit secara berkala mencoba kembali layanan pembayaran.](images/circuit-breaker-4.png)
Ketika panggilan ke layanan pembayaran berhasil, sirkuit ditutup, dan semua panggilan lebih lanjut diarahkan ke layanan pembayaran lagi.
![Pemutus sirkuit dengan layanan pembayaran yang berfungsi.](images/circuit-breaker-5.png)
Implementasi menggunakan AWS layanan
Solusi sampel menggunakan alur kerja ekspres AWS Step Functions
Solusinya juga menggunakan tabel Amazon DynamoDB
Ketika sebuah layanan ingin memanggil layanan lain, itu memulai alur kerja dengan nama layanan callee. Alur kerja mendapatkan status pemutus sirkuit dari CircuitStatus
tabel DynamoDB, yang menyimpan layanan yang saat ini terdegradasi. Jika CircuitStatus
berisi catatan yang belum kedaluwarsa untuk callee, sirkuit terbuka. Alur kerja Step Functions mengembalikan kegagalan langsung dan keluar dengan FAIL
status.
Jika CircuitStatus
tabel tidak berisi catatan untuk callee atau berisi catatan kedaluwarsa, layanan akan beroperasi. ExecuteLambda
Langkah dalam definisi mesin status memanggil fungsi Lambda yang dikirim melalui nilai parameter. Jika panggilan berhasil, alur kerja Step Functions keluar dengan status. SUCCESS
![Implementasi pemutus sirkuit dengan AWS Step Functions dan DynamoDB.](images/circuit-breaker-6.png)
Jika panggilan layanan gagal atau batas waktu terjadi, aplikasi mencoba ulang dengan backoff eksponensial untuk beberapa kali yang ditentukan. Jika panggilan layanan gagal setelah percobaan ulang, alur kerja menyisipkan catatan dalam CircuitStatus
tabel untuk layanan dengan anExpiryTimeStamp
, dan alur kerja keluar dengan status. FAIL
Panggilan berikutnya ke layanan yang sama mengembalikan kegagalan langsung selama pemutus sirkuit terbuka. Get Circuit Status
Langkah dalam definisi mesin negara memeriksa ketersediaan layanan berdasarkan ExpiryTimeStamp
nilainya. Item kedaluwarsa dihapus dari CircuitStatus
tabel dengan menggunakan fitur DynamoDB time to live (). TTL
Kode sampel
Kode berikut menggunakan fungsi GetCircuitStatus
Lambda untuk memeriksa status pemutus sirkuit.
var serviceDetails = _dbContext.QueryAsync<CircuitBreaker>(serviceName, QueryOperator.GreaterThan, new List<object> {currentTimeStamp}).GetRemainingAsync(); if (serviceDetails.Result.Count > 0) { functionData.CircuitStatus = serviceDetails.Result[0].CircuitStatus; } else { functionData.CircuitStatus = ""; }
Kode berikut menunjukkan pernyataan Amazon States Language dalam alur kerja Step Functions.
"Is Circuit Closed": { "Type": "Choice", "Choices": [ { "Variable": "$.CircuitStatus", "StringEquals": "OPEN", "Next": "Circuit Open" }, { "Variable": "$.CircuitStatus", "StringEquals": "", "Next": "Execute Lambda" } ] }, "Circuit Open": { "Type": "Fail" }
GitHub repositori
Untuk implementasi lengkap arsitektur sampel untuk pola ini, lihat GitHub repositori di. https://github.com/aws-samples/circuit-breaker-netcore-blog