Microservices dan database bergabung

112

Bagi orang-orang yang membagi aplikasi monolitik menjadi layanan mikro, bagaimana Anda menangani teka-teki untuk membongkar database. Aplikasi khas yang saya kerjakan melakukan banyak integrasi database untuk alasan kinerja dan kesederhanaan.

Jika Anda memiliki dua tabel yang secara logis berbeda (konteks terbatas jika Anda mau) tetapi Anda sering melakukan pemrosesan agregat pada volume besar data itu, maka dalam monolit Anda kemungkinan besar akan menghindari orientasi objek dan sebagai gantinya menggunakan standar database Anda GABUNG fitur untuk memproses data pada database sebelum mengembalikan tampilan gabungan kembali ke tingkat aplikasi Anda.

Bagaimana Anda membenarkan pemisahan data tersebut menjadi layanan mikro di mana mungkin Anda akan diminta untuk 'menggabungkan' data melalui API daripada di database.

Saya telah membaca buku Microservices Sam Newman dan di bab tentang pemisahan Monolith dia memberikan contoh "Memutus Hubungan Kunci Asing" di mana dia mengakui bahwa melakukan penggabungan di API akan lebih lambat - tetapi dia melanjutkan dengan mengatakan jika aplikasi Anda cukup cepat, apakah penting jika lebih lambat dari sebelumnya?

Ini sepertinya sedikit fasih? Apa pengalaman orang-orang? Teknik apa yang Anda gunakan untuk membuat gabungan API bekerja dengan baik?

Martin Bayly
sumber
2
Pertanyaan bagus, saya mengalami masalah yang sama dan saya akhirnya memiliki pandangan terwujud dan melakukan penggabungan untuk itu. Saya tidak menyukainya, tapi saya rasa itu akan menjadi tantangan dengan Layanan Mikro. Tidak ada cara yang benar untuk melakukan ini, itu hanya pilihan desain yang harus dibuat. Saya tahu banyak orang mengatakan kita dapat memiliki pandangan yang terwujud, tetapi tanggapan yang dikumpulkan menjadi masalah. Beri tahu saya jika Anda menemukan sesuatu yang lebih baik.
PavanSandeep
Saya tahu ini sudah tua, tetapi, apakah ini sesuatu yang dipecahkan graphql? Saya juga melihat ini untuk migrasi tersegmentasi, dan tampaknya graphql adalah cara untuk membuatnya mulus.
themightybun
Pada titik tertentu Anda harus menyadari menjadi dogmatis bukanlah cara yang tepat. GraphQL adalah contoh yang layak untuk melakukan agregasi di luar sumber data dan biasanya berfungsi dengan baik.
Christian Ivicevic

Jawaban:

26
  • Ketika kinerja atau latensi tidak terlalu penting (ya, kami tidak selalu membutuhkannya) tidak masalah untuk hanya menggunakan RESTful API sederhana untuk menanyakan data tambahan yang Anda butuhkan. Jika Anda perlu melakukan beberapa panggilan ke layanan mikro yang berbeda dan mengembalikan satu hasil, Anda dapat menggunakan pola API Gateway .

  • Tidak masalah untuk memiliki redundansi di lingkungan persistensi Polyglot . Misalnya, Anda dapat menggunakan antrean perpesanan untuk layanan mikro Anda dan mengirim peristiwa "update" setiap kali Anda mengubah sesuatu. Layanan mikro lain akan mendengarkan acara yang diperlukan dan menyimpan data secara lokal. Jadi, alih-alih membuat kueri, Anda menyimpan semua data yang diperlukan dalam penyimpanan yang sesuai untuk layanan mikro tertentu.

  • Juga, jangan lupa tentang caching :) Anda dapat menggunakan alat seperti Redis atau Memcached untuk menghindari kueri database lain terlalu sering.

