Mengurai Ketersediaan Tinggi Microservices: Menjelajahi Strategi API Governance dengan Apache APISIX
March 29, 2024
Pendahuluan
Arsitektur Microservices telah menjadi pilihan utama dalam arsitektur IT saat ini. Fleksibilitas dan skalabilitasnya memudahkan perusahaan untuk menghadapi kebutuhan bisnis yang berubah dengan cepat. Namun, memastikan ketersediaan tinggi dari microservices telah menjadi masalah kunci dalam desain arsitektur. Dalam konteks ini, tiga strategi inti dalam tata kelola layanan API — pembatasan laju (rate limiting), pemutusan sirkuit (circuit breaking), dan degradasi — menjadi sangat penting.
Sebagai komponen dasar yang esensial dalam arsitektur microservices, gateway API memainkan peran penting dalam tata kelola layanan. Apache APISIX, sebagai gateway API cloud-native generasi baru, tidak hanya memiliki kemampuan kinerja tinggi dan keamanan, tetapi juga menyediakan berbagai fungsi manajemen lalu lintas. Dalam pembahasan berikut, kita akan mendalami "pendekatan tiga arah" dalam tata kelola layanan API dan memberikan wawasan mendetail tentang bagaimana menerapkan strategi ini di APISIX untuk memastikan ketersediaan tinggi layanan kita.
Strategi Tata Kelola API
Pembatasan Laju (Rate Limiting)
Pembatasan laju, sesuai namanya, adalah mekanisme pembatasan yang diterapkan pada lalu lintas. Prinsip utamanya adalah mencegah kelebihan beban sistem atau bahkan kerusakan yang disebabkan oleh lalu lintas yang berlebihan. Konsep dasarnya terletak pada pengaturan volume permintaan dalam interval waktu tertentu, hanya mengizinkan permintaan yang memenuhi batasan tertentu untuk mengakses sistem, sehingga memastikan operasi stabil dari microservices dan seluruh sistem. Dalam skenario kehidupan nyata, konsep pembatasan laju juga terlihat jelas. Misalnya, selama jam sibuk di stasiun kereta bawah tanah, beberapa pintu akses disiapkan untuk pemeriksaan keamanan guna mengarahkan antrian yang teratur dan lancar.
Pembatasan laju dapat diimplementasikan dengan berbagai cara, termasuk:
-
Berdasarkan jumlah permintaan: Melacak jumlah permintaan dalam setiap periode waktu dan membatasinya dalam ambang batas tertentu. Misalnya, memproses maksimal 100 permintaan per detik.
-
Berdasarkan frekuensi permintaan: Membatasi frekuensi permintaan per klien atau alamat IP untuk mencegah jumlah permintaan yang berlebihan. Misalnya, mengizinkan maksimal 10 permintaan per menit.
-
Berdasarkan jumlah koneksi: Membatasi jumlah koneksi simultan yang dibuat untuk menghindari konsumsi sumber daya sistem yang berlebihan. Misalnya, mengizinkan maksimal 100 koneksi simultan.
Strategi pembatasan laju yang berbeda memungkinkan kita untuk memenuhi berbagai kebutuhan skenario. Misalnya, untuk sumber daya API yang berharga, kita dapat membatasi jumlah permintaan menjadi 10 per menit. Atau, untuk meningkatkan ketersediaan layanan, kita dapat membatasi jumlah permintaan bersamaan untuk mengurangi waktu respons layanan, di antara skenario lainnya. Implementasi yang tepat dari strategi pembatasan laju ini dapat membantu memastikan operasi normal layanan di bawah beban tinggi dan lonjakan lalu lintas yang tiba-tiba.
Pemutusan Sirkuit (Circuit Breaking)
Dalam arsitektur microservices, mungkin ada situasi di mana layanan saling memanggil. Begitu satu layanan gagal, hal ini dapat memengaruhi layanan lain, atau bahkan menyebabkan keruntuhan seluruh sistem, fenomena yang secara gamblang disebut sebagai "kegagalan berantai" atau "efek longsoran." Mekanisme pemutusan sirkuit, sebagai tindakan perlindungan terhadap kegagalan berantai dalam microservices, digunakan untuk mencegah penyebaran kegagalan. Ketika sebuah microservice mengalami kelainan atau penundaan, pemutus sirkuit akan segera dipicu dengan sementara memblokir permintaan ke layanan tersebut, sehingga memastikan stabilitas seluruh sistem tidak terganggu.
Prinsip inti dari mekanisme pemutusan sirkuit terletak pada pemantauan waktu respons layanan atau tingkat kesalahan secara real-time. Begitu metrik ini melebihi ambang batas yang telah ditetapkan, pemutus sirkuit secara otomatis akan terpicu, dengan cepat menghentikan permintaan ke layanan yang bermasalah hingga layanan tersebut kembali beroperasi normal. Setelah layanan stabil, pemutus sirkuit secara otomatis menutup, memulihkan akses ke layanan tersebut. Mekanisme ini mirip dengan resistor dalam rangkaian listrik. Ketika tegangan melebihi rentang toleransinya, resistor secara otomatis memutus rangkaian untuk mencegah arus berlebihan yang dapat merusak komponen elektronik lainnya. Setelah memeriksa dan memperbaiki rangkaian, resistor menutup kembali, dan rangkaian kembali beroperasi normal.
Dengan memperkenalkan mekanisme pemutusan sirkuit, arsitektur microservices dapat lebih baik menghadapi potensi masalah kegagalan berantai yang timbul dari saling panggilan layanan, memastikan stabilitas dan keandalan sistem, terutama dalam skenario tekanan tinggi.
Degradasi
Degradasi, sebagai strategi efektif untuk mengatasi beban sistem yang tinggi, melibatkan penonaktifan sementara beberapa fungsi non-kritis atau pengurangan kualitas beberapa layanan secara moderat untuk memastikan operasi stabil dari keseluruhan sistem. Dalam arsitektur microservices, penerapan mekanisme degradasi dapat secara cerdas menonaktifkan beberapa fungsi non-inti atau sementara tidak diperlukan, sehingga memastikan operasi yang terus-menerus dan stabil dari fungsi inti. Misalnya, dalam aplikasi konferensi video, ketika bandwidth jaringan terbatas, kita dapat mengurangi kualitas transmisi video atau sementara menonaktifkan fungsi video untuk memastikan panggilan audio yang jelas dan stabil, sehingga memenuhi kebutuhan komunikasi dasar dari pertemuan tersebut.
Strategi umum meliputi:
-
Degradasi fungsi: Sementara menutup atau membatasi akses ke beberapa fungsi untuk memastikan operasi normal dari layanan inti. Misalnya, aplikasi media sosial mungkin sementara menonaktifkan fungsi "suka" atau "komentar" selama jam sibuk untuk memastikan pengguna dapat menjelajahi konten secara normal.
-
Degradasi kualitas: Selama beban sistem tinggi, menurunkan persyaratan kualitas dari beberapa layanan atau fungsi. Misalnya, seperti yang disebutkan sebelumnya, mengurangi kejelasan video atau frame rate untuk memastikan komunikasi yang lancar.
Pembatasan Laju, Pemutusan Sirkuit, dan Degradasi di APISIX
Bagaimana kita dapat memanfaatkan tiga strategi utama yang diaktifkan di APISIX untuk meningkatkan ketersediaan tinggi microservices? Berikut adalah beberapa contoh aplikasi umum untuk ilustrasi.
Pembatasan Laju dengan Plugin limit-count
APISIX menyediakan berbagai plugin manajemen lalu lintas bawaan seperti limit-count, limit-req, dan limit-conn. Bergantung pada kebutuhan aktual, kita dapat memilih metode yang sesuai untuk pengendalian lalu lintas. Mengambil plugin limit-count sebagai contoh, plugin ini membatasi jumlah total permintaan dalam interval waktu tertentu dan mengembalikan jumlah permintaan yang tersisa dalam header HTTP.
curl -i http://127.0.0.1:9080/apisix/admin/routes/1 \ -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/get", "plugins": { "limit-count": { "count": 3, "time_window": 60, "rejected_code": 429, "key_type": "var", "key": "remote_addr" } }, "upstream": { "type": "roundrobin", "nodes": { "httpbin.org:80": 1 } } }'
Pemutusan Sirkuit dengan Plugin api-breaker
Plugin api-breaker di APISIX secara otomatis memicu mekanisme pemutusan sirkuit berdasarkan ambang batas yang telah ditetapkan untuk mencegah kegagalan berantai. Misalnya, plugin ini dapat memulai pemutusan sirkuit ketika layanan upstream mengembalikan 3 status kode 500 atau 503 berturut-turut dan melanjutkan akses ketika status kode 200 diterima.
curl "http://127.0.0.1:9180/apisix/admin/routes/1" \ -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "api-breaker": { "break_response_code": 502, "unhealthy": { "http_statuses": [500, 503], "failures": 3 }, "healthy": { "http_statuses": [200], "successes": 1 } } }, "upstream": { "type": "roundrobin", "nodes": { "httpbin.org:80": 1 } }, "uri": "/get", }'
Degradasi dengan Plugin fault-injection
Plugin fault-injection dan mocking di APISIX mendukung pengaturan strategi degradasi untuk sementara menonaktifkan beberapa fungsi atau langsung mengembalikan data yang telah ditetapkan selama beban sistem tinggi, memastikan stabilitas sistem. Misalnya, plugin fault-injection dapat langsung mengembalikan kode status HTTP dan nilai body yang ditentukan ke klien.
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "fault-injection": { "abort": { "http_status": 200, "body": "Fault Injection!" } } }, "upstream": { "nodes": { "httpbin.org:80": 1 }, "type": "roundrobin" }, "uri": "/get" }'
Kesimpulan
Pembatasan laju, pemutusan sirkuit, dan degradasi, sebagai langkah penting dalam tata kelola layanan dalam arsitektur microservices, memainkan peran yang tak tergantikan dalam meningkatkan ketersediaan tinggi microservices. Mereka bertindak sebagai perisai yang kokoh, melindungi arsitektur microservices dari berbagai risiko dan tantangan potensial. Menghadapi berbagai skenario bisnis, kita harus fleksibel dan hati-hati dalam menerapkan langkah-langkah ini untuk memastikan stabilitas dan keandalan arsitektur microservices terlindungi secara optimal.