Haruskah layanan berbicara langsung satu sama lain dalam arsitektur layanan mikro?

10

Saya memiliki sejumlah layanan web yang membentuk aplikasi web. Klien dapat mengakses layanan ini melalui panggilan REST API.

Haruskah layanan ini dapat berbicara langsung satu sama lain? Jika demikian, bukankah itu membuat mereka berpasangan yang bertentangan dengan konsep pada layanan mikro?

Haruskah klien memanggil mereka secara langsung satu demi satu untuk mendapatkan data yang diperlukan untuk memuat halaman web pada klien?

Atau haruskah saya memiliki lapisan lain di atas layanan saya, yang menangani permintaan dari klien, mengambil data untuk permintaan itu dan kemudian mengirimkannya kembali ke klien?

cod3min3
sumber
Jika semuanya benar-benar terpisah maka mereka benar-benar produk yang terpisah. Jadi pengguna harus masuk ke Contoso Login, lalu Contoso Login akan mengatakan "Anda sekarang sudah masuk!" ... dan kemudian mereka pergi ke Contoso Sensitive Data Storage, centang kotak yang mengatakan "Ya, saya masuk "... lalu salin-tempel data dari itu ke dalam Contoso Data Processor ...
user253751

Jawaban:

15

Jika Anda ingin layanan Anda terlihat seperti pada gambar ini, maka ya: masukkan deskripsi gambar di sini Ini tidak seperti Anda tidak dapat melakukannya, tetapi sebagian besar waktu itu akan memiliki konsekuensi buruk. Komunikasi melalui REST tidak akan memisahkan layanan Anda secara signifikan. Ketika beberapa antarmuka layanan berubah, semua layanan dependen kemungkinan besar harus diubah dan digunakan kembali. Juga saat memindahkan layanan, Anda harus meletakkan semua layanan dependen, yang tidak dianggap sebagai desain yang baik untuk standar ketersediaan tinggi.

Pada akhirnya, Anda akan memiliki aplikasi layanan mikro yang lebih lambat daripada aplikasi monolith alternatif, tetapi memiliki hampir semua masalah yang sama!

Saya harus tidak setuju dengan @Robert Harvey

Dalam praktiknya, bagaimanapun, satu atau lebih dari layanan microser Anda (mungkin semuanya) akan berbicara dengan beberapa pusat penyimpanan data seperti database SQL.

Database integrasi adalah antipattern yang terkenal

Solusi yang jauh lebih baik adalah dengan menggunakan pola terbitkan-berlangganan untuk membuat komunikasi antara layanan Anda tidak sinkron:

masukkan deskripsi gambar di sini

Silakan lihat cara CQRS / ES menerapkan metode komunikasi ini, Greg Young dan orang lain menawarkan banyak video bagus tentang topik ini. Hanya google untuk kata kunci "CQRS / ES". Dalam pendekatan ini, setiap layanan akan menjadi penerbit dan pelanggan pada saat yang sama, yang memungkinkan layanan menjadi lebih sedikit digabungkan.

Berikut ini adalah serangkaian artikel bagus tentang layanan mikro yang menyoroti kontroversi seputar topik tersebut. Penjelasan yang sangat rinci dengan ilustrasi yang bagus.

IlliakaillI
sumber
2
Yah, pertama-tama, saya belum pernah mendengar istilah "basis data integrasi" di mana pun kecuali dari Fowler. Jangan menganggap sesuatu sebagai Injil hanya karena satu orang mengatakannya. Kedua, Anda tidak memiliki informasi yang cukup untuk menyebut apa yang saya deskripsikan sebagai "basis data integrasi." Ketiga, Fowler benar-benar menyebut basis data semacam itu berguna dalam keadaan yang tepat, dalam artikel yang sama yang Anda tautkan. Saya suka ide bus peristiwa, meskipun saya tidak melihat bagaimana semuanya berbeda dari memanggil API biasa-biasa saja kecuali jika Anda dapat meningkatkan efisiensi.
Robert Harvey
Terima kasih Robert, saya telah menautkan artikel Fowler untuk lebih menggambarkan ide, bukan untuk berdebat dari otoritas. Cara Anda menggambarkan pendekatan itu sangat mirip dengan basis data integrasi. Jika berbeda - itu tidak jelas sama sekali. Mengenai keadaan yang tepat - saya pikir mengintegrasikan microservices melalui database bukanlah ide yang baik karena mendorong kita kembali ke arsitektur monolitik.
IlliakaillI
1
Tentu: setiap layanan Microsoft akan berbicara dengan database mereka sendiri yang terpisah atau ke tabel dalam database yang sama yang tidak terkait dengan tabel layanan lainnya. Dengan cara ini layanan tidak pernah bertukar informasi melalui database, yang berarti bahwa Anda dapat dengan mudah menskala secara horizontal dan akan ada lebih sedikit kemacetan. Dan karena mereka tidak berbagi tabel yang sama - perubahan di satu bagian aplikasi akan cenderung mempengaruhi bagian lain.
IlliakaillI
1
Anda tidak dapat secara kategoris menyatakan itu sebagai absolut. Mungkin ada dua layanan yang membutuhkan informasi yang sama dalam database yang sama, mereka hanya membutuhkannya sesekali, tidak ada masalah penskalaan untuk mengaksesnya seperti itu, bagaimanapun, dua layanan sudah mengakses database untuk tujuan lain, jadi berdiri sebuah bus layanan atau API endpoint hanya untuk mencapai itu akan konyol.
Robert Harvey
1
Tetapi untuk mencapai nilai bisnis, Anda ingin menggabungkan data - "tunjukkan semua sistem saluran pembuangan yang akan memiliki kapasitas penyimpanan yang tidak memadai mengingat data radar hujan yang masuk berikut, dan warnai peta kota ini menggunakan hasilnya". Jika Anda membagi semua data Anda menjadi layanan, itu artinya Anda hanya bisa menggabungkan data nanti. Jika Anda melarang layanan untuk berbicara satu sama lain, Anda cukup memaksakan diri untuk memindahkan semua data ke beberapa klien dan bergabung dengan data di sana. Anda INGIN memasangkan data di suatu tempat, karena pada akhirnya itulah yang memberikan nilai aplikasi.
RemcoGerlich
8

