Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menguraikan monolit menjadi layanan mikro dengan menggunakan CQRS dan sumber acara
Rodolfo Jr. Cerrada, Dmitry Gulin, dan Tabby Ward, Amazon Web Services
Ringkasan
Pola ini menggabungkan dua pola, menggunakan pola pemisahan tanggung jawab permintaan perintah (CQRS) dan pola sumber peristiwa. Pola CQRS memisahkan tanggung jawab model perintah dan kueri. Pola sumber acara memanfaatkan komunikasi berbasis peristiwa asinkron untuk meningkatkan pengalaman pengguna secara keseluruhan.
Anda dapat menggunakan layanan CQRS dan Amazon Web Services (AWS) untuk memelihara dan menskalakan setiap model data secara independen sambil memfaktorkan ulang aplikasi monolit Anda ke dalam arsitektur layanan mikro. Kemudian Anda dapat menggunakan pola sumber acara untuk menyinkronkan data dari database perintah ke database kueri.
Pola ini menggunakan kode contoh yang menyertakan file solusi (*.sln) yang dapat Anda buka menggunakan versi terbaru Visual Studio. Contoh ini berisi kode Reward API untuk menampilkan cara kerja CQRS dan sumber acara di aplikasi AWS tanpa server dan tradisional atau lokal.
Untuk mempelajari lebih lanjut tentang CQRS dan sumber acara, lihat bagian Informasi tambahan.
Prasyarat dan batasan
Prasyarat
Akun AWS yang aktif
Amazon CloudWatch
Tabel Amazon DynamoDB
Amazon DynamoDB Streams
Kunci akses AWS Identity and Access Management (IAM) dan kunci rahasia; untuk informasi selengkapnya, lihat video di bagian Sumber daya terkait
AWS Lambda
Keakraban dengan Visual Studio
Keakraban dengan AWS Toolkit for Visual Studio; untuk informasi selengkapnya, lihat video demo AWS Toolkit for Visual Studio di bagian Sumber daya terkait
Versi produk
.NET Inti 3.1. Komponen ini merupakan opsi dalam instalasi Visual Studio. Untuk menyertakan .NET Core selama instalasi, pilih NET Core cross-platform development.
Batasan
Kode contoh untuk aplikasi lokal tradisional (ASP.NET Core Web API dan objek akses data) tidak disertakan dengan database. Namun, ia datang dengan objek
CustomerDatadalam memori, yang bertindak sebagai database tiruan. Kode yang diberikan cukup bagi Anda untuk menguji polanya.
Arsitektur
Tumpukan teknologi sumber
Proyek API Web Inti ASP.NET
Server Web IIS
Objek akses data
Model CRUD
Arsitektur sumber
Dalam arsitektur sumber, model CRUD berisi antarmuka perintah dan kueri dalam satu aplikasi. Misalnya kode, lihat CustomerDAO.cs (terlampir).

Tumpukan teknologi target
Amazon DynamoDB
Amazon DynamoDB Streams
AWS Lambda
(Opsional) Amazon API Gateway
(Opsional) Layanan Pemberitahuan Sederhana Amazon (Amazon SNS)
Arsitektur target
Dalam arsitektur target, antarmuka perintah dan kueri dipisahkan. Arsitektur yang ditunjukkan dalam diagram berikut dapat diperluas dengan API Gateway dan Amazon SNS. Untuk informasi selengkapnya, lihat bagian Informasi tambahan.