sap1ens
sumber
25
Semua saran bagus, tapi saya masih merasa sulit untuk merasionalisasi, Mungkin itu karena kita sudah terbiasa melakukan banyak pemrosesan di database. Aplikasi kami saat ini memiliki prosedur tersimpan yang rumit yang memproses data dalam jumlah besar dan kemudian mengembalikan kumpulan hasil yang kecil. Dalam arsitektur layanan mikro, menurut saya entitas ini harus dipecah menjadi konteks terbatas yang berbeda. Kami tahu pendekatan saat ini buruk, tetapi sulit untuk membenarkan membawa semua data kembali ke tingkat aplikasi untuk memprosesnya. Mungkin lebih banyak denormalisasi atau tampilan gabungan pra-komputasi akan membantu.
Martin Bayly
1
Ya saya mengerti. Pendekatan layanan mikro tidak untuk semua orang dan Anda harus menerapkannya dengan hati-hati. Mungkin Anda bisa mulai dengan perubahan yang lebih kecil.
sap1ens
Mungkin pemrogram StackExchange akan menjadi tempat yang lebih baik untuk mengajukan pertanyaan ini: programmers.stackexchange.com/questions/279409/… dan pertanyaan lain yang diberi tag pemrogram layanan
Martin Bayly
9

Tidak masalah bagi layanan untuk memiliki salinan replika hanya baca dari data referensi tertentu dari layanan lain.

Mengingat itu, ketika mencoba merefaktor database monolitik menjadi layanan mikro (sebagai lawan menulis ulang) saya akan

  • buat skema db untuk layanan tersebut
  • buat * tampilan ** berversi dalam skema itu untuk mengekspos data dari skema itu ke layanan lain
  • lakukan penggabungan terhadap tampilan hanya-baca ini

Ini akan memungkinkan Anda memodifikasi data tabel / strucutre secara mandiri tanpa merusak aplikasi lain.

Daripada menggunakan tampilan, saya mungkin juga mempertimbangkan untuk menggunakan pemicu untuk mereplikasi data dari satu skema ke skema lainnya.

Ini akan menjadi kemajuan tambahan ke arah yang benar, membangun sambungan komponen Anda, dan pindah ke REST dapat dilakukan nanti.

* pandangan bisa diperpanjang. Jika perubahan yang melanggar diperlukan, buat v2 dari tampilan yang sama dan hapus versi lama jika tidak lagi diperlukan. ** atau Table-Valued-Functions, atau Sprocs.

mcintyre321
sumber
5

CQRS --- Pola Agregasi Command Query adalah jawaban untuk ini sesuai Chris Richardson. Biarkan setiap layanan mikro memperbarui Model datanya sendiri dan menghasilkan peristiwa yang akan memperbarui tampilan terwujud yang memiliki data gabungan yang diperlukan dari layanan mikro sebelumnya. MV ini bisa berupa NoSql DB atau Redis atau pencarian elastik yang dioptimalkan kueri. Teknik ini mengarah pada konsistensi Akhirnya yang jelas tidak buruk dan menghindari penggabungan sisi aplikasi waktu nyata. Semoga jawaban ini.

Praful
sumber
2

Saya akan memisahkan solusi untuk area penggunaan, katakanlah operasional dan pelaporan.

Untuk layanan mikro yang beroperasi untuk menyediakan data untuk formulir tunggal yang membutuhkan data dari layanan mikro lain (ini adalah kasus operasional) saya pikir menggunakan gabungan API adalah cara yang tepat. Anda tidak akan menggunakan data dalam jumlah besar, Anda dapat melakukan integrasi data dalam layanan.

Kasus lainnya adalah ketika Anda perlu melakukan kueri besar pada sejumlah besar data untuk melakukan agregasi, dll. (Kasus pelaporan). Untuk kebutuhan ini, saya akan berpikir tentang memelihara database bersama - mirip dengan skema asli Anda dan memperbaruinya dengan acara dari database layanan mikro Anda. Di database bersama ini, Anda dapat terus menggunakan prosedur tersimpan yang akan menghemat usaha Anda dan mendukung pengoptimalan database.

Jaro64
sumber
1

Di Microservices Anda membuat diff. membaca model, jadi misalnya: jika Anda memiliki dua diff. konteks terikat dan seseorang ingin menelusuri kedua data tersebut, maka seseorang perlu mendengarkan peristiwa dari kedua konteks yang dibatasi dan membuat tampilan khusus untuk aplikasi tersebut.

Dalam hal ini akan ada lebih banyak ruang yang dibutuhkan, tetapi tidak diperlukan gabungan dan tidak ada gabungan.

techagrammer
sumber