Ketika mengembangkan sistem sendiri, haruskah saya menggunakan layanan microser?

30

Saya memulai proyek baru di tempat kerja, dan kemungkinan akan menjadi satu-satunya pengembang di proyek ini, meskipun satu atau dua pengembang lain perlu mengintegrasikan aplikasi yang ada atau skrip sederhana ke dalam proyek utama. Proyek ini perlu menangani curah kecil dan streaming data yang dicerna / diproses, dan juga eksekusi kode berdasarkan kejadian dan sesuai permintaan. Beberapa bagian dari kerangka kerja akan sangat terikat CPU, dan beberapa bagian bisa sangat terikat I / O; sebagian besar data harus hidup pada satu mesin, tetapi kami dapat membuat cluster dan menghubungkan VM untuk meningkatkan daya komputasi yang tersedia. Mungkin akan ada satu atau lebih aplikasi web kecil yang bergantung pada layanan asalkan kerangka inti ini. Bahasa utama adalah Python untuk hampir semua hal.

Pertanyaan saya adalah apakah saya harus mengambil pendekatan layanan mikro untuk upaya seperti ini atau tetap dengan aplikasi monolitik, mengingat bahwa saya akan melakukan sebagian besar pengembangan sendiri. Pemikiran saya adalah bahwa layanan-layanan microser (menggunakan Nameko) memberikan pemisahan alami antara elemen-elemen kerangka kerja yang memiliki model pelaksanaan yang berbeda (jalur pipa data, acara-diluncurkan, sesuai permintaan, aplikasi web, dll.) Dan cara yang jelas untuk mendistribusikan beban kerja dan komunikasi di berbagai proses. Kekhawatiran saya adalah bahwa saya mungkin akan berakhir dengan kluster Kubernetes untuk dikelola (Saya akrab dengan Docker, tetapi masih cukup baru untuk Kubernetes), beberapa layanan (rabbitmq, redis, dll.) Diperlukan hanya untuk memfasilitasi menjalankan sistem, dan berpotensi banyak potongan kode kecil untuk benar-benar menerapkan semua kemampuan yang diperlukan yang kami

Untuk proyek dengan sedikit lebih dari satu pengembang, apakah layanan Microsoft masih menyederhanakan pengembangan dan pemeliharaan sistem yang rumit seperti ini? Apakah ada metode / sistem / kerangka kerja yang harus saya pertimbangkan untuk digunakan, atau untuk mengurangi overhead yang terlibat dalam merancang sistem dengan cara ini?

scnerd
sumber
10
Anda menggunakan layanan microser ketika Anda membutuhkan manfaat yang disediakan microservice, dan manfaat itu lebih besar daripada biayanya. Secara pribadi, saya tidak melihat mengapa Anda membutuhkan layanan microser dalam aplikasi individual yang ditulis oleh satu orang, kecuali jika Anda mengajar diri sendiri atau Anda memiliki pandangan jangka panjang untuk aplikasi yang lebih besar.
Robert Harvey

Jawaban:

49

Layanan microser umumnya tidak diinginkan karena mereka mengubah perangkat lunak Anda menjadi sistem terdistribusi - dan sistem terdistribusi membuat semuanya jauh lebih sulit. Tetapi arsitektur berorientasi layanan memiliki beberapa manfaat penting:

  • layanan yang berbeda dapat dikembangkan dan digunakan secara independen oleh tim yang berbeda
  • berbagai layanan dapat ditingkatkan secara mandiri

Karena Anda akan menjadi pengembang tunggal, Anda tidak perlu fleksibilitas untuk mengembangkan layanan secara mandiri.

Tetapi Anda perhatikan bahwa beberapa bagian mungkin terikat CPU. Jadi mungkin diinginkan untuk skala mereka secara mandiri dari sisa aplikasi. Jika itu masalahnya, itu tidak berarti bahwa Anda harus mengubah seluruh proyek menjadi arsitektur-layanan-mikro. Anda hanya perlu memindahkan bagian yang intensif-CPU ke layanannya sendiri, dan dapat menyimpan sisanya dalam monolit yang nyaman. Sejalan dengan itu sistem harus dipisah sulit untuk diketahui, tetapi secara umum gagasan DDD tentang "konteks terbatas" adalah pedoman yang baik.