Fungsi Command Lambda melakukan operasi tulis, seperti membuat, memperbarui, atau menghapus, pada database.
Fungsi Query Lambda melakukan operasi baca, seperti dapatkan atau pilih, pada database.
Fungsi Lambda ini memproses aliran DynamoDB dari database Command dan memperbarui database Query untuk perubahan.
Alat
Alat
Amazon DynamoDB - Amazon DynamoDB adalah layanan database NoSQL yang dikelola sepenuhnya yang memberikan kinerja yang cepat dan dapat diprediksi dengan skalabilitas yang mulus.
Amazon DynamoDB Streams - DynamoDB Streams menangkap urutan urutan waktu modifikasi tingkat item dalam tabel DynamoDB apa pun. Kemudian menyimpan informasi ini dalam log hingga 24 jam. Enkripsi saat istirahat mengenkripsi data dalam DynamoDB streams.
AWS Lambda — AWS Lambda adalah layanan komputasi yang mendukung menjalankan kode tanpa menyediakan atau mengelola server. Lambda menjalankan kode Anda hanya saat diperlukan dan menskalakan secara otomatis, dari beberapa permintaan per hari hingga ribuan per detik. Anda hanya membayar untuk waktu komputasi yang Anda gunakan—tidak ada biaya saat kode Anda tidak berjalan.
AWS Management Console — AWS Management Console adalah aplikasi web yang terdiri dari koleksi luas konsol layanan untuk mengelola layanan AWS.
Visual Studio 2019 Community Edition
— Visual Studio 2019 adalah lingkungan pengembangan terintegrasi (IDE). Edisi Komunitas gratis untuk kontributor sumber terbuka. Dalam pola ini, Anda akan menggunakan Visual Studio 2019 Community Edition untuk membuka, mengkompilasi, dan menjalankan kode contoh. Untuk melihat saja, Anda dapat menggunakan editor teks atau Kode Visual Studio. AWS Toolkit for Visual Studio — AWS Toolkit for Visual Studio adalah plugin untuk Visual Studio IDE. AWS Toolkit for Visual Studio memudahkan Anda mengembangkan, men-debug, dan menerapkan aplikasi.NET yang menggunakan layanan AWS.
Kode
Kode contoh terlampir. Untuk petunjuk tentang penerapan kode contoh, lihat bagian Epik.
Epik
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Buka solusinya. |
| Pengembang aplikasi |
Bangun solusinya. | Buka menu konteks (klik kanan) untuk solusinya, lalu pilih Build Solution. Ini akan membangun dan mengkompilasi semua proyek dalam solusi. Itu harus berhasil dikompilasi. Visual Studio Solution Explorer harus menunjukkan struktur direktori.
| Pengembang aplikasi |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Berikan kredensyal. | Jika Anda belum memiliki kunci akses, lihat video di bagian Sumber daya terkait.
| Pengembang aplikasi, Insinyur data, DBA |
Bangun proyek. | Untuk membangun proyek, buka menu konteks (klik kanan) untuk proyek AWS.apg.cqrses.Build, lalu pilih Build. | Pengembang aplikasi, Insinyur data, DBA |
Bangun dan isi tabel. | Untuk membuat tabel dan mengisinya dengan data benih, buka menu konteks (klik kanan) untuk proyek AWS.apg.cqrses.Build, lalu pilih Debug, Start New Instance. | Pengembang aplikasi, Insinyur data, DBA |
Verifikasi konstruksi tabel dan data. | Untuk memverifikasi, navigasikan ke AWS Explorer, dan perluas Amazon DynamoDB. Ini harus menampilkan tabel. Buka setiap tabel untuk menampilkan contoh data. | Pengembang aplikasi, Insinyur data, DBA |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Membangun proyek CQRS. |
| Pengembang aplikasi, Insinyur uji |
Bangun proyek sumber acara. |
| Pengembang aplikasi, Insinyur uji |
Jalankan tes. | Untuk menjalankan semua pengujian, pilih View, Test Explorer, lalu pilih Run All Tests In View. Semua tes harus lulus, yang ditunjukkan oleh ikon tanda centang hijau. | Pengembang aplikasi, Insinyur uji |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Publikasikan fungsi Lambda pertama. |
| Pengembang aplikasi, DevOps insinyur |
Verifikasi fungsi upload. | (Opsional) Anda dapat memverifikasi bahwa fungsi berhasil dimuat dengan menavigasi ke AWS Explorer dan memperluas AWS Lambda. Untuk membuka jendela pengujian, pilih fungsi Lambda (klik dua kali). | Pengembang aplikasi, DevOps insinyur |
Uji fungsi Lambda. |
Semua proyek Lambda CQRS ditemukan di bawah folder dan solusi. | Pengembang aplikasi, DevOps insinyur |
Publikasikan fungsi yang tersisa. | Ulangi langkah sebelumnya untuk proyek-proyek berikut:
| Pengembang aplikasi, DevOps insinyur |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Publikasikan penangan acara Pelanggan dan Hadiah Lambda. | Untuk mempublikasikan setiap event handler, ikuti langkah-langkah dalam epik sebelumnya. Proyek-proyek berada di bawah folder | Pengembang aplikasi |
Lampirkan pendengar acara Lambda sumber acara. |
Setelah pendengar berhasil dilampirkan ke tabel DynamoDB, itu akan ditampilkan di halaman desainer Lambda. | Pengembang aplikasi |
Publikasikan dan lampirkan fungsi EventSourceReward Lambda. | Untuk mempublikasikan dan melampirkan fungsi | Pengembang aplikasi |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Uji aliran dan pemicu Lambda. |
| Pengembang aplikasi |
Validasi, menggunakan tabel query reward DynamoddB. |
| Pengembang aplikasi |
Validasi, menggunakan CloudWatch Log. |
| Pengembang aplikasi |
Validasi EventSourceCustomer pemicunya. | Untuk memvalidasi | Pengembang aplikasi |
Sumber daya terkait
Referensi
Video
Informasi tambahan
CQRS dan sumber acara
CQRS
Pola CQRS memisahkan model operasi konseptual tunggal, seperti objek akses data tunggal CRUD (create, read, update, delete) model, ke dalam model operasi perintah dan query. Model perintah mengacu pada operasi apa pun, seperti membuat, memperbarui, atau menghapus, yang mengubah status. Model query mengacu pada setiap operasi yang mengembalikan nilai.

