Bagaimana cara beralih ke layanan-mikro membuat masalah run-time?

104

Komentator berikut menulis :

Layanan Microsoft menggeser disfungsi organisasi Anda dari masalah waktu kompilasi ke masalah run time.

Komentator ini memperluas masalah dengan mengatakan:

Fitur bukan bug. Jalankan masalah waktu => masalah prod = = umpan balik yang lebih kuat, lebih cepat tentang disfungsi kepada mereka yang bertanggung jawab

Sekarang saya mendapatkannya dengan microservices Anda:

  • berpotensi meningkatkan latensi through-put Anda - yang merupakan masalah produksi dan run-time.
  • tingkatkan jumlah "antarmuka jaringan" dalam kode Anda di mana mungkin ada kesalahan run-time parsing.
  • berpotensi dapat melakukan penyebaran biru-hijau. Itu bisa ditahan oleh ketidakcocokan antarmuka (lihat antarmuka jaringan). Tetapi jika penyebaran biru-hijau berhasil maka itu lebih merupakan masalah run-time.

Pertanyaan saya adalah: Apa artinya beralih ke layanan-mikro menciptakan masalah run-time?

hawkeye
sumber
13
Jika A berbicara dengan B dalam monolit setidaknya antarmuka yang sebenarnya dapat terbukti kompatibel (melalui pengetikan statis) yang membuatnya lebih mungkin juga benar. Biasanya layanan microser berkomunikasi melalui sesuatu tanpa pemeriksaan waktu kompilasi
Richard Tingle
Jika Anda mempelajari masalah yang melibatkan penggunaan layanan microser, artikel Fowler harus dibaca. martinfowler.com/articles/microservices.html Saya percaya itu bukan hanya kasus waktu kompilasi vs runtime seperti kata @Richard Tingle. Dan jangan benar-benar setuju bahwa memiliki masalah produksi lebih baik daripada yang ada dalam pengembangan. Tetapi layanan microser dapat membantu untuk mengukur proyek-proyek besar dengan cara lain. (Dan merupakan kerja keras untuk sebagian besar proyek kecil)
Borjab
2
Komentator itu berpandangan pendek. Jalankan masalah waktu => masalah prod = = pengguna yang tidak bahagia => kehilangan uang.
Philipp
@ Pilip: Itulah intinya. Kompilasi masalah waktu yang disebabkan oleh disfungsi organisasi => tidak ada yang peduli. Kehilangan uang yang disebabkan oleh disfungsi organisasi => justru melukai mereka yang bertanggung jawab atas disfungsi organisasi tersebut. Harapannya: disfungsi organisasi diperbaiki lebih cepat.
Jörg W Mittag

Jawaban:

194

Saya punya masalah. Mari kita gunakan Layanan Mikro! Sekarang saya memiliki 13 masalah yang didistribusikan.

Membagi sistem Anda menjadi komponen yang dienkapsulasi, kohesif, dan dipisahkan adalah ide yang bagus. Ini memungkinkan Anda untuk mengatasi masalah yang berbeda secara terpisah. Tetapi Anda dapat melakukannya dengan sangat baik dalam penyebaran monolitik (lihat Fowler: Microservice Premium ). Bagaimanapun, inilah yang telah diajarkan OOP selama beberapa dekade! Jika Anda memutuskan untuk mengubah komponen Anda menjadi layanan microser, Anda tidak mendapatkan keunggulan arsitektur apa pun. Anda mendapatkan beberapa fleksibilitas mengenai pilihan teknologi dan mungkin skalabilitas (tetapi tidak harus!). Tetapi Anda dijamin beberapa sakit kepala yang berasal dari (a) sifat sistem yang terdistribusi, dan (b) komunikasi antar komponen. Memilih layanan microser berarti Anda memiliki masalah lain yang sangat mendesak sehingga Anda bersedia menggunakan layanan microser meskipun ada masalah ini.