Perhatikan bahwa monolit tidak buruk. Monolith tidak setara dengan proyek besar yang tidak dapat dipelihara yang berantakan. Di mana Anda dapat membagi sistem menjadi layanan microser yang berbeda, Anda juga dapat membagi sistem menjadi komponen yang berbeda dalam satu monolit. Pemisahan antara komponen-komponen ini hanya lebih terlihat dan lebih jelas ditegakkan dalam arsitektur berorientasi layanan. Ini juga berarti bahwa untuk sistem yang dirancang dengan baik, seharusnya cukup mudah untuk mengubah komponen menjadi layanan di beberapa titik kemudian. Jadi Anda tidak harus memutuskan sekarang, Anda dapat pindah ke layanan microser jika dan ketika monolith telah membuktikan dirinya tidak cocok.

Pertimbangkan juga konsep Martin Fowler tentang Microservice Premium (2015): microservices memperkenalkan kompleksitas substansial mereka sendiri, di samping kompleksitas dasar sistem Anda. Anda harus membayar "premi" ini dalam hal pengurangan produktivitas. Ini berarti bahwa untuk proyek sederhana, layanan microser membuat Anda kurang produktif. Ini berubah untuk proyek yang lebih kompleks: sedangkan solusi monolitik mungkin menjadi semakin sulit untuk dikerjakan, arsitektur layanan mikro berskala jauh lebih baik dan membutuhkan usaha yang konstan. Anda harus tahu apakah upaya awal ekstra dari layanan microser layak dilakukan karena sistem perangkat lunak Anda. Karena Anda menanyakan pertanyaan ini, jawabannya mungkin "tidak". Fowler melanjutkan:

Jadi pedoman utama saya adalah tidak mempertimbangkan microservices kecuali Anda memiliki sistem yang terlalu rumit untuk dikelola sebagai monolith. Mayoritas sistem perangkat lunak harus dibangun sebagai aplikasi monolitik tunggal. Perhatikan modularitas yang baik di dalam monolit itu, tetapi jangan mencoba memisahkannya menjadi layanan terpisah.

amon
sumber
31
TL; Versi DR: Hanya tambahkan kerumitan saat menyelesaikan masalah yang sebenarnya Anda miliki.
jpmc26
1
Arsitek sedemikian rupa sehingga Anda bisa lebih mudah bermigrasi ke arsitektur layanan mikro nanti. Misalnya, pemisahan kekhawatiran vs bola lumpur yang besar, dan akan lebih mudah untuk mempertahankan sekarang dan lebih mudah untuk memindahkan bagian ke layanan yang terpisah nanti. Anda masih dapat memiliki pembagian tugas / domain yang diilhami oleh layanan-mikro tanpa membuat panggilan / mengirim pesan ke layanan lain.
ps2goat
1
Hukum Pertama Benda Terdistribusi Fowler: Jangan
K. Alan Bates
1
Ada keuntungan ketiga, meskipun sama tidak berguna dengan OP: Jika Anda harus membangun sistem terdistribusi, dan jika Anda sudah memiliki atau berencana membangun perkakas yang baik untuk sistem terdistribusi Anda, sebuah layanan mikro akan berintegrasi dengan perkakas itu dengan lebih mudah. dan memungkinkan kontrol berbutir halus dalam banyak aspek. Ini dapat menyederhanakan pemecahan masalah, pembuatan profil, pengujian integrasi, pelacakan, dll. Tapi itu jelas tergantung pada alat-alat yang ada dan mendukung arsitektur layanan-mikro Anda. Tanpa ekosistem pendukung ini, layanan-layanan microser hanya menambah kompleksitas.
Kevin
2
Yap, jawaban yang bagus. Orang-orang tampaknya lupa bahwa layanan-mikro sebenarnya menambah kompleksitas - jadi kecuali mereka menghapus lebih banyak kerumitan, itu tidak layak. Dan dalam hampir semua kasus, seorang pengembang tunggal tidak akan memiliki cukup manfaat melakukan MSA.
enderland