Penskalaan monolit vs. penskalaan layanan microser

15

Salah satu argumen umum untuk menggunakan layanan microser adalah skalabilitas yang lebih baik. Tetapi saya bertanya-tanya apakah argumen ini benar-benar valid.

Katakanlah kami memiliki aplikasi yang terdiri dari 10 microservice dengan 9 di antaranya memiliki masing-masing dua instance (untuk redundansi) dan satu di antaranya dengan 4 instance untuk menangani beban (skalabilitas). Argumen pro-microservice adalah bahwa Anda dapat mengukur miroservice ini secara independen dari layanan lain.

Namun, katakanlah semua 10 layanan mikro adalah modul dalam satu monolith dan beberapa (mis. 22 seperti jumlah dari atas) contoh monolith ini digunakan. Sistem harus dapat menangani beban untuk satu bagian kritis, karena ada cukup banyak contoh untuk melakukannya. Jika instance mengandung logika program tidak diperlukan, satu-satunya downside adalah, bahwa biner dan jumlah RAM yang dibutuhkan akan sedikit lebih besar. Tetapi sekali lagi, perbedaannya tidak boleh terlalu besar dalam banyak kasus - setidaknya tidak dibandingkan dengan sisa tumpukan (pikirkan Spring Boot). Kelebihan dari skala monlith akan menjadi sistem yang lebih sederhana tanpa (sebagian besar) kekeliruan dari sistem terdistribusi.

Apakah saya melewatkan sesuatu?

deamon
sumber
3
Seberapa besar monolit yang Anda bicarakan? Karena saya pikir itu bisa lebih dari jumlah RAM yang "sedikit lebih besar". Belum lagi waktu penyebaran - memperbaiki bug bisa membutuhkan 22 penyebaran, bukan 4. Tapi mungkin monolit Anda kecil dan penyebaran tidak membutuhkan banyak waktu, migrasi basis data tidak memakan banyak waktu, dan sebagainya.
Thomas Owens
Saya belum menghitung baris kode, tetapi monolith akan memiliki beberapa ribu baris kode (bukan sistem raksasa). Titik awal dari pertimbangan saya adalah bahwa ukuran kode aplikasi aktual sangat kecil dibandingkan dengan kerangka kerja besar seperti Spring dan Hibernate. Jumlah penyebaran sebenarnya bisa kurang dari dengan layanan microser, karena jika Anda memiliki 2 instance, Anda sudah memiliki redundansi dasar dan lebih banyak instance akan untuk skalabilitas.
deamon
@deamon Sadarilah bahwa dengan pendekatan monolith tidak ada bagian dari kode yang benar-benar mati pada setiap contoh, hanya kode yang jarang digunakan. Sekarang, kode itu sendiri hanya dapat mengkonsumsi sejumlah kecil memori, tetapi jika menggunakan banyak objek yang tersimpan dalam memori jumlah itu dapat tumbuh secara substansial.
Frank Hopkins
Perhatikan bahwa overhead dasar "menjalankannya kode" tidak harus sebesar yang Anda tahu dari aplikasi Java Anda di mana seringkali seluruh jvm adalah bagian dari gambar layanan.
Frank Hopkins

Jawaban:

21

Tujuan dari layanan microsoft adalah bukan untuk mengurangi beban prosesor. Bahkan, karena overhead komunikasi dan pengulangan fungsi yang digunakan menjadi kode utilitas global, biasanya meningkatkan beban prosesor.

Titik penghapusan monolith jauh lebih banyak untuk dapat mempertahankan, menyebarkan dan menjalankan sistem fungsionalitas yang kompleks sama sekali . Setelah sistem Anda mencapai ukuran tertentu, mengkompilasi, menguji, menyebarkan, dll. Monolith menjadi terlalu mahal untuk dapat dipertahankan sambil mempertahankan waktu kerja yang layak. Dengan layanan microser, Anda dapat memutakhirkan, memulai kembali, atau memutar kembali sedikit demi sedikit sistem.

Jangan salah, kami tidak menulis layanan microser karena itu secara inheren solusi yang lebih baik untuk pasangan hal secara longgar melalui antarmuka jarak jauh. Faktanya, hilangnya tipe yang kuat dan konsistensi yang mengecek yang dapat diberikan monolith seringkali merupakan kelemahan utama. Kami melakukannya karena kami harus melakukannya karena kompleksitas telah membuat kami lebih baik, dan memanfaatkan yang terbaik dari situasi yang tidak optimal.