Anda akan mendapatkan banyak ide bagus dari membaca apa yang dikatakan Udi Dahan tentang SOA .

Layanan adalah otoritas teknis untuk kemampuan bisnis tertentu. Setiap data atau aturan harus dimiliki hanya oleh satu layanan.

Apa artinya ini adalah bahwa bahkan ketika layanan mempublikasikan dan berlangganan acara masing-masing, kita selalu tahu apa sumber kebenaran otoritatif untuk setiap bagian data dan aturan.

Juga, ketika melihat layanan dari kacamata kapabilitas bisnis, apa yang kita lihat adalah bahwa banyak antarmuka pengguna menyajikan informasi dengan kapabilitas yang berbeda - harga suatu produk bersama-sama apakah persediaan atau tidak. Agar kami mematuhi definisi layanan di atas, ini membawa kami pada pemahaman bahwa antarmuka pengguna seperti itu sebenarnya adalah gabungan - dengan masing-masing layanan memiliki fragmen UI yang berhubungan dengan data khususnya.

Khusus mengenai komposisi UI, artikel Mauro Servienti tentang Komposisi UI adalah titik awal yang baik. Lihat juga video Udi, tersedia di sini .

Haruskah layanan ini dapat berbicara langsung satu sama lain? Jika demikian, bukankah itu membuat mereka berpasangan yang bertentangan dengan konsep pada layanan mikro?

Jika dua layanan saling bertukar pesan, maka Anda akan mendapatkan beberapa sambungan. Jawaban utama di sana adalah bahwa mereka berpasangan dengan API layanan lain - kontrak yang dijanjikan layanan untuk tetap stabil bahkan ketika internalnya berubah.

Di luar itu, teknik seperti penemuan layanan dapat mengurangi ketergantungan pada penyedia layanan tertentu, dan pialang pesan dapat memisahkan produsen dan konsumen (mereka masih perlu saling memahami pesan satu sama lain, dan bagaimana berinteraksi dengan API pialang pesan - tidak ada keajaiban ).

VoiceOfUnreason
sumber
7

Itu tergantung pada apa yang Anda maksud dengan "langsung".

Sangat baik, menurut arsitektur microservices, untuk memiliki microservices yang memanggil microservices lain, baik di server Anda sendiri, atau bahkan di server eksternal, melalui beberapa antarmuka seperti REST.

Apa yang tidak baik, adalah untuk satu microservice untuk memohon yang lain menggunakan metode langsung; yang akan membuat kedua layanan microser bagian dari monolith yang sama.

Mike Nakis
sumber
itu tidak baik dan akan memiliki konsekuensi buruk. Lihat jawaban saya untuk lebih jelasnya.
IlliakaillI
@IlliakaillI Saya mengatakan bahwa tidak apa-apa "menurut arsitektur layanan microser". Saya tidak menyarankan bahwa arsitektur layanan microser bebas dari konsekuensi, atau bahwa tidak ada perbaikan yang dapat dilakukan untuk itu. Pertanyaannya di sini adalah "apakah X ditulis oleh buku, atau tidak?" dan jawaban yang benar adalah bahwa dengan diberikan definisi X yang benar, itu adalah oleh buku.
Mike Nakis
Apakah ada "buku referensi" yang memberi tahu Anda cara membangun "arsitektur layanan mikro" yang nyata? Layanan microser menjadi kata kunci saat ini dan banyak orang menulis buku tentang cara membangun monolit di atas REST. Lihat saja diagram pertama dalam jawaban saya, tidak masuk akal untuk membangun sistem dengan cara itu. Jika Anda melakukannya karena alasan aneh - Anda pasti salah melakukannya. Anda lebih baik pergi dengan monolit saja. Jika Anda mendukung pilihan desain Anda dengan merujuk secara membabi buta ke beberapa buku (membuat argumen dari otoritas) itu bukan cara yang tepat untuk mendekati desain perangkat lunak.
IlliakaillI
5