Model CRUD Pelanggan mencakup antarmuka berikut:
Create Customer()UpdateCustomer()DeleteCustomer()AddPoints()RedeemPoints()GetVIPCustomers()GetCustomerList()GetCustomerPoints()
Karena kebutuhan Anda menjadi lebih kompleks, Anda dapat beralih dari pendekatan model tunggal ini. CQRS menggunakan model perintah dan model kueri untuk memisahkan tanggung jawab untuk menulis dan membaca data. Dengan begitu, data dapat dikelola dan dikelola secara independen. Dengan pemisahan tanggung jawab yang jelas, peningkatan untuk setiap model tidak memengaruhi yang lain. Pemisahan ini meningkatkan pemeliharaan dan kinerja, dan mengurangi kompleksitas aplikasi saat tumbuh.

Antarmuka dalam model Customer Command:
Create Customer()UpdateCustomer()DeleteCustomer()AddPoints()RedeemPoints()
Antarmuka dalam model Customer Query:
GetVIPCustomers()GetCustomerList()GetCustomerPoints()GetMonthlyStatement()
Misalnya kode, lihat Direktori kode sumber.
Pola CQRS kemudian memisahkan database. Decoupling ini mengarah pada independensi total setiap layanan, yang merupakan bahan utama arsitektur microservice.