Jika Anda tidak dapat merancang monolith yang terbagi menjadi beberapa komponen, Anda juga tidak dapat merancang sistem layanan-mikro. Dalam basis kode monolitik, rasa sakit akan cukup jelas. Idealnya, kode tidak akan dikompilasi jika rusak parah. Tetapi dengan layanan microser, setiap layanan dapat dikembangkan secara terpisah, mungkin bahkan dalam bahasa yang berbeda. Setiap masalah dalam interaksi komponen tidak akan terlihat sampai Anda mengintegrasikan komponen Anda, dan pada saat itu sudah terlambat untuk memperbaiki arsitektur secara keseluruhan.

Sumber bug nomor 1 adalah ketidakcocokan antarmuka. Mungkin ada kesalahan mencolok seperti parameter yang hilang, atau lebih banyak contoh halus seperti lupa untuk memeriksa kode kesalahan, atau lupa untuk memeriksa prasyarat sebelum memanggil metode. Pengetikan statis mendeteksi masalah seperti sedini mungkin: di IDE Anda dan di kompiler, sebelum kode pernah berjalan. Sistem dinamis tidak memiliki kemewahan ini. Itu tidak akan meledak sampai kode yang salah dijalankan.

Implikasinya bagi layanan mikro menakutkan. Layanan Microsoft secara inheren dinamis. Kecuali jika Anda pindah ke bahasa deskripsi layanan formal, Anda tidak dapat memverifikasi segala jenis kebenaran penggunaan antarmuka Anda. Anda harus menguji, menguji, menguji! Tetapi tes mahal dan biasanya tidak lengkap, yang meninggalkan kemungkinan bahwa masalah mungkin masih ada dalam produksi. Kapan masalah itu akan terlihat? Hanya ketika jalur yang salah itu diambil, pada saat dijalankan, dalam produksi. Gagasan bahwa masalah prod akan mengarah pada umpan balik yang lebih cepat adalahmeriah salah berbahaya, kecuali jika Anda terhibur dengan kemungkinan kehilangan data.

amon
sumber
13
@ JacquesB Saya yakin bahwa "disfungsi organisasi" mengacu pada ketidakmampuan untuk mengembangkan suatu sistem. Mayoritas jawaban saya adalah konteks untuk menggambarkan bagaimana orang bisa sampai pada kesimpulan seperti itu, tetapi pendapat profesional saya dan tidak diambil dari tweet.
amon
10
"Monolith yang terbagi rapi menjadi komponen" - apa artinya itu?
10
Dan tidak untuk berbicara tentang versi antarmuka (antarmuka berubah seiring waktu).
Peter Mortensen
12
@mobileink Monolith bukan istilah yang ideal di sini karena ini menunjukkan “tidak ada arsitektur”. Tetapi yang ingin saya sampaikan adalah sistem yang dikembangkan dan digunakan sebagai sistem tunggal, berbeda dengan arsitektur berorientasi layanan di mana bagian-bagian sistem dapat digunakan secara independen. Harap edit pos jika Anda tahu istilah yang lebih baik ...
amon
7
@amon Mendengar kata Monolith tidak dengan segera memunculkan ide "tidak ada arsitektur". Sebagian besar bangunan adalah Monolith, seperti halnya Piramida Agung Mesir, dan banyak item lainnya. Jelas mereka adalah arsitek, dan dikirim secara keseluruhan. Banyak sistem perangkat lunak tidak memiliki arsitektur yang baik; tetapi kurangnya arsitektur yang baik tampaknya tidak tergantung pada bagaimana mereka digunakan. Anda dapat meminjam beberapa perancah proyek lain dan menyebutnya arsitektur (3-tier, 2-tier, n-tier, microservice, dll.) Tetapi melakukannya tidak menjamin Anda melakukannya dengan baik.
Edwin Buck
215

Tweet pertama milik saya, jadi saya akan mengembangkannya:

Misalkan Anda memiliki 100 pengembang, bekerja pada aplikasi monolitik. Itu terlalu banyak orang untuk berkomunikasi secara efektif antara satu sama lain, sehingga perusahaan harus bekerja keras untuk membaginya menjadi tim yang lebih kecil dan menciptakan pola komunikasi yang baik di antara mereka. Ketika organisasi itu "disfungsional", tim mungkin tidak berbicara satu sama lain, mereka tidak selaras dengan tujuan yang lebih besar, mereka tidak setuju pada prioritas dll - akibatnya, dibutuhkan selamanya untuk mengirimkan sesuatu. Ini adalah "masalah waktu kompilasi" dalam arti bahwa disfungsi sudah jelas sebelum perangkat lunak diproduksi. Proyek ini mungkin merupakan pawai kematian atau tidak akan pernah dikirimkan ("kompilasi").

Saya pikir banyak orang tertarik pada layanan mikro, dan pindah ke mereka, bukan karena manfaat teknis / arsitektur yang melekat, tetapi karena itu memungkinkan mereka untuk mengabaikan disfungsi organisasi. Alih-alih mencoba menyelaraskan 100 pengembang, mereka berharap bahwa mereka dapat memiliki tim kecil yang bekerja di silo, masing-masing fokus pada layanan mikro kecil mereka sendiri. Jika Anda berada dalam organisasi yang disfungsional, ini sangat menarik: memberi Anda izin lebih besar untuk menghindari orang yang tidak Anda sukai, untuk tidak berkomunikasi.

Sayangnya itu menjadi "masalah waktu berjalan" karena begitu perangkat lunak berjalan dalam produksi, komunikasi yang baik menjadi sama pentingnya. Masalah dengan organisasi - tim dan bagaimana mereka disejajarkan dan berkomunikasi - bermanifestasi pada "run time".

Inti dari tweet saya adalah: jika apa yang Anda miliki adalah masalah orang , arsitektur baru tidak akan membantu. Itu hanya akan menunda efek dari masalah. Saya pikir daya tarik layanan mikro bagi banyak orang adalah harapan bahwa hal itu akan secara ajaib menyelesaikan masalah orang-orang ini.

Paul Stovell
sumber
67
+1. Ini jauh lebih baik sebagai jawaban Stack Exchange daripada sebagai tweet. :-)
ruakh
3
Hal yang sama berlaku untuk semua sistem dinamis, sungguh. Pengetikan dinamis sangat bermanfaat, tetapi hanya jika Anda memiliki orang yang tepat. "Database Freeform" sangat berguna, tetapi hanya jika Anda memiliki orang yang tepat. Jika Anda tidak memiliki orang yang tepat, Anda hanya mendelegasikan masalah, bukan menyelesaikannya.
Luaan
2
Saya pikir ini adalah tautologi. Ketika orang adalah masalahnya, masalah itu bisa terwujud di mana-mana. Saya tidak bisa membayangkan pengiriman solusi yang berjalan sebagai satu set layanan microser tanpa tes integrasi yang tepat. Tidak ada cara pengiriman solusi dengan aliran kerja yang didukung dalam kasus tersebut. Jika ada yang pindah ke layanan microser tanpa pengujian aliran, terutama untuk menyembunyikan masalah, itulah masalahnya. Mungkin juga mengirimkan binari yang tidak diuji / rusak. Itu mengangkat masalah dari programmer tingkat trooper lebih tinggi, di mana itu milik.
Luk32
10
@ luk32 Sebagian, ya, tetapi inti dari layanan-layanan mikro yang membuatnya menarik bagi tim-tim yang buruk adalah bahwa Anda membuat keterampilan dan defisit komunikasi Anda luput dari perhatian untuk periode waktu yang lebih lama. Ini bukan masalah memiliki masalah atau tidak, tentang kapan mereka akan muncul
T. Sar
18
Jawaban yang sangat bagus Terima kasih telah mengonfirmasi pendapat saya tentang Twitter sama sekali tidak berguna untuk apa pun kecuali menggerakkan orang.
Robert Harvey
43

Pertanyaan saya adalah: Apa artinya beralih ke layanan-mikro menciptakan masalah run-time?