Kilian Foth
sumber
2
Sepakat. Alasan untuk pindah ke arsitektur layanan mikro sebagian besar bersifat politis. Beban terdistribusi, decoupling adalah konsekuensi, bukan penyebab. Manfaat nyata dari layanan-layanan mikro adalah di SDLC dan Tata Kelola. Selain itu, arsitektur adalah respons logis terhadap kebutuhan yang dalam sebagian besar kasus berasal dari strategi pasar perusahaan. Waktu-ke-pasar lebih pendek daripada arsitektur monolit sehingga perusahaan diizinkan untuk mengadopsi strategi baru, bergeser dari satu ke yang lain dengan lancar dan cepat
Laiv
6
Itu sebabnya seseorang tidak harus langsung ke layanan microser untuk aplikasi menengah dan kecil juga. Overhead dan menambah kompleksitas pada sistem mungkin berakhir dengan biaya lebih banyak waktu, uang dan kualitas daripada sistem monolitik, pada skala tersebut.
T. Sar
»Kami melakukannya karena kami harus melakukannya karena kompleksitas telah membuat kami lebih baik, dan memanfaatkan yang terbaik dari situasi yang tidak optimal.« Ya. Bagi saya, itu berhasil!
Thomas Junk
Saya harus tidak setuju dengan bagian terakhir dari jawaban. layanan mikro secara inheren lebih baik daripada monolith, karena mereka menggunakan lebih dari satu komputer
Ewan
1
@ewan Anda juga dapat menggunakan lebih dari satu komputer dengan monolith.
deamon
3

Anda sebagian besar benar. Jika Anda memiliki layanan cepat yang dimuat secara sama, Anda mungkin harus menginstal semuanya pada semua kotak. Ini tidak sebagus memiliki kotak per layanan, tetapi menghemat uang.

Namun. segera setelah Anda memiliki ketidakseimbangan, katakanlah layanan 5 mengambil 100% dari CPU selama 2 menit, Anda ingin memindahkan layanan itu ke kotaknya sendiri sehingga tidak memblokir semua layanan lain jika dijalankan.

Jika panggilan ke layanan 5 waktu habis karena memuat, hanya beberapa fungsi aplikasi Anda yang akan gagal, bukan semua.

Sekarang Anda bisa melakukan hal yang sama dengan monolith yang termodulasi dengan baik. Instal semua layanan, tetapi hanya layanan rute 5 lalu lintas ke salah satunya. Meskipun tidak merutekan layanan 5 lalu lintas ke kotak lain.

Tetapi biasanya monolit pada dasarnya bukan kumpulan layanan yang longgar yang dipasang pada kotak yang sama. Akan ada panggilan memori di antara modul yang akan menyebabkan kegagalan aplikasi.

Ewan
sumber
1

Titik layanan mikro adalah 1) pemisahan kekhawatiran dan 2) mendistribusikan beban. Pada dasarnya ini membebaskan kita untuk membuat layanan kotak hitam terbaik yang kita bisa dengan teknologi spesifik untuk tugas itu. Layanan kami dapat berupa polyglot - yang ditulis dalam berbagai bahasa pemrograman pada tumpukan berbeda. Tim yang berbeda dapat bekerja pada setiap layanan tanpa pengetahuan tentang bagaimana yang lain bekerja di luar kontrak api mereka. Ini, secara keseluruhan, memungkinkan basis kode yang lebih sederhana untuk setiap layanan yang lebih mudah untuk di-debug, dipahami, dan disesuaikan untuk kinerja.

Penjual Lewis A
sumber
Saya setuju sebagian. Maksud saya bukan tentang argumen untuk layanan microser secara umum, tetapi tentang skalabilitas. Dalam kasus khusus saya, semua layanan Microsoft ditulis dalam teknologi yang sama, misalnya. Jadi, meskipun dimungkinkan untuk menggunakan teknologi yang berbeda untuk masing-masing, itu tidak terjadi di sini. Saya ingin memverifikasi bahwa saya tidak melewatkan poin penting tentang skalabilitas.
deamon