Haruskah layanan ini dapat berbicara langsung satu sama lain? Jika demikian, bukankah itu membuat mereka berpasangan yang bertentangan dengan konsep pada layanan mikro?

Coupling bukan kata yang buruk. Setiap aplikasi sudah memiliki derajat kopling tertentu; aplikasi yang berbicara dengan layanan microser Anda sudah digabungkan ke layanan microser, jika tidak mereka tidak akan berfungsi.

Apa yang Anda benar-benar kejar dengan layanan microser adalah kopling longgar ; Anda dapat mencapai itu hanya dengan meminta satu layanan mikro menginterogasi yang lain melalui API publiknya atau menggunakan bus acara.

Namun dalam praktiknya, satu atau lebih layanan microser Anda (mungkin semuanya) akan berbicara dengan beberapa pusat penyimpanan data seperti database SQL. Bergantung pada bagaimana Anda ingin mencapai tujuan Anda, Anda mungkin hanya memiliki satu microservice mengubah data database dalam beberapa cara, yang akan diminta oleh microservice lain untuk mengambil perubahan.

Robert Harvey
sumber
3
"Basis data integrasi" terkenal antipattern, lihat jawaban saya untuk lebih jelasnya.
IlliakaillI
2

Tampaknya ketika berbicara tentang SOA dan arsitektur pada umumnya, orang terjebak dalam semantik dan jargon. Apa yang membuat layanan "mikro"? Pada akhirnya, itu adalah serangkaian karakteristik yang, dalam "sistem penilaian" apa pun yang Anda gunakan, jelas tidak membuat layanan "non-mikro." Apa yang dikatakan hakim agung tentang ketidaksenonohan? "Aku akan tahu ketika aku melihatnya."

Saya yakin beberapa orang akan mengatakan ini bukan jawaban, tetapi kemudian mereka kehilangan intinya. Arsitektur layanan mikro dimaksudkan untuk menghindari beberapa masalah, di antaranya adalah masalah "penggabungan ketat". Jadi, jika Anda akhirnya membuat kusut layanan mikro yang bergantung pada terlalu banyak detail satu sama lain, Anda telah membuat sambungan ketat yang - apakah Anda menggunakan bus pesan pub / sub atau panggilan langsung - menghancurkan kemampuan Anda untuk menyusun solusi baru dari potongan-potongan, mengkonfigurasi ulang masing-masing potongan tanpa menjatuhkan seluruh sistem, dll

Flickerthing dot com
sumber
1

Haruskah klien memanggil mereka secara langsung satu demi satu untuk mendapatkan data yang diperlukan untuk memuat halaman web pada klien?

Tergantung; namun, saya menyarankan untuk menyediakan kemampuan yang langsung dapat digunakan untuk klien dan menyembunyikan (merangkum) perincian tentang bagaimana hasil dikumpulkan (misalnya melalui beberapa layanan mikro).

Jika terlalu banyak logika terlibat dalam menggabungkan hasil layanan-mikro individual oleh klien, yang mungkin secara tidak sengaja menyebabkan beberapa logika bisnis merayap ke dalam klien. Itu juga dapat mengekspos lebih banyak arsitektur internal Anda ke klien daripada yang Anda inginkan, menghambat refactoring nanti dari layanan microser.

Jadi, itu berarti dengan layanan microser, terkadang sangat membantu untuk memiliki layanan microser pembungkus yang memberikan klien titik akhir yang memiliki abstraksi yang berguna dan yang melakukan koordinasi tingkat yang lebih tinggi dari layanan microser lainnya (mungkin sekarang lebih internal).


(Selanjutnya, perjalanan pulang pergi ke klien kemungkinan lebih mahal daripada dari layanan microsoft Anda satu sama lain.)


Jika Anda melihat arah yang diambil oleh GraphQL, misalnya, Anda akan menemukan klien yang mengeluarkan pertanyaan yang relevan langsung ke titik akhir, yang mungkin atau mungkin tidak diterapkan sebagai kumpulan layanan mikro. Karena arsitektur microservices tersembunyi di belakang GraphQL, yang membuat arsitektur lebih mudah untuk diperbaiki dan lebih ramah kepada klien. Lihat, misalnya, https://stackoverflow.com/a/38079681/471129 .

Erik Eidt
sumber
1

Tujuan utama dari layanan mikro adalah untuk membuat aplikasi Anda secara longgar digabungkan. Karena itu, layanan tidak dapat saling memanggil. Kalau tidak, itu akan diikat-terikat. Tetapi apa yang akan kita lakukan jika kita memiliki dua layanan yang perlu berbagi data? Jawabannya adalah Pialang Pesan. Jadi layanan yang mendapatkan data dari klien dapat membagikan data ke pialang pesan pusat, maka layanan harus menggunakan data yang dapat mengkonsumsinya, mentransformasikannya, dan memasukkannya ke penyimpanan data sendiri. Saya merekomendasikan Kafka karena Anda dapat menggabungkan data dari berbagai topik dengan cepat dengan Kafka Stream. PS. lebih baik untuk memisahkan layanan mikro Anda dengan fitur.

Panuwat Anawatmongkhon
sumber