Saya merancang aplikasi menggunakan Layanan Mikro dan saya tidak yakin tentang mekanisme terbaik yang digunakan untuk mengumpulkan data dari berbagai layanan.
Saya percaya ada dua opsi:
- Mengintegrasikan mekanisme komunikasi 'antar-layanan' yang memungkinkan layanan untuk berbicara secara langsung. API Gateway akan memanggil layanan individual, yang kemudian memanggil layanan lain untuk mengumpulkan data, sebelum mengembalikan respons gabungan ke API Gateway. API kemudian mengembalikan respons ke pemanggil. (Ini harus menjadi panggilan sinkron ketika panggilan ke layananB membutuhkan respons dari serviceA. IE Terpisah Orang dan Layanan Alamat.)
- Mintalah API Gateway untuk memanggil setiap layanan secara langsung dan menggabungkan data dalam API sebelum mengembalikan respons.
Saya condong ke opsi kedua, karena memiliki layanan berbicara satu sama lain akan memperkenalkan kopling, dalam hal ini saya mungkin juga hanya arsitek aplikasi monolitik. Namun, ada beberapa kelemahan serius yang bisa saya pikirkan dari atas kepala saya dengan opsi ini:
Memiliki API yang melakukan beberapa panggilan ke beberapa layanan meningkatkan beban pada server API, terutama ketika beberapa panggilan tersebut diblokir.
Metode ini berarti API harus 'sadar' tentang apa yang coba dilakukan aplikasi (IE Logic harus diprogram ke dalam API untuk menangani panggilan layanan pada gilirannya, dan kemudian untuk mengkonsolidasikan data), daripada hanya sekedar bertindak sebagai 'titik akhir' bodoh untuk layanan mikro.
Saya ingin tahu apa pendekatan standar untuk masalah ini dan apakah ada opsi ketiga yang saya lewatkan?
sumber
Jawaban:
Saya biasanya menyarankan agar microservices tidak melakukan komunikasi sinkron satu sama lain, masalah besar adalah kopling, itu berarti layanan sekarang digabungkan satu sama lain, jika salah satu dari mereka gagal yang kedua sekarang sepenuhnya atau sebagian tidak berfungsi.
Saya akan membuat perbedaan yang jelas antara operasi pergantian negara dan operasi baca (CQS Command Query Separation ). Untuk operasi yang mengubah keadaan saya akan menggunakan beberapa jenis infrastruktur pengiriman pesan dan pergi untuk api dan lupa. Untuk pertanyaan, Anda akan menggunakan komunikasi respons permintaan Sinkron dan dapat menggunakan API http atau langsung ke penyimpanan data Anda.
Jika Anda menggunakan perpesanan maka Anda juga dapat melihat terbitkan berlangganan untuk meningkatkan acara antar layanan.
Hal lain yang perlu dipertimbangkan adalah berbagi data (transaksional) (sebagai lawan dari hanya baca tampilan) jika Anda mengekspos keadaan internal Anda, pembaca mungkin mendapatkan kondisi data yang salah, atau versi yang salah, dan juga akan berpotensi mengunci data Anda?
Last but not least, cobalah untuk melakukan segala yang Anda bisa untuk menjaga layanan Anda mandiri (setidaknya di tingkat logis).
Semoga ini masuk akal.
sumber
Itu tergantung pada mengapa Anda membutuhkan data itu. Jika itu untuk UI, maka tidak apa-apa. Selain itu, memang seharusnya begitu. Chris Richardson memiliki penjelasan yang bagus tentang konsep itu , dan Sam Newman memiliki artikel yang bagus tentang konsep yang sangat mirip yang disebut Backends for Frontends .
Tetapi jika Anda membutuhkannya untuk beberapa logika, kemungkinan batas layanan Anda salah.
Ada beberapa karakteristik yang menurut akal sehat memberitahu kita bahwa layanan kita harus memiliki . Mereka:
Untuk mencapai ini, perlakukan batas layanan Anda sebagai kapabilitas bisnis . Proses formal untuk mengidentifikasi batas-batas layanan terlihat seperti berikut:
Sebuah contoh penerapan pendekatan ini mungkin menarik beberapa.
sumber
Saya akan condong ke pendekatan kedua juga secara default, meskipun mungkin tidak di "API gateway" Anda, tetapi saya akan menganggapnya sepenuhnya masuk akal untuk membuat layanan mikro baru yang tujuan utamanya adalah mengatur permintaan ke layanan mikro lainnya dan mewakili data dalam bentuk tingkat yang lebih tinggi. Dalam arsitektur layanan-mikro, saya cenderung tidak memiliki "layanan dasar" berkomunikasi secara langsung satu sama lain.
Untuk membuat ini sedikit kurang subyektif, katakanlah satu layanan tergantung pada yang lain jika yang pertama membutuhkan data atau layanan dari yang kedua, secara langsung atau tidak langsung . Dalam istilah matematika, kami ingin hubungan ini menjadi urutan parsial dan bukan preorder . Dalam bentuk diagram, jika Anda merencanakan diagram ketergantungan Anda, Anda harus mendapatkan diagram Hassedan tidak memiliki siklus (diarahkan). (Dalam diagram Hasse, ujung-ujungnya secara implisit diarahkan dari rendah ke tinggi.) Sebagai pedoman lebih lanjut, Anda ingin jalur dari atas ke bawah pada umumnya lebih pendek. Ini berarti Anda ingin lebih langsung bergantung pada hal-hal secara default. Alasannya adalah ini meminimalkan jumlah hal yang bisa salah untuk setiap permintaan tertentu, meminimalkan overhead, dan mengurangi kompleksitas. Jadi, dalam kasus "ideal" oleh metrik ini, diagram Hasse hanya akan memiliki dua level. Tentu saja, ada banyak alasan mengapa Anda mungkin ingin memperkenalkan layanan perantara seperti caching, konsolidasi, load balancing, manajemen kegagalan.
Untuk menguraikan kekhawatiran kedua Anda tentang memiliki API Gateway menjadi "pintar", sebuah pola yang sekarang mendapatkan daya tarik dengan kerangka kerja seperti Falcor dan Relay / GraphQL adalah membuat permintaan lebih banyak spesifikasi tentang apa yang harus dilakukan sehingga "API Gateway" secara umum dapat jalankan spesifikasi tersebut tanpa harus tahu apa yang
GetTimeline
diperlukan. Sebagai gantinya, itu akan mendapatkan permintaan seperti "meminta informasi pengguna ini dari layanan pengguna, dan mendapatkan posting ini dari layanan pos" atau apa pun.sumber
Saya menduga kebutuhan Anda akan layanan untuk "saling memanggil" menunjukkan bahwa Anda sedang melanjutkan dengan sistem yang belum dirancang dengan baik, karena kebutuhan layanan mikronya untuk "saling memanggil" adalah bentuk penggandengan yang jarang muncul ketika layanan microser dirancang dengan tepat.
Apakah Anda dapat menjelaskan lebih lanjut tentang masalah yang Anda coba selesaikan? Dalam bahasa inggris sederhana?
sumber