Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menerapkan pola saga tanpa server dengan menggunakan AWS Step Functions
Tabby Ward, Joe Kern, dan Rohan Mehta, Amazon Web Services
Ringkasan
Dalam arsitektur layanan mikro, tujuan utamanya adalah membangun komponen terpisah dan independen untuk mempromosikan kelincahan, fleksibilitas, dan waktu yang lebih cepat untuk memasarkan aplikasi Anda. Sebagai hasil dari decoupling, setiap komponen microservice memiliki lapisan persistensi datanya sendiri. Dalam arsitektur terdistribusi, transaksi bisnis dapat menjangkau beberapa layanan mikro. Karena layanan mikro ini tidak dapat menggunakan transaksi atomisitas, konsistensi, isolasi, daya tahan (ACID) tunggal, Anda mungkin berakhir dengan transaksi sebagian. Dalam hal ini, diperlukan beberapa logika kontrol untuk membatalkan transaksi yang telah diproses. Pola saga terdistribusi biasanya digunakan untuk tujuan ini.
Pola saga adalah pola manajemen kegagalan yang membantu membangun konsistensi dalam aplikasi terdistribusi dan mengkoordinasikan transaksi antara beberapa layanan mikro untuk menjaga konsistensi data. Ketika Anda menggunakan pola saga, setiap layanan yang melakukan transaksi menerbitkan peristiwa yang memicu layanan berikutnya untuk melakukan transaksi berikutnya dalam rantai. Ini berlanjut sampai transaksi terakhir dalam rantai selesai. Jika transaksi bisnis gagal, saga mengatur serangkaian transaksi kompensasi yang membatalkan perubahan yang dilakukan oleh transaksi sebelumnya.
Pola ini menunjukkan cara mengotomatiskan penyiapan dan penerapan aplikasi sampel (yang menangani reservasi perjalanan) dengan teknologi tanpa server seperti AWS Step Functions, AWS Lambda, dan Amazon DynamoDB. Aplikasi sampel juga menggunakan Amazon API Gateway dan Amazon Simple Notification Service (Amazon SNS) untuk mengimplementasikan koordinator eksekusi saga. Pola ini dapat diterapkan dengan kerangka infrastruktur sebagai kode (IAc) seperti AWS Cloud Development Kit (AWS CDK), AWS Serverless Application Model (AWS SAM), atau Terraform.
Untuk informasi selengkapnya tentang pola saga dan pola persistensi data lainnya, lihat panduan Mengaktifkan persistensi data dalam layanan mikro di situs web AWS Prescriptive Guidance.
Prasyarat dan batasan
Prasyarat
Akun AWS yang aktif.
Izin untuk membuat CloudFormation tumpukan AWS. Untuk informasi selengkapnya, lihat Mengontrol akses dalam CloudFormation dokumentasi.
Kerangka kerja IAC pilihan Anda (AWS CDK, AWS SAM, atau Terraform) dikonfigurasi dengan akun AWS Anda sehingga Anda dapat menggunakan kerangka kerja CLI untuk menyebarkan aplikasi.
NodeJS, digunakan untuk membangun aplikasi dan menjalankannya secara lokal.
Editor kode pilihan Anda (seperti Visual Studio Code, Sublime, atau Atom).
Versi produk
Batasan
Sumber acara adalah cara alami untuk menerapkan pola orkestrasi saga dalam arsitektur layanan mikro di mana semua komponen digabungkan secara longgar dan tidak memiliki pengetahuan langsung satu sama lain. Jika transaksi Anda melibatkan sejumlah kecil langkah (tiga hingga lima), pola saga mungkin sangat cocok. Namun kompleksitas meningkat dengan jumlah layanan mikro dan jumlah langkah.
Pengujian dan debugging dapat menjadi sulit ketika Anda menggunakan desain ini, karena Anda harus menjalankan semua layanan untuk mensimulasikan pola transaksi.
Arsitektur
Arsitektur target
Arsitektur yang diusulkan menggunakan AWS Step Functions untuk membangun pola saga untuk memesan penerbangan, memesan penyewaan mobil, dan memproses pembayaran untuk liburan.
Diagram alur kerja berikut menggambarkan aliran khas sistem reservasi perjalanan. Alur kerja terdiri dari pemesanan perjalanan udara (” ReserveFlight “), memesan mobil (” ReserveCarRental “), memproses pembayaran (” ProcessPayment “), konfirmasi reservasi penerbangan (” ConfirmFlight “), dan konfirmasi penyewaan mobil (” ConfirmCarRental “) diikuti dengan pemberitahuan keberhasilan ketika langkah-langkah ini selesai. Namun, jika sistem menemukan kesalahan dalam menjalankan salah satu transaksi ini, itu mulai gagal mundur. Misalnya, kesalahan dengan pemrosesan pembayaran (” ProcessPayment “) memicu pengembalian uang (” RefundPayment “), yang kemudian memicu pembatalan mobil sewaan dan penerbangan (” CancelRentalReservation "dan" CancelFlightReservation “), yang mengakhiri seluruh transaksi dengan pesan kegagalan.
Pola ini menyebarkan fungsi Lambda terpisah untuk setiap tugas yang disorot dalam diagram serta tiga tabel DynamoDB untuk penerbangan, penyewaan mobil, dan pembayaran. Setiap fungsi Lambda membuat, memperbarui, atau menghapus baris di tabel DynamoDB masing-masing, tergantung pada apakah transaksi dikonfirmasi atau digulung kembali. Pola ini menggunakan Amazon SNS untuk mengirim pesan teks (SMS) ke pelanggan, memberi tahu mereka tentang transaksi yang gagal atau berhasil.

