sudahkah kita datang dengan lingkaran penuh dengan layanan mikro, kembali ke pendekatan sekolah yang sangat tua?

9

Dalam hal arsitektur dan desain perangkat lunak, bagaimana layanan microser "menumpuk" (pun intended) terhadap middleware? Saya datang dari Jawa, dan sepertinya saat Anda beralih dari REST langsung sebagai API, dan memisahkan lapisan dan parameter koneksi yang berbeda, setidaknya di Jawa, Anda hampir kembali ke beberapa ide sekolah yang sangat kuno. . Kami telah kembali ke virtualisasi ... sementara JVM sudah virtual.

Dengan cara agnostik, Anda bisa, dan saya akan berdebat tentang kelebihannya, mengabstraksi API yang tenang untuk CORBA. Atau, dengan cara yang lebih java-sentris, JMS atau MDB.

Pada suatu waktu EJB adalah masalah besar di Jawa, maka itu diakui sebagai sedikit efek cluster, tetapi, sekarang, apakah kita kembali ke awal?

Atau, apakah layanan microser menawarkan sesuatu yang kurang dimiliki CORBA, atau bahkan lebih baik, MDB? Ketika saya membaca (TLDR) Martin Fowler menjelaskan microservices, itu menurut saya solusi yang baik untuk masalah buruk, jika Anda mau. Atau lebih tepatnya, pendekatan tertutup yang memperkenalkan tingkat kompleksitas hanya mendorong masalah di sekitar. Jika layanan benar-benar mikro, dan banyak, maka masing-masing memiliki biaya dolar untuk menjalankan dan memeliharanya.

Selain itu, jika satu layanan mikro di antara banyak perubahan API-nya, maka semuanya tergantung pada layanan itu rusak. Ini tidak tampak longgar digabungkan, itu tampaknya kebalikan dari tangkas. Atau apakah saya menyalahgunakan kata-kata itu?

Tentu saja, ada sejumlah pilihan yang tidak pasti di antara yang ekstrem ini.

Hiu versus Gorila ... pergi! (Untuk yang bertele-tele, itu berarti ironis, dan sama sekali bukan maksud saya. Pertanyaan itu dimaksudkan untuk diambil pada nilai nominal. Jika pertanyaan dapat diperbaiki, silakan lakukan, atau komentar dan saya akan memperbaikinya. )

Membayangkan banyak layanan microser berjalan di buruh pelabuhan, semuanya dalam satu mesin, saling berbicara ... kegilaan. Sulit untuk mempertahankan atau admin, dan hampir tidak mungkin untuk mengubah apa pun karena perubahan apa pun akan mengalir dan menyebabkan kesalahan yang tidak terduga. Bagaimana bisa lebih baik bahwa layanan ini tersebar di berbagai mesin? Dan, jika mereka didistribusikan, maka pasti beberapa teknik sekolah yang sangat, sangat tua telah menyelesaikan, setidaknya sampai taraf tertentu, komputasi terdistribusi.

Mengapa penskalaan horizontal begitu lazim, atau setidaknya diinginkan?

