

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
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing"></a>

*Rodolfo Jr. Cerrada, Dmitry Gulin, dan Tabby Ward, Amazon Web* Services

## Ringkasan
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-summary"></a>

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 (\$1.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](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

## Prasyarat dan batasan
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-prereqs"></a>

**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**
+ [Edisi Komunitas Visual Studio 2019](https://visualstudio.microsoft.com/downloads/).
+ [AWS Toolkit for Visual Studio 2019](https://aws.amazon.com/visualstudio/).
+ .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 `CustomerData` dalam memori, yang bertindak sebagai database tiruan. Kode yang diberikan cukup bagi Anda untuk menguji polanya.

## Arsitektur
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-architecture"></a>

**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).

![\[Koneksi antara aplikasi, antarmuka layanan, model CRUD pelanggan, dan database.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1cd3a84c-12c7-4306-99aa-23f2c53d3cd3.png)


**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](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

![\[Aplikasi yang terhubung dengan layanan mikro Customer Command dan Customer Query tanpa server.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1c665697-e3ac-4ef4-98d0-86c2cbf164c1.png)


1. Fungsi Command Lambda melakukan operasi tulis, seperti membuat, memperbarui, atau menghapus, pada database.

1. Fungsi Query Lambda melakukan operasi baca, seperti dapatkan atau pilih, pada database.

1. Fungsi Lambda ini memproses aliran DynamoDB dari database Command dan memperbarui database Query untuk perubahan.

## Alat
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-tools"></a>

**Alat**
+ [Amazon DynamoDB - Amazon](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 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](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) 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](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) — 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](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html) — AWS Management Console adalah aplikasi web yang terdiri dari koleksi luas konsol layanan untuk mengelola layanan AWS.
+ [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/) — 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](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html).
+ [AWS Toolkit for Visual](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) 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
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-epics"></a>

### Buka dan bangun solusinya
<a name="open-and-build-the-solution"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buka solusinya. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 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.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 

### Membangun tabel DynamoDB
<a name="build-the-dynamodb-tables"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Berikan kredensyal. | Jika Anda belum memiliki kunci akses, lihat video di bagian *Sumber daya terkait*.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 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 | 

### Jalankan tes lokal
<a name="run-local-tests"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Membangun proyek CQRS. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi, Insinyur uji | 
| Bangun proyek sumber acara. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 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 | 

### Publikasikan fungsi Lambda CQRS ke AWS
<a name="publish-the-cqrs-lambda-functions-to-aws"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Publikasikan fungsi Lambda pertama. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | 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. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Semua proyek Lambda CQRS ditemukan di bawah folder dan solusi. `CQRS AWS Serverless\CQRS\Command Microservice` ` CQRS AWS Serverless\CQRS\Command Microservice` Untuk direktori solusi dan proyek, lihat **Direktori kode sumber** di bagian [Informasi tambahan](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | Pengembang aplikasi, DevOps insinyur | 
| Publikasikan fungsi yang tersisa. | Ulangi langkah sebelumnya untuk proyek-proyek berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi, DevOps insinyur | 

### Siapkan fungsi Lambda sebagai pendengar acara
<a name="set-up-the-lambda-function-as-an-event-listener"></a>


| 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 `CQRS AWS Serverless\Event Source\Reward Event` solusi `CQRS AWS Serverless\Event Source\Customer Event` dan. Untuk informasi selengkapnya, lihat *Direktori kode sumber* di bagian [Informasi tambahan](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | Pengembang aplikasi | 
| Lampirkan pendengar acara Lambda sumber acara. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)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 `EventSourceReward` Lambda, ulangi langkah-langkah dalam dua cerita sebelumnya, pilih **cqrses-reward-cmd**dari daftar dropdown tabel DynamoDB.** | Pengembang aplikasi | 

### Menguji dan memvalidasi aliran DynamoDB dan pemicu Lambda
<a name="test-and-validate-the-dynamodb-streams-and-lambda-trigger"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Uji aliran dan pemicu Lambda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 
| Validasi, menggunakan tabel query reward DynamoddB. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 
| Validasi, menggunakan CloudWatch Log. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 
| Validasi EventSourceCustomer pemicunya. | Untuk memvalidasi `EventSourceCustomer` pemicu, ulangi langkah-langkah dalam epik ini, menggunakan tabel dan CloudWatch log pelanggan masing-masing `EventSourceCustomer` pemicu. | Pengembang aplikasi | 

## Sumber daya terkait
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-resources"></a>

**Referensi**
+ [Unduhan Edisi Komunitas Visual Studio 2019](https://visualstudio.microsoft.com/downloads/)
+ [Unduhan AWS Toolkit for Visual Studio](https://aws.amazon.com/visualstudio/)
+ [Panduan Pengguna AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html)
+ [Tanpa server di AWS](https://aws.amazon.com/serverless/)
+ [Kasus Penggunaan DynamoDB dan Pola Desain](https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/)
+ [Martin Fowler CQRS](https://martinfowler.com/bliki/CQRS.html)
+ [Sumber Acara Martin Fowler](https://martinfowler.com/eaaDev/EventSourcing.html)

**Video**
+ [AWS Toolkit untuk demo AWS Toolkit for Visual Studio](https://www.youtube.com/watch?v=B190tcu1ERk)
+ [Bagaimana cara membuat ID kunci akses untuk pengguna IAM baru?](https://www.youtube.com/watch?v=665RYobRJDY)

## Informasi tambahan
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional"></a>

**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.

![\[Arsitektur dengan antarmuka layanan, model CRUD, dan database.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/3f64756d-681e-4f0e-8034-746263d857b2.png)


1. 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.

![\[Aplikasi dipisahkan menjadi model perintah dan kueri, berbagi database tunggal.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/12db023c-eb81-4c27-bbb9-b085b13176ae.png)


 

1. Antarmuka dalam model Customer Command:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`

1. 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.

![\[Database terpisah untuk model perintah dan kueri.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/016dbfa8-3bd8-42ee-afa1-38a98986c7d5.png)


 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.CommandRedeemRewardLambda` dan `AWS.APG.CQRSES.CommandAddRewardLambda` layanan 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.

![\[Arsitektur layanan mikro untuk CQRS dan pola sumber acara menggunakan layanan tanpa server AWS.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/cc9bc84a-60b4-4459-9a5c-2334c69dbb4e.png)


1. Fungsi Command Lambda melakukan operasi tulis, seperti membuat, memperbarui, atau menghapus, pada database.

1. Fungsi Query Lambda melakukan operasi baca, seperti dapatkan atau pilih, pada database.

1. 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.

1. (Opsional) Pelanggan acara Lambda memproses pesan yang diterbitkan oleh Amazon SNS dan memperbarui database Kueri.

1. (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*

![\[Direktori solusi dengan layanan Command dan Query diperluas.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/4811c2c0-643b-410f-bb87-0b86ec5e194c.png)


**Model CRUD pelanggan**

Contoh Kode Lokal CQRS\$1 Model CRUD\$1 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.Command` proyek
+ Permintaan pelanggan: `CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query` proyek

**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.CommandMicroservice`Proyek 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.QueryMicroservice`Proyek 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*

![\[Direktori solusi yang menampilkan layanan mikro dan sumber acara diperluas.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/23f8655c-95ad-422c-b20a-e29dc145e995.png)


 

Kode ini adalah versi AWS dari kode lokal yang menggunakan layanan tanpa server AWS.

Dalam C\$1 .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`, dan `CommandUpdateLambda`
+ Perintah hadiah: `CommandAddRewardLambda` dan `CommandRedeemRewardLambda`

Fungsi Lambda kueri untuk Pelanggan dan Hadiah ditemukan di bawah folder `CQRS\Query Microservice\Customer` dan`CQRS\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 `EventSourceCustomer` Lambda dipetakan ke aliran `cqrses-customer-cmd` DynamoDB tabel Pelanggan ().
+ Fungsi `EventSourceReward` Lambda dipetakan ke aliran `cqrses-reward-cmd` DynamoDB tabel Reward ().

## Lampiran
<a name="attachments-9f1bc700-def4-4201-bb2d-f1fa27404f15"></a>

[Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip](samples/p-attach/9f1bc700-def4-4201-bb2d-f1fa27404f15/attachments/attachment.zip)