Otomatisasi dan skala
Anda dapat membuat konfigurasi untuk arsitektur ini dengan menggunakan salah satu kerangka kerja IAc. Gunakan salah satu tautan berikut untuk IAc pilihan Anda.
Alat
Layanan AWS
AWS Step Functions
adalah layanan orkestrasi tanpa server yang memungkinkan Anda menggabungkan fungsi AWS Lambda dan layanan AWS lainnya untuk membangun aplikasi yang penting bagi bisnis. Melalui konsol grafis Step Functions, Anda melihat alur kerja aplikasi Anda sebagai serangkaian langkah berbasis peristiwa. Amazon DynamoDB
adalah layanan database NoSQL yang dikelola sepenuhnya yang memberikan kinerja yang cepat dan dapat diprediksi dengan skalabilitas yang mulus. Anda dapat menggunakan DynamoDB untuk membuat tabel basis data yang dapat menyimpan dan mengambil data dalam jumlah berapa pun, dan melayani tingkat lalu lintas permintaan apapun. AWS Lambda
adalah layanan komputasi yang memungkinkan Anda 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. Amazon API Gateway
adalah layanan AWS untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs pada skala apa pun. Amazon Simple Notification Service (Amazon SNS
) adalah layanan terkelola yang menyediakan pengiriman pesan dari penerbit ke pelanggan. AWS Cloud Development Kit (AWS CDK)
adalah kerangka kerja pengembangan perangkat lunak untuk mendefinisikan sumber daya aplikasi cloud Anda dengan menggunakan bahasa pemrograman yang sudah dikenal seperti TypeScript,, JavaScript Python, Java, dan C#/Net. AWS Serverless Application Model (AWS SAM) adalah kerangka kerja sumber terbuka untuk membangun aplikasi
tanpa server. Ini menyediakan sintaks singkatan untuk mengekspresikan fungsi, database APIs, dan pemetaan sumber peristiwa.
Kode
Kode untuk contoh aplikasi yang menunjukkan pola saga, termasuk template IAC (AWS CDK, AWS SAM, atau Terraform), fungsi Lambda, dan tabel DynamoDB dapat ditemukan di tautan berikut. Ikuti instruksi dalam epik pertama untuk menginstal ini.
Epik
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Instal paket NPM. | Buat direktori baru, arahkan ke direktori itu di terminal, dan kloning GitHub repositori pilihan Anda dari bagian Kode sebelumnya dalam pola ini. Di folder root yang memiliki
| Pengembang, arsitek Cloud |
Kompilasi skrip. | Di folder root, jalankan perintah berikut untuk menginstruksikan TypeScript transpiler untuk membuat semua file yang diperlukan JavaScript :
| Pengembang, arsitek Cloud |
Perhatikan perubahan dan kompilasi ulang. | Di folder root, jalankan perintah berikut di jendela terminal terpisah untuk melihat perubahan kode, dan kompilasi kode ketika mendeteksi perubahan:
| Pengembang, arsitek Cloud |
Jalankan pengujian unit (hanya AWS CDK). | Jika Anda menggunakan AWS CDK, di folder root, jalankan perintah berikut untuk melakukan pengujian unit Jest:
| Pengembang, arsitek Cloud |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Terapkan tumpukan demo ke AWS. | pentingDi folder root, jalankan perintah berikut untuk membuat perakitan penerapan dan menerapkannya ke akun AWS default dan Wilayah. AWS CDK:
AWS SAM:
Terraform:
Langkah ini mungkin memakan waktu beberapa menit untuk menyelesaikannya. Perintah ini menggunakan kredensyal default yang dikonfigurasi untuk AWS CLI. Perhatikan URL API Gateway yang ditampilkan di konsol setelah penerapan selesai. Anda akan memerlukan informasi ini untuk menguji alur eksekusi saga. | Pengembang, arsitek Cloud |
Bandingkan tumpukan yang diterapkan dengan status saat ini. | Di folder root, jalankan perintah berikut untuk membandingkan tumpukan yang diterapkan dengan status saat ini setelah membuat perubahan pada kode sumber: AWS CDK:
AWS SAM:
Terraform:
| Pengembang, arsitek Cloud |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Uji alur eksekusi saga. | Arahkan ke URL API Gateway yang Anda catat di langkah sebelumnya, saat Anda menerapkan tumpukan. URL ini memicu mesin status untuk memulai. Untuk informasi selengkapnya tentang cara memanipulasi aliran mesin status dengan meneruskan parameter URL yang berbeda, lihat bagian Informasi tambahan. Untuk melihat hasilnya, masuk ke AWS Management Console dan navigasikan ke konsol Step Functions. Di sini, Anda dapat melihat setiap langkah dari mesin saga state. Anda juga dapat melihat tabel DynamoDB untuk melihat catatan yang disisipkan, diperbarui, atau dihapus. Jika Anda sering menyegarkan layar, Anda dapat melihat perubahan status transaksi dari Anda dapat berlangganan topik SNS dengan memperbarui kode dalam | Pengembang, arsitek Cloud |
| Tugas | Deskripsi | Keterampilan yang dibutuhkan |
|---|---|---|
Pembersihan sumber daya | Untuk membersihkan sumber daya yang digunakan untuk aplikasi ini, Anda dapat menggunakan salah satu perintah berikut. AWS CDK:
AWS SAM:
Terraform:
| Pengembang aplikasi, arsitek Cloud |
Sumber daya terkait
Makalah teknis
Dokumentasi layanan AWS
Tutorial
Informasi tambahan
Kode
Untuk tujuan pengujian, pola ini menerapkan API Gateway dan fungsi Lambda pengujian yang memicu mesin status Step Functions. Dengan Step Functions, Anda dapat mengontrol fungsionalitas sistem reservasi perjalanan dengan meneruskan run_type parameter untuk meniru kegagalan di “ReserveFlightReserveCarRental,” “ProcessPayment,” “ConfirmFlight,” dan “ConfirmCarRental.”
Fungsi saga Lambda (sagaLambda.ts) mengambil input dari parameter kueri di URL API Gateway, membuat objek JSON berikut, dan meneruskannya ke Step Functions untuk dieksekusi:
let input = { "trip_id": tripID, // value taken from query parameter, default is AWS request ID "depart_city": "Detroit", "depart_time": "2021-07-07T06:00:00.000Z", "arrive_city": "Frankfurt", "arrive_time": "2021-07-09T08:00:00.000Z", "rental": "BMW", "rental_from": "2021-07-09T00:00:00.000Z", "rental_to": "2021-07-17T00:00:00.000Z", "run_type": runType // value taken from query parameter, default is "success" };
Anda dapat bereksperimen dengan aliran yang berbeda dari mesin status Step Functions dengan meneruskan parameter URL berikut:
Eksekusi Berhasil ─ https://{api gateway url}
Penerbangan Cadangan Gagal ─ https://{api gateway url}? RunType= failFlightsReservation
Konfirmasikan Penerbangan Gagal ─ https://{api gateway url}? RunType= failFlightsConfirmation
Cadangan Sewa Mobil Gagal ─ https://{api gateway url}? RunType= failCarRental Reservasi
Konfirmasikan Gagal Sewa Mobil ─ https://{api gateway url}? RunType= Konfirmasi failCarRental
Proses Pembayaran Gagal ─ https://{api gateway url}? runType=Kegagalan pembayaran
Lulus ID Perjalanan ─ https://{api gateway url}? tripid= {secara default, ID trip akan menjadi ID permintaan AWS}
Template IAc
Repositori tertaut menyertakan templat IAC yang dapat Anda gunakan untuk membuat seluruh contoh aplikasi reservasi perjalanan.
Tabel DynamoDB
Berikut adalah model data untuk penerbangan, penyewaan mobil, dan tabel pembayaran.
Flight Data Model: var params = { TableName: process.env.TABLE_NAME, Item: { 'pk' : {S: event.trip_id}, 'sk' : {S: flightReservationID}, 'trip_id' : {S: event.trip_id}, 'id': {S: flightReservationID}, 'depart_city' : {S: event.depart_city}, 'depart_time': {S: event.depart_time}, 'arrive_city': {S: event.arrive_city}, 'arrive_time': {S: event.arrive_time}, 'transaction_status': {S: 'pending'} } }; Car Rental Data Model: var params = { TableName: process.env.TABLE_NAME, Item: { 'pk' : {S: event.trip_id}, 'sk' : {S: carRentalReservationID}, 'trip_id' : {S: event.trip_id}, 'id': {S: carRentalReservationID}, 'rental': {S: event.rental}, 'rental_from': {S: event.rental_from}, 'rental_to': {S: event.rental_to}, 'transaction_status': {S: 'pending'} } }; Payment Data Model: var params = { TableName: process.env.TABLE_NAME, Item: { 'pk' : {S: event.trip_id}, 'sk' : {S: paymentID}, 'trip_id' : {S: event.trip_id}, 'id': {S: paymentID}, 'amount': {S: "750.00"}, // hard coded for simplicity as implementing any monetary transaction functionality is beyond the scope of this pattern 'currency': {S: "USD"}, 'transaction_status': {S: "confirmed"} } };
Fungsi Lambda
Fungsi-fungsi berikut akan dibuat untuk mendukung aliran dan eksekusi mesin state di Step Functions:
Reserve Flights: Menyisipkan catatan ke dalam tabel DynamoDB Flights dengan
pendingjumlah,transaction_statusuntuk memesan penerbangan.Konfirmasi Penerbangan: Memperbarui catatan di tabel DynamoDB Flights, untuk
transaction_statusdisetelconfirmedke, untuk mengonfirmasi penerbangan.Batalkan Reservasi Penerbangan: Menghapus catatan dari tabel DynamoDB Flights, untuk membatalkan penerbangan yang tertunda.
Reserve Car Rentals: Menyisipkan catatan ke dalam tabel CarRentals DynamoDB dengan, untuk
transaction_statusmemesanpendingsewa mobil.Konfirmasikan Penyewaan Mobil: Memperbarui catatan di tabel CarRentals DynamoDB, untuk
transaction_statusmengatur ke,confirmeduntuk mengkonfirmasi sewa mobil.Batalkan Reservasi Penyewaan Mobil: Menghapus catatan dari tabel CarRentals DynamoDB, untuk membatalkan sewa mobil yang tertunda.
Proses Pembayaran: Menyisipkan catatan ke dalam tabel Pembayaran DynamoDB untuk pembayaran.
Batalkan Pembayaran: Menghapus catatan dari tabel Pembayaran DynamoDB untuk pembayaran.
Amazon SNS
Aplikasi sampel membuat topik dan langganan berikut untuk mengirim pesan SMS dan memberi tahu pelanggan tentang pemesanan yang berhasil atau gagal. Jika Anda ingin menerima pesan teks saat menguji aplikasi sampel, perbarui langganan SMS dengan nomor telepon Anda yang valid di file definisi mesin negara.
Cuplikan AWS CDK (tambahkan nomor telepon di baris kedua dari kode berikut):
const topic = new sns.Topic(this, 'Topic'); topic.addSubscription(new subscriptions.SmsSubscription('+11111111111')); const snsNotificationFailure = new tasks.SnsPublish(this ,'SendingSMSFailure', { topic:topic, integrationPattern: sfn.IntegrationPattern.REQUEST_RESPONSE, message: sfn.TaskInput.fromText('Your Travel Reservation Failed'), }); const snsNotificationSuccess = new tasks.SnsPublish(this ,'SendingSMSSuccess', { topic:topic, integrationPattern: sfn.IntegrationPattern.REQUEST_RESPONSE, message: sfn.TaskInput.fromText('Your Travel Reservation is Successful'), });
Cuplikan AWS SAM (ganti +1111111111 string dengan nomor telepon Anda yang valid):
StateMachineTopic11111111111: Type: 'AWS::SNS::Subscription' Properties: Protocol: sms TopicArn: Ref: StateMachineTopic Endpoint: '+11111111111' Metadata: 'aws:sam:path': SamServerlessSagaStack/StateMachine/Topic/+11111111111/Resource
Cuplikan Terraform (ganti +111111111 string dengan nomor telepon Anda yang valid):
resource "aws_sns_topic_subscription" "sms-target" { topic_arn = aws_sns_topic.topic.arn protocol = "sms" endpoint = "+11111111111" }
Reservasi yang berhasil
Alur berikut menggambarkan reservasi yang berhasil dengan “ReserveFlight,” “ReserveCarRental,” dan "ProcessPayment" diikuti oleh "ConfirmFlight" dan "ConfirmCarRental.” Pelanggan diberitahu tentang pemesanan yang berhasil melalui pesan SMS yang dikirim ke pelanggan topik SNS.

Reservasi gagal
Aliran ini adalah contoh kegagalan dalam pola saga. Jika, setelah memesan penerbangan dan penyewaan mobil, ProcessPayment "" gagal, langkah-langkah dibatalkan dalam urutan terbalik. Reservasi dirilis, dan pelanggan diberitahu tentang kegagalan melalui pesan SMS yang dikirim ke pelanggan topik SNS.
