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?
sumber
Jawaban:
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.
sumber
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
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.
sumber
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.
sumber
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.
sumber
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.
sumber