Itu tidak apa yang mereka tweet mengatakan! Mereka tidak mengatakan apa-apa tentang beralih ke layanan-layanan mikro , juga tidak mengatakan apa-apa tentang menciptakan masalah. Mereka hanya mengatakan sesuatu tentang masalah bergeser .

Dan mereka memberikan batasan kontekstual pada pernyataan mereka, yaitu bahwa organisasi Anda tidak berfungsi.

Jadi, yang pada dasarnya tweet pertama katakan adalah dua hal:

  • "Jika organisasi Anda tidak mampu merancang sistem rumit sekarang tanpa layanan microser, maka secara ajaib tidak akan bisa merekayasa sistem kompleks dengan layanan microser" dan
  • "masalah yang disebabkan oleh ketidakmampuan yang sekarang muncul selama waktu kompilasi, yaitu selama pengembangan kemudian akan muncul selama waktu berjalan, yaitu dalam produksi" (secara teknis, mereka juga bisa muncul selama pengujian, tetapi ingat, kutipan membatasi sendiri untuk organisasi disfungsional, yang kemungkinan memiliki rezim pengujian di bawah standar)

The kedua Tweet mengatakan bahwa fakta bahwa masalah hanya menampakkan diri dalam produksi, yaitu di mana pelanggan melihat mereka, adalah fitur, bukan bug, karena ketika pelanggan mengeluh, yang cenderung untuk didengar di tempat yang berbeda daripada ketika membangun istirahat, yaitu di tempat-tempat yang dapat melakukan sesuatu tentang disfungsi organisasi (misalnya manajemen tingkat tinggi). Karena disfungsi organisasi biasanya merupakan kegagalan manajemen tingkat tinggi, ini berarti bahwa pelanggan yang tidak puas mencerminkan buruk pada mereka yang pada akhirnya bertanggung jawab atas ketidakpuasan itu, sedangkan kualitas kode rendah yang disebabkan oleh kegagalan manajemen tingkat tinggi biasanya hanya berdampak buruk pada pengembang, yang Namun, tidak bersalah dan tidak dapat melakukan sesuatu.

Jadi, tweet pertama mengatakan bahwa layanan microsoft memindahkan masalah yang disebabkan oleh manajemen yang buruk dari waktu kompilasi, di mana hanya pengembang yang melihatnya, untuk menjalankan waktu, tempat pelanggan melihatnya. Tweet kedua mengatakan itu adalah hal yang baik, karena kemudian, masalahnya melukai mereka yang bertanggung jawab atas mereka.

Jörg W Mittag
sumber
6
@ Michael Jika Anda tidak dapat melihat bagaimana mereka mempengaruhi kualitas kode, mungkin mempertimbangkan apa dampak - jika ada - manajemen memiliki pada setiap bagian dari kualitas produk bisnis mereka menciptakan.
wjl
30
@Michael: Semuanya pada akhirnya disebabkan oleh manajemen tingkat yang lebih tinggi. Apakah kualitas kode rendah disebabkan oleh tenggat waktu yang tidak mungkin? Siapa yang menetapkan tenggat waktu itu? Siapa yang memberi tahu mereka yang menetapkan tenggat waktu untuk menetapkan tenggat waktu itu? Apakah kualitas kode rendah disebabkan oleh pengembang yang tidak kompeten? Siapa yang mempekerjakan pengembang yang tidak kompeten itu? Siapa yang merekrut mereka yang merekrut pengembang yang tidak kompeten itu? Apakah ini disebabkan oleh perkakas yang tidak memadai? Siapa yang membeli alat itu? Siapa yang menyetujui anggaran untuk membeli alat-alat itu? Ini disebabkan oleh arsitektur yang bodoh? Siapa yang menyewa arsitek? Siapa yang mengaturnya? Tweet-tweet itu secara khusus dalam konteksnya ...
Jörg W Mittag
13
... disfungsi organisasi. Nah, membuat fungsi organisasi cukup banyak THE pekerjaan manajemen tingkat yang lebih tinggi. Itulah yang manajemen adalah .
Jörg W Mittag
4
Meskipun mungkin akan bekerja dalam jangka panjang, ide untuk memecahkan masalah perusahaan Anda dengan membuat mereka berdampak pada pelanggan tampaknya tidak benar.
Stijn de Witt
1
@ JörgWMittag Saya tidak berpikir masuk akal untuk mengklaim bahwa kode buruk yang ditulis oleh pengembang yang buruk adalah kesalahan orang-orang yang menyewa pengembang yang buruk dan bukan pengembang yang buruk itu sendiri. Mungkin pada akhirnya menjadi tanggung jawab manajemen, tetapi itu disebabkan oleh pengembang.
Miles Rout
9

