Haruskah Layanan Mikro berbicara satu sama lain?

30

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?

KidCode
sumber
Bisakah Anda memberikan beberapa konteks? Apa aplikasi Anda dan apa yang coba dilakukan
Ewan
Tebakan saya ada di antara dua opsi Anda: Setiap layanan mikro berkomunikasi dengan layanan mikro lainnya sebagaimana diperlukan untuk melakukan tugasnya. Dan gateway API dapat dianggap sebagai layanan mikro juga, yang terutama mendelegasikan pekerjaan ke layanan lain.
Bart van Ingen Schenau
Saya berpendapat bahwa membuat layanan microser di sisi server mengalahkan tujuan utama memiliki layanan Microsoft untuk memulai. Idenya adalah untuk membuat layanan independen, dan meninggalkan orkestrasi kepada klien. Tapi mungkin saya tidak praktis
Sridhar Sarnobat

Jawaban:

21

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.

Sean Farmar
sumber
11

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:

  1. Kopling rendah. Jika Anda membuat beberapa perubahan dalam layanan A, Anda tidak ingin mereka memengaruhi layanan B.
  2. Kohesi tinggi. Jika Anda perlu mengimplementasikan beberapa fitur, Anda ingin jumlah layanan yang paling sedikit terpengaruh.
  3. Otonomi tinggi. Jika beberapa layanan gagal, Anda tidak ingin seluruh sistem mati.
  4. Granularitas yang benar. Anda tidak ingin layanan Anda terlalu cerewet, karena jaringan Anda lebih rumit daripada yang mungkin Anda pikirkan.
  5. Layanan harus berkomunikasi melalui acara. Anda tidak ingin layanan Anda saling memperhatikan karena hal itu mengurangi pemeliharaan. Pikirkan tentang apa yang terjadi jika Anda perlu menambahkan layanan baru.
  6. Data terdesentralisasi. Suatu layanan tidak boleh membagikan cara informasi disimpan. Sama seperti objek yang baik, itu memperlihatkan perilaku, bukan data.
  7. Koreografi layanan lebih dari orkestrasi.

Untuk mencapai ini, perlakukan batas layanan Anda sebagai kapabilitas bisnis . Proses formal untuk mengidentifikasi batas-batas layanan terlihat seperti berikut:

  1. Identifikasi batas tingkat yang lebih tinggi. Saya suka menganggap mereka sebagai langkah yang harus dilalui organisasi Anda untuk mencapai tujuan bisnisnya, untuk mendapatkan nilai bisnisnya. Anda dapat membayangkan langkah-langkah dasar dengan melihat rantai Nilai Porter .
  2. Dalam setiap layanan, selami lebih dalam. Identifikasi unit mandiri anak dengan tanggung jawab mereka sendiri.
  3. Pikirkan cara mereka berkomunikasi. Layanan yang benar berkomunikasi terutama melalui acara. Pikirkan tentang struktur organisasi Anda. Komunikasi di dalamnya cukup intensif, meskipun biasanya beberapa peristiwa eksternal terbuka.

Sebuah contoh penerapan pendekatan ini mungkin menarik beberapa.

Zapadlo
sumber
1

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 GetTimelinediperlukan. Sebagai gantinya, itu akan mendapatkan permintaan seperti "meminta informasi pengguna ini dari layanan pengguna, dan mendapatkan posting ini dari layanan pos" atau apa pun.

Derek Elkins
sumber
0

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?

Ben
sumber