Dengan menggunakan CQRS di AWS Cloud, Anda dapat mengoptimalkan setiap layanan lebih lanjut. Misalnya, Anda dapat mengatur pengaturan komputasi yang berbeda atau memilih antara layanan mikro tanpa server atau berbasis kontainer. Anda dapat mengganti caching lokal dengan Amazon. ElastiCache Jika memiliki publish/subscribe pesan lokal, Anda dapat menggantinya dengan Amazon Simple Notification Service (Amazon SNS). Selain itu, Anda dapat memanfaatkan pay-as-you-go harga dan beragam layanan AWS yang Anda bayar hanya untuk apa yang Anda gunakan.
CQRS mencakup manfaat berikut:
Penskalaan independen — Setiap model dapat memiliki strategi penskalaan yang disesuaikan untuk memenuhi persyaratan dan permintaan layanan. Mirip dengan aplikasi berkinerja tinggi, memisahkan baca dan tulis memungkinkan model untuk menskalakan secara independen untuk memenuhi setiap permintaan. Anda juga dapat menambah atau mengurangi sumber daya komputasi untuk mengatasi permintaan skalabilitas dari satu model tanpa mempengaruhi yang lain.
Pemeliharaan independen - Pemisahan model kueri dan perintah meningkatkan pemeliharaan model. Anda dapat membuat perubahan kode dan penyempurnaan ke satu model tanpa mempengaruhi yang lain.
Keamanan — Lebih mudah menerapkan izin dan kebijakan untuk memisahkan model untuk dibaca dan ditulis.
Bacaan yang dioptimalkan - Anda dapat menentukan skema yang dioptimalkan untuk kueri. Misalnya, Anda dapat menentukan skema untuk data agregat dan skema terpisah untuk tabel fakta.
Integrasi — CQRS cocok dengan model pemrograman berbasis acara.
Kompleksitas terkelola - Pemisahan menjadi model kueri dan perintah cocok untuk domain yang kompleks.
Saat menggunakan CQRS, ingatlah peringatan berikut:
Pola CQRS hanya berlaku untuk bagian tertentu dari aplikasi dan bukan seluruh aplikasi. Jika diterapkan pada domain yang tidak sesuai dengan pola, dapat mengurangi produktivitas, meningkatkan risiko, dan menimbulkan kompleksitas.
Pola ini bekerja paling baik untuk model yang sering digunakan yang memiliki operasi baca dan tulis ketidakseimbangan.
Untuk aplikasi read-heavy, seperti laporan besar yang membutuhkan waktu untuk diproses, CQRS memberi Anda opsi untuk memilih database yang tepat dan membuat skema untuk menyimpan data agregat Anda. Ini meningkatkan waktu respons membaca dan melihat laporan dengan memproses data laporan hanya satu kali dan membuangnya dalam tabel agregat.
Untuk aplikasi berat tulis, Anda dapat mengonfigurasi database untuk operasi penulisan dan memungkinkan layanan mikro perintah untuk menskalakan secara independen ketika permintaan untuk menulis meningkat. Sebagai contoh, lihat
AWS.APG.CQRSES.CommandRedeemRewardLambdadanAWS.APG.CQRSES.CommandAddRewardLambdalayanan mikro.
Sumber acara
Langkah selanjutnya adalah menggunakan sumber acara untuk menyinkronkan database kueri saat perintah dijalankan. Misalnya, pertimbangkan peristiwa-peristiwa berikut:
Poin hadiah pelanggan ditambahkan yang mengharuskan total atau poin hadiah gabungan pelanggan dalam database kueri diperbarui.
Nama belakang pelanggan diperbarui dalam database perintah, yang mengharuskan informasi pelanggan pengganti dalam database kueri diperbarui.
Dalam model CRUD tradisional, Anda memastikan konsistensi data dengan mengunci data hingga menyelesaikan transaksi. Dalam sumber acara, data disinkronkan melalui penerbitan serangkaian acara yang akan dikonsumsi oleh pelanggan untuk memperbarui data masing-masing.
Pola sumber peristiwa memastikan dan mencatat serangkaian tindakan lengkap yang diambil pada data dan menerbitkannya melalui serangkaian peristiwa. Peristiwa ini mewakili serangkaian perubahan pada data yang harus diproses oleh pelanggan acara tersebut agar catatan mereka diperbarui. Peristiwa ini dikonsumsi oleh pelanggan, menyinkronkan data pada database pelanggan. Dalam hal ini, itulah database query.
Diagram berikut menunjukkan sumber peristiwa yang digunakan dengan CQRS di AWS.