Itu menciptakan masalah run-time yang bertentangan dengan masalah waktu kompilasi .

Aplikasi monolitik sulit dan mahal untuk dikompilasi. Tetapi begitu kompilasi Anda dapat yakin bahwa tidak ada ketidakcocokan yang sangat bodoh antara komponen ada, karena sistem tipe dapat menangkap mereka. Kesalahan yang sama dalam sistem microservives mungkin tidak muncul sampai dua komponen spesifik benar-benar berinteraksi dengan cara tertentu.

Kilian Foth
sumber
9
Ini tampaknya menganggap aplikasi "monolitik" selalu diketik secara statis. Bagaimana dengan bahasa yang diketik secara dinamis? Dan bagaimana dengan antarmuka layanan yang diketik secara statis?
JacquesB
1
@ JacquesB OTOH, saya bisa memikirkan persis nol dikompilasi secara dinamis bahasa diketik.
immibis
2
@JacquesB JavaScript dan Python tidak dikompilasi. Kecuali Anda menghitung struktur interpreter internal sebagai target kompilasi dalam hal ini setiap bahasa dikompilasi.
immibis
3
@immibis: setiap implementasi ECMAScript saat ini memiliki setidaknya satu kompiler. V8, misalnya, memiliki dua kompiler dan penerjemah yang benar-benar nol, tidak pernah menginterpretasikan, ia selalu dikompilasi ke kode mesin asli biner. SpiderMonkey memiliki empat kompiler, saya percaya, dan satu penerjemah, tetapi penerjemah itu tidak menafsirkan ECMAScript. SpiderMonkey tidak pernah menginterpretasikan ECMAScript, ia selalu mengkompilasinya ke bytecode SpiderMonkey terlebih dahulu, yang kemudian dapat dikompilasi lebih lanjut ke kode mesin asli biner. Semua implementasi Python, Ruby, dan PHP yang ada saat ini memiliki kompiler.
Jörg W Mittag
12
@ LieRyan Anda benar-benar bingung jika Anda berpikir tipe inferensi sama dengan yang diketik secara dinamis dan / atau Haskell diketik secara dinamis.
Derek Elkins
2

Baik dalam sistem monolitik dan layanan microser Anda harus mendefinisikan antarmuka antara subsistem. Antarmuka harus dirancang dengan baik, terdokumentasi dengan baik, dan setabil mungkin. Ini sama dengan di OOP.

Jika organisasi Anda tidak dapat melakukan ini, layanan microser juga tidak akan menyelesaikan masalah. Dalam layanan microser Anda memiliki antarmuka Web publik. Jadi Anda bahkan harus mengeluarkan lebih banyak upaya dalam desain antarmuka.

Jika antarmuka tidak dirancang dengan benar, Anda akan mendapatkan dua jenis masalah runtime:

  1. Jika antarmuka tidak digunakan dengan benar, Anda akan mendapatkan kesalahan saat runtime, bukan pada waktu kompilasi.
  2. Memanggil antarmuka web cukup lambat, sehingga Anda bisa mendapatkan masalah kinerja.

Saya pikir menghasilkan masalah runtime bukanlah cara yang benar dalam mengomunikasikan masalah organisasi kepada mereka yang bertanggung jawab.

bernie
sumber