Mari kita bicara positif dan negatif dari pendekatan layanan-mikro.
Negatif pertama. Saat Anda membuat layanan microser, Anda menambahkan kompleksitas yang melekat pada kode Anda. Anda menambahkan overhead. Anda membuatnya lebih sulit untuk meniru lingkungan (mis. Untuk pengembang). Anda membuat masalah debugging intermiten lebih sulit.
Biarkan saya menggambarkan kerugian nyata. Pertimbangkan secara hipotesis kasus di mana Anda memiliki 100 layanan mikro yang dipanggil saat membuat halaman, yang masing-masing melakukan hal yang benar 99,9% dari waktu. Tetapi 0,05% dari waktu mereka menghasilkan hasil yang salah. Dan 0,05% dari waktu ada permintaan koneksi yang lambat di mana, katakanlah, batas waktu TCP / IP diperlukan untuk terhubung dan itu membutuhkan waktu 5 detik. Sekitar 90,5% dari waktu permintaan Anda berfungsi dengan baik. Tetapi sekitar 5% dari waktu Anda memiliki hasil yang salah dan sekitar 5% dari waktu halaman Anda lambat. Dan setiap kegagalan yang tidak dapat direproduksi memiliki penyebab yang berbeda.
Kecuali Anda menaruh banyak pemikiran di sekitar alat untuk memantau, mereproduksi, dan sebagainya, ini akan berubah menjadi berantakan. Terutama ketika satu microservice memanggil yang lain yang memanggil beberapa lapisan dalam. Dan begitu Anda memiliki masalah, itu hanya akan menjadi lebih buruk dari waktu ke waktu.
OK, ini kedengarannya seperti mimpi buruk (dan lebih dari satu perusahaan telah menciptakan masalah besar bagi diri mereka sendiri dengan menempuh jalan ini). Keberhasilan hanya mungkin Anda jelas menyadari potensi penurunan dan secara konsisten berupaya mengatasinya.
Jadi bagaimana dengan pendekatan monolitik itu?
Ternyata aplikasi monolitik mudah termodulasi sebagai layanan-mikro. Dan panggilan fungsi lebih murah dan lebih dapat diandalkan dalam praktiknya daripada panggilan RPC. Jadi Anda dapat mengembangkan hal yang sama kecuali itu lebih dapat diandalkan, berjalan lebih cepat, dan melibatkan lebih sedikit kode.
OK, lalu mengapa perusahaan pergi ke pendekatan layanan mikro?
Jawabannya adalah karena ketika Anda mengukur, ada batasan untuk apa yang dapat Anda lakukan dengan aplikasi monolitik. Setelah begitu banyak pengguna, begitu banyak permintaan, dan seterusnya, Anda mencapai titik di mana basis data tidak skala, webservers tidak dapat menyimpan kode Anda dalam memori, dan sebagainya. Lebih lanjut, pendekatan layanan mikro memungkinkan peningkatan aplikasi Anda secara independen dan bertahap. Karenanya arsitektur microservice adalah solusi untuk meningkatkan skala aplikasi Anda.
Aturan pribadi saya adalah bahwa beralih dari kode dalam bahasa scripting (misalnya Python) ke C ++ yang dioptimalkan umumnya dapat meningkatkan 1-2 urutan besarnya pada kinerja dan penggunaan memori. Pergi ke arah lain ke arsitektur terdistribusi menambah besarnya persyaratan sumber daya tetapi memungkinkan Anda skala tanpa batas. Anda dapat membuat karya arsitektur terdistribusi, tetapi melakukannya lebih sulit.
Karena itu saya akan mengatakan bahwa jika Anda memulai proyek pribadi, pergilah monolitik. Pelajari cara melakukannya dengan baik. Jangan didistribusikan karena (Google | eBay | Amazon | dll) adalah. Jika Anda mendarat di perusahaan besar yang didistribusikan, perhatikan baik-baik cara kerjanya dan jangan mengacaukannya. Dan jika Anda akhirnya harus melakukan transisi, berhati-hatilah karena Anda melakukan sesuatu yang sulit yang mudah didapat sangat, sangat salah.
Pengungkapan, saya memiliki hampir 20 tahun pengalaman di perusahaan dari semua ukuran. Dan ya, saya telah melihat arsitektur monolitik dan didistribusikan dari dekat dan pribadi. Hal ini didasarkan pada pengalaman yang saya katakan kepada Anda bahwa arsitektur microservice terdistribusi benar-benar sesuatu yang Anda lakukan karena Anda perlu, dan bukan karena itu entah bagaimana lebih bersih dan lebih baik.