Fungsi Command Lambda melakukan operasi tulis, seperti membuat, memperbarui, atau menghapus, pada database.
Fungsi Query Lambda melakukan operasi baca, seperti dapatkan atau pilih, pada database.
Fungsi Lambda ini memproses aliran DynamoDB dari database Command dan memperbarui database Query untuk perubahan. Anda juga dapat menggunakan fungsi ini juga untuk mempublikasikan pesan ke Amazon SNS sehingga pelanggannya dapat memproses data.
(Opsional) Pelanggan acara Lambda memproses pesan yang diterbitkan oleh Amazon SNS dan memperbarui database Kueri.
(Opsional) Amazon SNS mengirimkan pemberitahuan email tentang operasi tulis.
Di AWS, database kueri dapat disinkronkan oleh DynamoDB Streams. DynamoDB menangkap urutan modifikasi tingkat item yang diurutkan waktu dalam tabel DynamoBDB dalam waktu nyaris nyata dan tahan lama menyimpan informasi dalam waktu 24 jam.
Mengaktifkan DynamoDB Streams memungkinkan database untuk mempublikasikan urutan peristiwa yang memungkinkan pola sumber peristiwa. Pola sumber acara menambahkan pelanggan acara. Aplikasi pelanggan acara mengkonsumsi acara dan memprosesnya tergantung pada tanggung jawab pelanggan. Pada diagram sebelumnya, pelanggan acara mendorong perubahan ke database Query DynamoDB untuk menjaga data tetap disinkronkan. Penggunaan Amazon SNS, broker pesan, dan aplikasi pelanggan acara membuat arsitektur dipisahkan.
Sumber acara mencakup manfaat berikut:
Konsistensi untuk data transaksional
Jejak audit yang andal dan riwayat tindakan, yang dapat digunakan untuk memantau tindakan yang diambil dalam data
Memungkinkan aplikasi terdistribusi seperti microservices untuk menyinkronkan data mereka di seluruh lingkungan
Publikasi acara yang andal setiap kali negara berubah
Rekonstruksi atau pemutaran ulang keadaan masa lalu
Entitas yang digabungkan secara longgar yang bertukar peristiwa untuk migrasi dari aplikasi monolitik ke layanan mikro
Pengurangan konflik yang disebabkan oleh pembaruan bersamaan; sumber acara menghindari persyaratan untuk memperbarui objek secara langsung di penyimpanan data
Fleksibilitas dan ekstensibilitas dari memisahkan tugas dan acara
Pembaruan sistem eksternal
Manajemen beberapa tugas dalam satu acara
Saat menggunakan sumber acara, ingatlah peringatan berikut:
Karena ada beberapa keterlambatan dalam memperbarui data antara database pelanggan sumber, satu-satunya cara untuk membatalkan perubahan adalah dengan menambahkan acara kompensasi ke toko acara.
Menerapkan sumber acara memiliki kurva pembelajaran karena gaya pemrogramannya yang berbeda.
Data uji
Gunakan data pengujian berikut untuk menguji fungsi Lambda setelah penerapan berhasil.
CommandCreate Pelanggan
{ "Id":1501, "Firstname":"John", "Lastname":"Done", "CompanyName":"AnyCompany", "Address": "USA", "VIP":true }
CommandUpdate Pelanggan
{ "Id":1501, "Firstname":"John", "Lastname":"Doe", "CompanyName":"Example Corp.", "Address": "Seattle, USA", "VIP":true }
CommandDelete Pelanggan
Masukkan ID pelanggan sebagai data permintaan. Misalnya, jika ID pelanggan adalah 151, masukkan 151 sebagai data permintaan.
151
QueryCustomerList
Ini kosong. Ketika dipanggil, itu akan mengembalikan semua pelanggan.
CommandAddReward
Ini akan menambah 40 poin untuk pelanggan dengan ID 1 (Richard).
{ "Id":10101, "CustomerId":1, "Points":40 }
CommandRedeemReward
Ini akan mengurangi 15 poin untuk pelanggan dengan ID 1 (Richard).
{ "Id":10110, "CustomerId":1, "Points":15 }
QueryReward
Masukkan ID pelanggan. Misalnya, masukkan 1 untuk Richard, 2 untuk Arnav, dan 3 untuk Shirley.
2
Direktori kode sumber
Gunakan tabel berikut sebagai panduan untuk struktur direktori solusi Visual Studio.
Direktori solusi Contoh Kode Lokal CQRS