Thufir
sumber
4
Voting untuk ditutup. Tidak jelas apa yang Anda tanyakan dan mengapa Anda menanyakannya. Arsitektur microservice hanyalah arsitektur lain. Tidak lebih, tidak kurang.
davidk01
1
Anda mungkin juga menemukan artikel ini bermanfaat: devweek.com/blog/microservices-the-good-the-bad-and-the-ugly
davidk01
1
Saya lebih suka "Jadi sekarang mereka memiliki ratusan layanan palsu kecil, dan bukannya monolit, mereka harus khawatir tentang apa yang terjadi ketika seseorang ingin mengubah kontrak salah satu layanan itu. Sebuah bola benang, dengan nama yang berbeda. Sebaliknya bertanya-tanya apakah kode akan dikompilasi jika mereka membuat perubahan, mereka bertanya-tanya apakah itu akan berjalan, dalam praktiknya. " - Layanan microser untuk penahan debu di leher : tidak, saya bukan dasi, itu hanya artikel lucu.
Thufir
"Alih-alih bertanya-tanya apakah kode akan dikompilasi ... mereka bertanya-tanya apakah kode itu akan berjalan ..." Sebenarnya ini bukan masalah sama sekali. Hanya karena jika pengembang mengubah kontrak tanpa memberi tahu semua pihak yang terlibat - pengembang itu harus dipukul habis-habisan. Secara harfiah. Jika kami menggunakan istilah kontrak, lalu bayangkan apakah penyedia layanan seluler Anda mengubah persyaratan kontrak tanpa meminta / memberi tahu Anda? Itu sebabnya kontrak - semua pihak yang terlibat harus mengetahui / menyetujui perubahan kontrak dan kapan perubahan ini terjadi (dengan asumsi aliran pengembangan yang tepat) semua harus diuji dan berjalan dengan lancar.
Alexey Kamenskiy
1
@ Thufir Seperti yang dikatakan sebelum MS hanyalah pendekatan lain, ia akan memiliki kelebihan dan kekurangannya. Saya benar-benar bekerja dengan pendekatan ini (bahkan sebelum saya mendengar bahwa ia memiliki nama khusus untuk itu) pada beberapa proyek. Sebagai catatan - itu bukan air terjun, itu adalah apa yang Anda buat. Ketika saya bekerja untuk satu proyek pengembangan (dalam tim) bagian dari OS mobile pendekatan ini adalah satu-satunya cara di sana karena OS tidak dapat dibuat sebagai giant blob, itu harus memiliki antarmuka, sehingga setiap bagian mulai dari kernel adalah semacam MS, dan hal pertama sebelum tim mana pun mulai menulis kode untuk menyetujui spesifikasi v0.0.1.
Alexey Kamenskiy

Jawaban:

2

TL; DR. Saya senang minum banyak Microserver rasa Kool-Aid, jadi saya bisa berbicara sedikit tentang alasan di belakang mereka.

Pro:

  • Layanan tahu bahwa ketergantungan mereka stabil dan memiliki waktu untuk memanggang
  • Izinkan penggelaran bergulir versi baru
  • Izinkan komponen dikembalikan tanpa mempengaruhi lapisan yang lebih tinggi.

Cons:

  • Anda tidak dapat menggunakan fitur baru dan mengkilap dari dependensi Anda.
  • Anda tidak pernah dapat merusak kompatibilitas API (atau setidaknya tidak untuk banyak siklus pengembangan).

Saya pikir Anda salah paham secara mendasar bagaimana seharusnya arsitektur microservice berfungsi. Cara seharusnya dijalankan adalah bahwa setiap layanan Microsoft (disebut dari sini sebagai MS) memiliki API kaku yang disetujui oleh semua kliennya. MS diizinkan untuk membuat perubahan apa pun yang diinginkan selama API dipertahankan. MS dapat dibuang dan ditulis ulang dari awal, selama API dipertahankan.

Untuk membantu dalam kopling longgar, setiap MS tergantung pada versi n-1 dependensinya. Ini memungkinkan versi layanan saat ini menjadi kurang stabil dan sedikit lebih berisiko. Itu juga memungkinkan versi untuk keluar dalam gelombang. Pertama 1 server ditingkatkan, lalu setengah, dan akhirnya sisanya. Jika versi saat ini pernah mengembangkan masalah serius, MS dapat dikembalikan ke versi sebelumnya tanpa kehilangan fungsionalitas di lapisan lain.

Jika API perlu diubah, itu harus diubah dengan cara yang kompatibel ke belakang.

Konstantin Tarashchanskiy
sumber
"MS dapat dibuang dan ditulis ulang dari awal, selama API dipertahankan." --tidak ada yang baru di sana, tapi ok. Dalam hal kinerja, di ujung spektrum, bagaimana semua MS ini dibandingkan dengan aplikasi / layanan / sistem monolitik? Dalam hal distribusi, kedengarannya seperti , dan tolong perbaiki saya jika salah, bahwa ada keuntungan kinerja potensial dari menempatkan MS di mesin tunggal ... divirtualisasi pada mainframe ?? Ini hampir seperti semakin Anda skala MS secara horizontal semakin sederhana untuk kemudian skala mereka secara vertikal ...? Poin bonus untuk tidak membaca pertanyaan saya :)
Thufir
1
Seperti halnya lapisan tipuan apa pun, Anda mendapatkan pukulan kinerja dibandingkan dengan bola lumpur yang besar. Dalam kasus MS, ini sangat mahal karena Anda melakukan perjalanan pulang pergi pada setiap panggilan. Menggunakan virtualisasi atau wadah membuat perjalanan pulang pergi ini jauh lebih singkat karena panggilan tidak pernah benar-benar keluar dari mesin. Ini juga berarti bahwa Anda mendapatkan lebih banyak isolasi (sevice pelarian tidak dapat menyakiti rekan-rekannya) dengan biaya perangkat keras yang lebih kecil.
Konstantin Tarashchanskiy
5

Setiap teknik pengembangan perangkat lunak yang pernah kami temukan adalah tentang mengelola kompleksitas, entah bagaimana. Sebagian besar dari mereka telah dan terus tentang abstraksi, enkapsulasi dan kopling longgar. Layanan mikro adalah cara lain untuk melakukan hal-hal itu, yang mungkin mengapa hal itu menyerupai banyak teknik lama pada tingkat teoretis yang tinggi, tetapi itu tidak membuatnya kurang berguna atau relevan.

Mengenai kopling longgar, saya pikir Anda telah sedikit salah memahami tujuan. Jika tugas A perlu memanggil tugas B, tidak akan pernah ada cara untuk membuat A dan B 100% dipisahkan. Tidak akan pernah terjadi. Apa yang dapat Anda lakukan adalah memastikan bahwa, jika tugas B memanggil tugas C, maka tugas C seharusnya tidak perlu khawatir tentang perubahan ke A. Jika ketiga tugas ini semuanya dihubungkan bersama dalam satu gumpalan besar, meneruskan struct satu sama lain, maka ada peluang besar mereka semua harus berubah jika salah satunya melakukannya Tetapi jika ketiganya adalah layanan microser, maka pada dasarnya Anda dijamin bahwa perubahan ke A hanya akan memaksa B untuk memperbarui (kecuali jika itu adalah perubahan besar pada fungsionalitas inti A sehingga Anda mungkin harus menjadikannya layanan baru). Ini terutama benar jika semua pembaruan microservice dilakukan dengan cara yang kompatibel mundur, yang seharusnya.

Mengenai komentar lincah, saya dapat memberi tahu Anda dari pengalaman pribadi bahwa kode microservice-y kami bermain jauh lebih baik dengan gesit daripada kode "tertaut ke gumpalan besar" kami. Dalam yang terakhir, setiap kali seseorang memperbaiki bug dalam fungsi tingkat rendah, ia benar-benar harus mengirim seluruh departemen R&D e-mail yang mengatakan "tolong tinjau kembali tugas Anda atau mereka semua akan crash pada hari Jumat". Kami mendapatkan beberapa dari ini setiap minggu . Jika kodenya ada dalam layanan mikro, kita semua akan secara otomatis mendapat manfaat dari perbaikan segera setelah ia menggunakan versi baru.

Saya tidak sepenuhnya memahami komentar tentang COBRA dan MDB, karena mereka tampaknya bukan arsitektur perangkat lunak melainkan komponen satu; Menurut pemahaman saya, itu adalah cara potensial untuk mendefinisikan protokol pengiriman layanan mikro Anda dan / atau mengimplementasikan layanan-layanan microser tersebut, bukan dalam dan dari diri mereka sendiri alternatif-alternatif untuk layanan-mikro.

Ixrec
sumber
1
"Jika ketiga tugas ini semuanya dihubungkan bersama dalam satu gumpalan besar ..." Saya hanya memiliki perspektif Java tentang ini, tetapi saya akan mengatakan "tidak," ide buruk, jangan lakukan itu. Buat perpustakaan, API # 1, API # 2, dll, untuk mencapai titik Anda yang tepat dari "..task C seharusnya tidak perlu khawatir tentang perubahan ke A," karena C adalah klien dari B saja dan bukan dari A sama sekali . Dalam hal itu, saya tidak melihat itu sama sekali baru, maaf. Saya tahu bahwa pertanyaan yang saya ajukan tidak jelas. Itu pertanyaan kabur karena saya tidak jelas tentang apa itu semua. Setiap jawaban telah berguna bagi saya, jika hanya untuk membantu dengan kosakata saya.
Thufir
1
@ Thufir Jika perpustakaan semua terhubung secara dinamis, dan tugas-tugas semua berjalan pada set mesin yang sama persis, maka Anda benar, itu memang akan memungkinkan untuk peluncuran terpisah. Tetapi layanan microser membiarkan Anda menjatuhkan bahkan asumsi itu, jika Anda ingin melangkah sejauh itu dengan decoupling. Sangat masuk akal untuk tidak melakukannya.
Ixrec
CORBA adalah teknologi terdistribusi yang memungkinkan arsitektur terdistribusi pada suatu waktu (akhir 1990) ketika belum ada nama yang tersebar luas untuk mendefinisikannya. Anda bebas menerapkan sistem berbasis CORBA berbutir kasar atau berbutir halus yang berakhir dengan apa yang kemudian disebut SOA atau Layanan Mikro. CORBA tidak selamat, tetapi kami melakukannya lagi, hanya dengan teknologi yang berbeda. Namun, masalahnya bukan teknologi. Jadi ya, kita akan lingkaran penuh. Saya harap kami mempelajari sesuatu dalam prosesnya.
xtian
4

Bagaimana bisa lebih baik bahwa layanan ini tersebar di berbagai mesin?

Karena awan.

Belum tertawa? Serius meskipun - untuk banyak bisnis, biaya terbesar untuk perangkat lunak bukan perangkat lunak lagi. Bandwidth, perangkat keras, biaya CDN, dll. Sekarang setiap orang memiliki perangkat seluler, hanya ada lebih banyak lalu lintas. Dan itu hanya akan menjadi lebih buruk karena pemanggang roti Anda mendapatkan konektivitas internet sendiri.

Jadi bisnis mencari untuk mengelola biaya-biaya tersebut. Secara khusus, mereka berusaha menangani masalah bisnis "jika hal ini meledak, bagaimana saya bisa melayani jutaan orang yang mendapatkan / menggunakan perangkat lunak saya - tanpa membayar terlebih dahulu bagi server untuk melayani jutaan orang yang mendapatkan / menggunakan perangkat lunak saya ? "

Mengapa penskalaan horizontal begitu lazim, atau setidaknya diinginkan?

Karena itu menjawab masalah bisnis ini (besar dan terus meningkat).

Ketika Anda memiliki selusin pengguna, Anda dapat melemparkan semua layanan pada satu kotak. Ini bagus, karena Anda hanya ingin membayar satu kotak. Dan Anda juga tidak ingin membayar perubahan pada aplikasi untuk membagi berbagai layanan saat bisnis Anda berkembang. Saat ini, Anda tidak punya waktu untuk melakukan itu sebelum gerombolan pelanggan menyalakan server Anda.

Ini juga bagus karena memungkinkan Anda menyulap alokasi server sehingga Anda dapat:

  1. gunakan sebagian besar server yang Anda miliki, sisakan sedikit untuk "buang".
  2. mengukur elemen kinerja individu dari perangkat lunak Anda.
  3. mengurangi penyebaran / waktu henti yang disebabkan oleh rilis.

Memiliki penyebaran yang sangat terperinci membuat kedua hal ini lebih mudah / lebih baik (selain membantu menegakkan pemisahan keprihatinan yang lebih baik).

Telastyn
sumber
Ok, saya bisa melihat keuntungannya. Ada penghalang rendah untuk masuk, tetapi dapat ditingkatkan. Saya kira apa yang melempar saya untuk loop adalah ketika Anda skala secara horizontal dan MS, sepertinya ... sangat ... retro? Sesuatu. Saya tidak bisa menaruh kata-kata mengapa hanya tampaknya salah.
Thufir
Penskalaan aplikasi adalah masalah yang tidak perlu memerlukan layanan-mikro: Anda dapat meningkatkan kekuatan VM dengan sangat mudah pada AWS (bahkan sesuai permintaan), atau Anda dapat menambahkan lebih banyak VM di belakang penyeimbang beban dalam arsitektur tradisional.
xtian
@xtian - tentu saja, tetapi Anda sering menskala hal-hal yang salah dan dengan demikian menghabiskan lebih banyak uang daripada yang Anda butuhkan. Gagasan di balik microservices adalah Anda hanya skala apa yang Anda butuhkan (cpu, memori, disk, throughput, gpu)
Telastyn