Pola pemutus sirkuit - AWS Bimbingan Preskriptif

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 adalah serangkaian pernyataan yang dibuat oleh Peter Deutsch dan lainnya di Sun Microsystems. Mereka mengatakan bahwa programmer yang baru mengenal aplikasi terdistribusi selalu membuat asumsi yang salah. Keandalan jaringan, ekspektasi latensi nol, dan keterbatasan bandwidth menghasilkan aplikasi perangkat lunak yang ditulis dengan penanganan kesalahan minimal untuk kesalahan jaringan.

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.

Jika waktu layanan pembayaran habis, pemutus sirkuit dapat mendeteksi batas waktu dan melacak kegagalan.

Pemutus sirkuit dengan kegagalan layanan pembayaran.

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.

Objek pemutus sirkuit secara berkala mencoba untuk melihat apakah panggilan ke layanan pembayaran berhasil.

Pemutus sirkuit secara berkala mencoba kembali layanan pembayaran.

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.

Implementasi menggunakan AWS layanan

Solusi sampel menggunakan alur kerja ekspres AWS Step Functionsuntuk mengimplementasikan pola pemutus sirkuit. Mesin status Step Functions memungkinkan Anda mengonfigurasi kemampuan coba ulang dan alur kontrol berbasis keputusan yang diperlukan untuk implementasi pola.

Solusinya juga menggunakan tabel Amazon DynamoDB sebagai penyimpanan data untuk melacak status sirkuit. Ini dapat diganti dengan datastore dalam memori seperti Amazon ElastiCache (RedisOSS) untuk kinerja yang lebih baik.

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. ExecuteLambdaLangkah 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.

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 StatusLangkah 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

Referensi blog

Konten terkait