Salah satu tantangan terbesar dalam sistem modern adalah beroperasi dalam skala. Ketika sistem tumbuh, mereka harus memenuhi meningkatnya permintaan untuk ketersediaan tinggi, skalabilitas, dan ketahanan. Untuk memenuhi kebutuhan ini, kami mengandalkan teknik seperti penskalaan horizontal dan vertikal, caching, dan redundansi. Namun, memperlakukan layanan sebagai satu unit memperkenalkan risiko – ada bug perangkat lunak atau kesalahan operasional dapat menurunkan seluruh sistem, yang dapat menjadi bencana. Dalam artikel ini, kami mengeksplorasi arsitektur berbasis sel, pendekatan desain yang meningkatkan ketahanan, meningkatkan ketersediaan, dan memungkinkan skalabilitas yang hampir tidak terbatas.
Mengapa mengadopsi arsitektur berbasis sel penting?
Dengan mengadopsi arsitektur sel dalam sistem terdistribusi, Anda akan menikmati:
-
Ketersediaan tinggi: Sel meningkatkan ketersediaan sistem karena mengurangi kemungkinan kegagalan. Suatu sistem dengan sel N akan memiliki n kali lebih banyak peristiwa kegagalan, tetapi masing -masing dengan 1/n dampak.
-
Skalabilitas tinggi: Arsitektur berbasis sel memungkinkan penskalaan horizontal, memungkinkan layanan untuk meningkatkan daripada naik. Ini membuatnya sangat efektif dalam skenario di mana batas kuota pada layanan dependen menjadi hambatan.
-
Ketahanan sistem: Sel adalah gambar layanan mandiri, dengan demikian, masalah atau pemadaman layanan dalam satu sel tidak berdampak pada sel lain. Desain ini juga membantu meningkatkan waktu rata -rata antara kegagalan dan mempersingkat waktu rata -rata untuk pemulihan.
-
Penyebaran yang lebih aman: Sel-sel mempromosikan penyebaran fase-bijaksana dan mengurangi jari-jari ledakan dari penyebaran yang bermasalah. Penyebaran layanan lebih aman ketika kami menggunakan pendekatan penyebaran fase-bijaksana.
Apa itu arsitektur berbasis sel?
Dalam arsitektur berbasis sel, sebuah layanan terdiri dari dua hal:
-
Banyak sel, di mana setiap sel memiliki gambar yang sama dari layanan Anda, replika lengkap layanan Anda dengan semua dependensi, dan
-
lapisan perutean untuk merutekan lalu lintas ke sel khusus. Permintaan pelanggan akan masuk ke sel khusus berdasarkan algoritma routing atau struktur pemetaan. Di bawah ini adalah contoh untuk membantu menggambarkan hal ini.
Pertimbangkan perangkat seluler Anda yang terhubung ke menara seluler. Menara ini melayani perangkat dalam kisaran terbatas. Jika fungsi menara lain, itu tidak memengaruhi layanan seluler Anda karena setiap menara membentuk sel khusus. Selain itu, jika menara Anda menghadapi masalah apa pun seperti pemadaman, perangkat seluler akan terhubung kembali ke menara terdekat lainnya. Ini memastikan layanan yang tidak terputus, yang mengarah pada ketersediaan & ketahanan layanan yang ditingkatkan.
Arsitektur berbasis sel dalam perangkat lunak bekerja sama. Mereka melayani pengguna terbatas, mengurangi degradasi layanan, dan membantu mencapai skalabilitas tinggi. Diagram di bawah ini menggambarkan contoh dunia nyata dari arsitektur sel.
Desain Arsitektur Berbasis Sel
Seperti dibahas di bagian sebelumnya, layanan terdiri dari:
-
banyak sel dan
-
lapisan perutean.
Desain arsitektur sel tampak cukup mudah. Namun, banyak faktor membuatnya menantang dan membutuhkan penerapan teknik secara bijaksana. Di dunia nyata, sebagian besar layanan tidak dirancang berdasarkan sel dari awal. Mereka berevolusi saat mereka tumbuh, dan pada satu titik, ketika mereka tidak dapat ditingkatkan lebih lanjut, kami mengadopsi arsitektur sel. Itu selalu bagus untuk menggabungkan pendekatan ini sejak hari pertama merancang layanan Anda, yang menyelamatkan kami dari masalah penskalaan dan tantangan arsitektur ulang seperti migrasi, kompatibilitas mundur, dan operasi layanan. Di bawah ini adalah desain tingkat tinggi dari arsitektur layanan berbasis sel.
Mari kita lihat blok bangunan arsitektur berbasis sel.
Sel
Sel adalah instance dari layanan Anda yang terdiri dari:
-
Semua ketergantungan dan interkoneksi mereka.
-
Penyimpanan – Ini memiliki kapasitas maksimum yang tetap, misalnya, dapat melayani maksimum 1000 pelanggan. Untuk melayani peningkatan permintaan, cukup putar sel baru.
Diagram di bawah ini menunjukkan layanan dengan semua dependensi (dan tanpa sel). Ini masih merupakan layanan yang dapat diskalakan yang menggunakan penskalaan horizontal/vertikal, caching, dll.
Di bawah ini adalah arsitektur seluler dari layanan yang sama. Kami memiliki replika layanan yang sama dalam dua sel (akun) dengan semua dependensi. Permintaan ke layanan dialihkan ke salah satu sel berdasarkan algoritma routing.
Lapisan perutean
Ini adalah lapisan tipis yang menangani perutean permintaan. Ini memetakan permintaan pelanggan ke sel khusus. Misalnya, Anda dapat memiliki operasi modulo pada nilai hash dari permintaan untuk merutekan permintaan. Biasanya, kami menjaga lapisan ini seringan mungkin sehingga kami tidak menyebabkan latensi dan kegagalan dalam pemrosesan permintaan.
Routing Key dan algoritma
Kunci perutean adalah dimensi di mana sel dialokasikan. Itu bisa userId
, accountId
atau hash kombinasi bidang dalam permintaan. Disarankan untuk menggunakan atribut yang didistribusikan dengan baik untuk kunci perutean.
Algoritma perutean dapat sesederhana operasi modulo untuk pencarian database. Beberapa algoritma yang dapat Anda gunakan adalah sebagai berikut:
- Pemetaan Modulo: Gunakan operator modular untuk memetakan kunci ke sel.
int getCell(int routingKey) {
return routingKey / getNumberOfCell();
}
int getCell(int routingKey) {
return consistentHash(routingKey, getNumberOfCell());
}
- Pemetaan meja: Gunakan tabel pemetaan yang memetakan tombol routing ke sel.
Pendekatan yang paling umum adalah hashing dan pemetaan tabel. Pemetaan tabel memungkinkan Anda untuk mengganti peta. Namun, ia datang dengan tantangan menyegarkan peta sebagai, dan ketika, jumlah sel perubahan dalam arsitektur kami. Kami juga dapat menggunakan algoritma routing sel untuk mendedikasikan sel untuk pelanggan besar atau lingkungan pengujian untuk mengatasi masalah tetangga yang bising.
Migrasi sel
Dalam beberapa situasi, kita mungkin perlu melakukan migrasi sel jika layanan kita stateful. Selalu disarankan untuk membuat layanan Anda tanpa kewarganegaraan untuk menghindari situasi ini; Namun, jika tidak dapat dihindari, hati -hati dalam migrasi sel untuk menghindari gangguan layanan. Migrasi melibatkan tiga langkah:-
-
Memindahkan data dari satu sel ke sel lainnya
-
menggeser lalu lintas ke sel baru dan
-
Membersihkan data dari sel yang lebih tua.
Kami mulai dengan menyalin data dari satu sel ke sel lain, lalu kami memperbarui logika perutean untuk menggeser lalu lintas. Setelah lalu lintas sepenuhnya bergeser ke CEL baru, L kami membersihkan data dari sel yang lebih tua.
Tips dan Trik
- Desain komponen layanan tanpa kewarganegaraan. Layanan tanpa kewarganegaraan mudah dipelihara dalam arsitektur sel. Layanan stateful membutuhkan overhead migrasi sel.
- Konfigurasikan sel berdasarkan lalu lintas regional. Anda tidak perlu memiliki jumlah sel yang sama di masing -masing. Misalnya, Anda dapat memiliki 10 sel di wilayah AS dan 5 sel di Asia berdasarkan permintaan.
- Pilih dengan hati -hati atribut untuk RoutingKey.
- Menggabungkan sel -sel dari hari 1 dalam desain Anda.
- Tentukan komponen paling ringan yang mungkin untuk lapisan perutean.
- Desain dengan hati -hati untuk migrasi sel.
Kesimpulan
Arsitektur berbasis sel adalah arsitektur yang kuat dan terbukti untuk membuat sistem lebih tangguh dan sangat terukur. Pendekatan ini memastikan skalabilitas bahkan jika kuota layanan dependen adalah faktor pembatas. Ini adalah pola yang sederhana, namun membutuhkan desain layanan yang cermat untuk membuatnya beroperasi secara independen dalam sel. Saya akan menyajikan studi kasus mengadopsi arsitektur sel untuk mengatasi masalah penskalaan setelah meluncurkan dan menjalankan layanan dalam produksi selama 6 bulan.