Saat data dalam suatu alur kerja melewati beberapa keadaan, setiap keadaan menerima output dari keadaan sebelumnya sebagai input. Mengoper variabel dari satu keadaan ke keadaan berikutnya mempersulit pengiriman data lintas keadaan. CloudFlow menyediakan mekanisme variabel global untuk menyederhanakan proses ini dan meningkatkan efisiensi.
Batasan
Jika batasan ini tidak memenuhi kebutuhan Anda, Anda dapat mengajukan Tiket.
Item | Nilai maksimum |
Panjang kunci variabel | 128 Byte |
Panjang nilai variabel | 256 KiB |
Catatan
$OutputdalamGlobalConstructormengacu pada output mentah dari keadaan Task, bukan hasil konstruksi dariOutputConstructor.$GlobaldalamOutputConstructormengacu pada nilai mentah sebelum konstruksi yang dilakukan olehGlobalConstructor.
Batasan ukuran konteks
Saat CloudFlow mengirimkan data menggunakan $Global, output dari InputConstructor dan OutputConstructor harus memenuhi batasan bahwa ukuran konteks tidak boleh lebih dari 64 KiB.
Kondisi race
Variabel global menyediakan ruang penyimpanan kunci-nilai tingkat eksekusi yang dapat dibaca dan ditulis di semua keadaan sepanjang siklus hidup eksekusi. Jika terdapat logika paralel seperti map dan parallel dalam suatu alur, data dapat saling menimpa antar keadaan yang berbeda. Perhatikan saran berikut:
Gunakan kunci yang berbeda untuk menulis variabel global ke cabang-cabang yang berbeda dalam keadaan Parallel.
Jangan menulis variabel global ke dalam keadaan Map. Semua definisi iterasi Map identik, sehingga nama variabel dalam GlobalConstructor juga sama. Penulisan dengan nama variabel yang sama dari cabang berbeda akan saling menimpa satu sama lain.
Eksekusi anak dalam mode terdistribusi tidak dapat mengakses variabel global dari eksekusi induk karena tingkat
Executionantara eksekusi anak dan induk berbeda.
Gunakan variabel global untuk mengirimkan data
Variabel global menyediakan ruang penyimpanan kunci-nilai tingkat eksekusi. Setiap keadaan dalam suatu alur kerja dapat menulis data ke variabel global pada akhir eksekusi keadaan tersebut untuk diteruskan ke keadaan lain.
Pada gambar di atas, State A menggunakan GlobalConstructor untuk menyimpan data yang sesuai dengan $Input.key_a—berasal dari input hulu—ke dalam variable_a pada variabel global. State A juga menggunakan GlobalConstructor untuk menyimpan data yang sesuai dengan $Output.key_b dari output State A ke dalam variable_b pada variabel global. Alur kerja kemudian menggunakan InputConstructor untuk mengekstrak nilai variable_a dan variable_b dari variabel global dan meneruskannya ke State Z sebagai input. Dengan cara ini, data dapat dikirimkan lintas keadaan.
Input dan output alur kerja CloudFlow digunakan untuk mengirimkan data secara eksplisit antar task guna memastikan independensi dan kejelasan task. Variabel global digunakan untuk mempertahankan status berbagi lintas task atau konfigurasi resource global. Input, output, dan variabel global digunakan bersama-sama untuk mencapai desain sistem yang efisien dan fleksibel. Gambar di atas membandingkan InputConstructor, OutputConstructor, dan GlobalConstructor. Penjelasan:
InputConstructor($Context,$Global),OutputConstructor($Context,$Global), danGlobalConstructor($Context,$Global)menunjukkan bahwa InputConstructor, OutputConstructor, dan GlobalConstructor dapat mereferensi$Contextdan$Globaluntuk mengekstrak informasi.$Global=Merge($Global,GlobalConstructor($Context,$Global))menunjukkan bahwa variabel yang dikonstruksi oleh GlobalConstructor digabungkan dengan variabel yang sudah ada dalam$Global, lalu seluruh variabel disimpan kembali ke$Globaluntuk memperbarui variabel global bersama.$Outputadalah hasil panggilan Task. Jika panggilan dilakukan dalam mode callback asinkron, nilai$Outputadalah hasil dari callback tersebut.-
Pada diagram,
$Globalmerepresentasikan variabel global yang dapat diakses sepanjang eksekusi alur kerja.
Pembuatan dan pembaruan variabel global
Variabel global dibuat dan diperbarui menggunakan GlobalConstructor. Saat eksekusi suatu keadaan berakhir, GlobalConstructor dieksekusi. Definisi mesin keadaan berikut menunjukkan cara menggunakan GlobalConstructor.
Type: StateMachine
Name: MyWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: >-
acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
invocationType: Sync
body.$: $Input
GlobalConstructor:
InvokeFunctionResultHeader.$: $Output.Header
InvokeFunctionResultBody.$: $Output.Body
End: trueStruktur data
GlobalConstructorberupa Map[String]Any.InvokeFunctionResultHeader.$: $Output.HeaderdanInvokeFunctionResultBody.$: $Output.Bodymenunjukkan bahwa header dan body dari nilai fungsi yang dikembalikan disimpan secara terpisah ke kunci InvokeFunctionResultHeader dan InvokeFunctionResultBody dalam variabel global.
Pembacaan variabel global
CloudFlow mendefinisikan kata kunci $Global untuk membaca variabel global. Di semua skenario yang mendukung konstruksi ekspresi, ruang penyimpanan global dari eksekusi saat ini dapat diakses menggunakan $Global. Keadaan dapat mengekstrak nilai dari ruang penyimpanan global dengan menggunakan kunci eksplisit. Definisi mesin keadaan berikut menunjukkan cara menggunakan $Global.
Type: StateMachine
Name: MyWorkFlow
SpecVersion: v1
StartAt: InvokeFunction1
States:
- Type: Task
Name: InvokeFunction1
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
invocationType: Sync
resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
GlobalConstructor:
InvokeFunctionPayload.$: $Output.Body
Next: InvokeFunction
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
invocationType: Sync
body.$: $Global.InvokeFunctionPayload
OutputConstructor:
demo.$: $Global
End: true
Saat dieksekusi, fungsi
InvokeFunctionakan menjalankanGlobalConstructoruntuk menyimpan nilai kembali dariInvokeFunction1ke dalam kunciInvokeFunctionPayloadpada variabel global.InvokeFunctionmenggunakan ekspresi$Global.InvokeFunctionPayloaddalamParametersuntuk mengekstrak nilai kunciInvokeFunctionPayloaddari ruang penyimpanan global dan meneruskannya sebagai bidangbodyke keadaanTaskuntuk dieksekusi.-
Keadaan
InvokeFunctionmenggunakanOutputConstructoruntuk melihat nilai dalam$Global. Setelah eksekusi selesai, panel output alur kerja menampilkan nilaiInvokeFunctionPayloadsebagai"hello world\n", yang mengonfirmasi bahwa variabel global berhasil dibaca.