Apa yang membuat aplikasi dapat diskalakan?

37

Saya terus melihat dalam posting pekerjaan bahwa pelamar harus memiliki pengalaman menulis aplikasi "scalable". Apa yang membuat aplikasi dapat diskalakan, dan bagaimana saya tahu bahwa kode saya dapat menskala ke jutaan pengguna?


Saya kira cara yang lebih baik untuk mengungkapkan pertanyaan ini adalah: Bagaimana saya bisa menulis kode saya dengan skalabilitas dalam pikiran? Sehingga kodenya bisa diskalakan dari get-go sebagai kebalikan dari renungan. Apakah ada metodologi desain tertentu? Atau itu hanya masalah memilih algoritma yang tepat untuk pekerjaan itu?

jnevelson
sumber

Jawaban:

24

Ada dua arah skalabilitas:

  • vertikal (alias peningkatan): CPU lebih cepat, lebih banyak RAM, lebih banyak ruang disk;
  • horizontal (alias scaling out): lebih banyak core dalam CPU, lebih banyak CPU, lebih banyak server;

Untuk yang pertama, Anda hanya perlu berhati-hati agar Anda tidak memiliki batasan sewenang-wenang. Ini baik karena ukuran bilangan bulat terlalu kecil atau struktur panjang tetap / terbatas. Struktur ini mungkin terkait dengan OS yang mendasarinya. Misalnya jika Anda mencoba meningkatkan menggunakan lebih banyak utas atau proses, pada titik tertentu Anda akan mencapai batas OS. Itu sebabnya saat ini server yang dibangun untuk skalabilitas tinggi melakukan konkurensi berdasarkan peristiwa asinkron. Masalah ini dijelaskan dalam dokumen C10K yang terkenal .

Yang kedua lebih sulit. Ini membutuhkan pemrograman dengan dua hal dalam pikiran: data akan diproses secara paralel, dan data mungkin didistribusikan secara fisik. Komunikasi antara node harus dibatasi. Dalam praktiknya itu biasanya berarti mengorbankan beberapa bagian ACID (terbukti bahwa Anda tidak dapat memiliki ACID penuh dan kemampuan untuk meningkatkan skala pada saat yang bersamaan). Solusi paling dikenal untuk penyimpanan data dalam paradigma itu adalah solusi NoSQL . Mulai dari penyimpanan nilai kunci yang sangat sederhana, hingga sistem yang mirip RDBMS, hanya kemampuan untuk melakukan penggabungan. Toko -toko dengan nilai kunci sangat dapat diskalakan, tetapi harganya sesuai dengan harganya. Pada dasarnya Anda hanya dapat menanyakan pada kunci utama. Namun ada solusi untuk itu, itu mengurangi peta. Mungkin terlihat sangat suboptimal jika Anda melihat dari sudut pandang kompleksitas kumulatif, tetapi Anda harus ingat, bahwa itu berjalan paralel secara masif.

Jika Anda ingin membaca lebih lanjut tentang skalabilitas dengan contoh nyata, lihat blog HighScalability.com .

vartec
sumber
+1 untuk menyebutkan skala. Menambahkan lebih banyak sumber daya sangat cepat dan menarik bagi para pembuat keputusan (beli beberapa hex-core dan gandakan memori!). Tetapi jika aplikasi tidak dapat menekan mereka, Anda memiliki masalah yang lebih besar.
jqa
14

Skalabilitas diukur dalam hal throughput berdasarkan pada beberapa variabel. Misalnya, jumlah permintaan / detik dengan pengguna X. Cara paling sederhana untuk menggambarkan skalabilitas adalah:

Ukuran efisiensi seiring meningkatnya beban.

Hal pertama yang perlu Anda pahami dalam mendesain skalabilitas adalah pengukuran apa yang paling penting untuk aplikasi Anda? Ada beberapa cara untuk mengukur efisiensi yang merupakan komponen utama skalabilitas:

  • Permintaan serentak per detik
  • Waktu respons rata-rata per permintaan
  • Jumlah catatan yang diproses per detik / menit

Ada lebih banyak pengukuran efisiensi yang dapat digunakan, tetapi ini umum untuk sistem berbasis web atau sistem pemrosesan batch.

Aspek skalabilitas berikutnya adalah mengukur apa yang terjadi pada efisiensi Anda saat beban meningkat. Cara umum untuk menambah beban adalah:

  • Lebih banyak pengguna memukul server (yaitu lebih banyak lalu lintas web)
  • Lebih banyak data dalam database (mis. Permintaan lebih lama, atau pemrosesan lebih lama)
  • Kegagalan hard drive dalam RAID (kinerja / keandalan penyimpanan terpengaruh)
  • Saturasi jaringan

Tujuan untuk aplikasi yang dapat diskalakan adalah untuk mempertahankan atau meningkatkan efisiensi karena kami menangani masalah beban. Singkatnya, jika waktu respons terlalu lama, dapatkah kita menambahkan server lain untuk mendistribusikan beban secara merata? Pendekatan ini mengurangi jumlah pekerjaan yang harus dilakukan oleh satu server, dan membuat server beroperasi di "sweet spot" untuk efisiensi.

Aplikasi Anda harus dirancang khusus untuk mengukur. Itu berarti Anda harus berhati-hati dengan data sesi, merutekan permintaan ke server yang tepat, mengurangi kemacetan yang membatasi kemampuan aplikasi untuk berkembang.

Berin Loritsch
sumber
5

Anda pada dasarnya ingin menghindari hambatan kinerja ketika Anda meningkatkan jumlah pengguna, dan / atau memproses kumpulan data yang lebih besar, dan / atau menawarkan antarmuka Anda dalam lebih banyak bahasa, dll.

Anda pada dasarnya melihat skema database Anda, algoritma Anda, dan proses pengembangan perangkat lunak Anda dan mencoba untuk memprediksi masalah di masa depan. Anda juga ingin mengatur pemantauan kinerja untuk mengidentifikasi masalah ketika mereka mulai membangun.

Saya mengambil kiat-kiat ini ketika saya membaca Membangun Situs Web yang Scalable (tautan ke amazon).

Semoga ini membantu!

louisgab
sumber
3

Satu-satunya cara agar aplikasi dapat benar-benar terukur, adalah dengan tidak memiliki batasan yang tidak dapat disahkan (atau hanya sangat mahal).

Contoh tipikal adalah apa yang terjadi ketika Anda kehabisan siklus CPU yang tersedia? Jika program Anda multi-tapak, Anda dapat berjalan di kotak dengan banyak inti tetapi apa yang terjadi ketika Anda tidak bisa membeli kotak yang lebih besar lagi? Aplikasi Anda tidak bisa tumbuh lagi, dan karenanya tidak dapat diskalakan.

Aplikasi apa pun yang benar-benar dapat diskalakan harus dapat tersebar di beberapa komputer secara transparan dan melakukannya tanpa ada benjolan yang terlihat. Ini tidak mudah, dan itulah salah satu alasan mengapa Google begitu sukses.


sumber
1

Ada masalah unik yang datang dengan mendukung aplikasi berskala besar. Posting pekerjaan mencari pelamar yang telah bekerja di lingkungan itu dan harus menyelesaikan masalah seperti itu.

Dari aplikasi tingkat tinggi dibuat scalable dengan terus-menerus mengajukan pertanyaan apa yang akan terjadi jika potongan kode ini diminta untuk dijalankan ribuan kali dalam periode yang sangat kecil. Ini berarti mengelola jejak kaki memori Anda, memanfaatkan caching total dan data, menggunakan sumber data yang dapat diskalakan sendiri, dll.

jzd
sumber
1

Jika Anda sedang membangun fitur pencarian yang berkinerja baik ketika memiliki 100 baris dalam DB untuk mencari dan 10 pengguna menggunakannya sekaligus. Seberapa baik kinerjanya saat 100 pengguna menggunakannya secara bersamaan dan ada 100 ribu baris yang harus dicari.

Jika ia melakukan hal yang sama tidak peduli apa maka sangat bagus. jika kinerjanya proporsional dengan jumlah pengguna / data (artinya 10x lebih banyak data == 10x lebih lama untuk diproses) itu bagus. Jika kinerjanya jauh lebih rendah, semakin banyak data yang dimilikinya (data mode 10x == 10x ^ 10 lebih lama untuk diproses) maka itu tidak skala dengan baik.

Contoh-contoh saya harus benar-benar ditampilkan dalam notasi O Besar tetapi saat ini saya tidak cukup tahu untuk menuliskan contoh-contoh dalam O Besar.

Anda dapat mensimulasikan lebih banyak data dengan membuang data dummy ke dalam DB Anda, dan ada alat untuk mensimulasikan lebih banyak pengguna seperti Apache AB.

JD Isaacks
sumber