Model CRUD pelanggan
Contoh Kode Lokal CQRS\ Model CRUD\ Proyek AWS.APG.CQRSES.DAL
Versi CQRS dari model CRUD Pelanggan
Perintah pelanggan:
CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.CommandproyekPermintaan pelanggan:
CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Queryproyek
Layanan mikro Command dan Query
Layanan mikro Command berada di bawah folder CQRS On-Premises Code Sample\CQRS Model\Command Microservice solusi:
AWS.APG.CQRSES.CommandMicroserviceProyek API ASP.NET Core bertindak sebagai titik masuk di mana konsumen berinteraksi dengan layanan.AWS.APG.CQRSES.Command.NET Core adalah objek yang menampung objek dan antarmuka yang berhubungan dengan perintah.
Layanan mikro kueri ada di bawah folder CQRS On-Premises Code Sample\CQRS Model\Query Microservice solusi:
AWS.APG.CQRSES.QueryMicroserviceProyek API ASP.NET Core bertindak sebagai titik masuk di mana konsumen berinteraksi dengan layanan.AWS.APG.CQRSES.Query.NET Core adalah objek yang menampung objek dan antarmuka terkait kueri.
Direktori solusi kode tanpa server CQRS AWS

Kode ini adalah versi AWS dari kode lokal yang menggunakan layanan tanpa server AWS.
Dalam C# .NET Core, setiap fungsi Lambda diwakili oleh satu proyek .NET Core. Dalam contoh kode pola ini, ada proyek terpisah untuk setiap antarmuka dalam model perintah dan kueri.
CQRS menggunakan layanan AWS
Anda dapat menemukan direktori solusi root untuk CQRS menggunakan layanan tanpa server AWS ada di folder. CQRS AWS Serverless\CQRS Contohnya mencakup dua model: Pelanggan dan Hadiah.
Perintah Lambda berfungsi untuk Pelanggan dan Hadiah berada di bawah CQRS\Command Microservice\Customer dan CQRS\Command Microservice\Reward folder. Mereka berisi proyek Lambda berikut:
Perintah pelanggan:
CommandCreateLambda,CommandDeleteLambda, danCommandUpdateLambdaPerintah hadiah:
CommandAddRewardLambdadanCommandRedeemRewardLambda
Fungsi Lambda kueri untuk Pelanggan dan Hadiah ditemukan di bawah folder CQRS\Query Microservice\Customer danCQRS\QueryMicroservice\Reward. Mereka berisi proyek QueryCustomerListLambda dan QueryRewardLambda Lambda.
Proyek uji CQRS
Proyek pengujian ada di bawah CQRS\Tests folder. Proyek ini berisi skrip pengujian untuk mengotomatiskan pengujian fungsi Lambda CQRS.
Sumber acara menggunakan layanan AWS
Penangan peristiwa Lambda berikut diprakarsai oleh aliran DynamoDB Pelanggan dan Reward untuk memproses dan menyinkronkan data dalam tabel kueri.
Fungsi
EventSourceCustomerLambda dipetakan ke alirancqrses-customer-cmdDynamoDB tabel Pelanggan ().Fungsi
EventSourceRewardLambda dipetakan ke alirancqrses-reward-cmdDynamoDB tabel Reward ().
Lampiran
Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip