Menerapkan pola saga tanpa server dengan menggunakan AWS Step Functions - AWS Prescriptive Guidance

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. 

Alur kerja untuk sistem reservasi perjalanan berdasarkan pola saga.

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

TugasDeskripsiKeterampilan 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 package.json file, jalankan perintah berikut untuk mengunduh dan menginstal semua paket Node Package Manager (NPM):

npm install
Pengembang, arsitek Cloud

Kompilasi skrip.

Di folder root, jalankan perintah berikut untuk menginstruksikan TypeScript transpiler untuk membuat semua file yang diperlukan JavaScript :

npm run build
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:

npm run watch
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:

npm run test
Pengembang, arsitek Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Terapkan tumpukan demo ke AWS.

Di folder root, jalankan perintah berikut untuk membuat perakitan penerapan dan menerapkannya ke akun AWS default dan Wilayah.

AWS CDK:

cdk bootstrap cdk deploy

AWS SAM:

sam build sam deploy --guided

Terraform:

terraform init terraform apply

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:

cdk diff

AWS SAM:

sam deploy

Terraform:

terraform plan
Pengembang, arsitek Cloud
TugasDeskripsiKeterampilan 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 pending keconfirmed

Anda dapat berlangganan topik SNS dengan memperbarui kode dalam stateMachine.ts file dengan nomor ponsel Anda untuk menerima pesan SMS setelah reservasi berhasil atau gagal. Untuk informasi selengkapnya, lihat Amazon SNS di bagian Informasi tambahan.

Pengembang, arsitek Cloud
TugasDeskripsiKeterampilan yang dibutuhkan

Pembersihan sumber daya

Untuk membersihkan sumber daya yang digunakan untuk aplikasi ini, Anda dapat menggunakan salah satu perintah berikut.

AWS CDK:

cdk destroy

AWS SAM:

sam delete

Terraform:

terraform destroy
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 pending jumlah, transaction_status untuk memesan penerbangan.

  • Konfirmasi Penerbangan: Memperbarui catatan di tabel DynamoDB Flights, untuk transaction_status disetel confirmed ke, 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_status memesan pending sewa mobil.

  • Konfirmasikan Penyewaan Mobil: Memperbarui catatan di tabel CarRentals DynamoDB, untuk transaction_status mengatur ke, confirmed untuk 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.

Contoh reservasi yang berhasil diimplementasikan oleh Step Functions dengan menggunakan pola saga.

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.

Contoh reservasi gagal yang diimplementasikan oleh Step Functions dengan menggunakan pola saga.