Mengembangkan Decider di Amazon SWF - Amazon Simple Workflow Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengembangkan Decider di Amazon SWF

Decider adalah implementasi dari logika koordinasi tipe alur kerja Anda yang berjalan selama eksekusi alur kerja Anda. Anda dapat menjalankan beberapa decider untuk satu tpe alur kerja.

Karena state eksekusi untuk eksekusi alur kerja disimpan dalam riwayat alur kerja, decider dapat menjadi stateless. Amazon SWF mempertahankan riwayat eksekusi alur kerja dan memberikannya ke decider dengan setiap tugas keputusan. Hal ini memungkinkan Anda untuk secara dinamis menambahkan dan menghapus decider jika diperlukan, sehingga pemrosesan alur kerja Anda sangat terukur. Seiring bertambahnya beban pada sistem, Anda cukup menambahkan lebih banyak decider untuk menangani peningkatan kapasitas. Perhatikan, bagaimanapun, hanya ada satu tugas keputusan yang terbuka setiap saat untuk eksekusi alur kerja tertentu.

Setiap kali perubahan state terjadi untuk eksekusi alur kerja, Amazon SWF menjadwal tugas keputusan. Setiap kali decider menerima tugas keputusan, decider melakukan hal berikut:

  • Menginterpretasi riwayat eksekusi alur kerja yang disediakan dengan tugas keputusan

  • Menerapkan logika koordinasi berdasarkan riwayat eksekusi alur kerja dan membuat keputusan tentang apa yang harus dilakukan selanjutnya. Setiap keputusan diwakili oleh struktur Keputusan

  • Menyelesaikan tugas keputusan dan memberikan daftar keputusan untuk Amazon SWF.

Bagian ini menjelaskan cara mengembangkan decider, yang melibatkan:

  • Pemrograman decider Anda untuk polling tugas keputusan

  • Pemrograman decider Anda untuk menginterpretasi riwayat eksekusi alur kerja dan membuat keputusan

  • Pemrograman decider Anda untuk meresponsi tugas keputusan.

Contoh dalam bagian ini menunjukkan cara memprogram decider untuk alur kerja contoh perdagangan elektronik.

Anda dapat mengimplementasikan decider dalam bahasa apapun yang Anda suka dan menjalankannya di mana saja, selama decider dapat berkomunikasi dengan Amazon SWF melalui API layanannya.

Menentukan Logika Koordinasi

Hal pertama yang harus dilakukan ketika mengembangkan decider adalah menentukan logika koordinasi. Dalam contoh perdagangan elektronik, logika koordinasi yang menjadwalkan setiap aktivitas setelah aktivitas sebelumnya selesai mungkin terlihat mirip dengan berikut ini:

IF lastEvent = "StartWorkflowInstance" addToDecisions ScheduleVerifyOrderActivity ELSIF lastEvent = "CompleteVerifyOrderActivity" addToDecisions ScheduleChargeCreditCardActivity ELSIF lastEvent = "CompleteChargeCreditCardActivity" addToDecisions ScheduleCompleteShipOrderActivity ELSIF lastEvent = "CompleteShipOrderActivity" addToDecisions ScheduleRecordOrderCompletion ELSIF lastEvent = "CompleteRecordOrderCompletion" addToDecisions CloseWorkflow ENDIF

Decider menerapkan logika koordinasi untuk riwayat eksekusi alur kerja dan membuat daftar keputusan ketika menyelesaikan tugas keputusan menggunakan tindakan RespondDecisionTaskCompleted.

Polling untuk Tugas Keputusan

Setiap decider melakukan polling untuk tugas keputusan. Tugas keputusan berisi informasi yang digunakan decider untuk menghasilkan keputusan seperti tugas kegiatan penjadwalan. Untuk polling tugas keputusan, decider menggunakan tindakan PollForDecisionTask.

Dalam contoh ini, decider melakukan polling tugas keputusan, menentukan daftar tugas customerOrderWorkflow-0.1.

https://swf.us-east-1.amazonaws.com PollForDecisionTask { "domain": "867530901", "taskList": {"name": "customerOrderWorkflow-v0.1"}, "identity": "Decider01", "maximumPageSize": 50, "reverseOrder": true }

Jika tugas keputusan tersedia dari daftar tugas yang ditentukan, Amazon SWF segera mengembalikannya. Jika tidak ada tugas keputusan tersedia, Amazon SWF memegang koneksi terbuka hingga 60 detik, dan mengembalikan tugas segera setelah tersedia. Jika tidak ada tugas yang tersedia, Amazon SWF mengembalikan respons kosong. Respons kosong adalah struktur Task di mana nilai taskToken merupakan string kosong. Pastikan untuk memprogram decider Anda untuk polling tugas lain jika menerima respons kosong.

Jika tugas keputusan tersedia, Amazon SWF mengembalikan respons yang berisi tugas keputusan serta tampilan riwayat eksekusi alur kerja yang diberi nomor halaman.

Dalam contoh ini, tipe kejadian terbaru menunjukkan eksekusi alur kerja telah dimulai dan elemen input berisi informasi yang diperlukan untuk melakukan tugas pertama.

{ "events": [ { "decisionTaskStartedEventAttributes": { "identity": "Decider01", "scheduledEventId": 2 }, "eventId": 3, "eventTimestamp": 1326593394.566, "eventType": "DecisionTaskStarted" }, { "decisionTaskScheduledEventAttributes": { "startToCloseTimeout": "600", "taskList": { "name": "specialTaskList" } }, "eventId": 2, "eventTimestamp": 1326592619.474, "eventType": "DecisionTaskScheduled" }, { "eventId": 1, "eventTimestamp": 1326592619.474, "eventType": "WorkflowExecutionStarted", "workflowExecutionStartedEventAttributes": { "childPolicy" : "TERMINATE", "executionStartToCloseTimeout" : "3600", "input" : "data-used-decider-for-first-task", "parentInitiatedEventId": 0, "tagList" : ["music purchase", "digital", "ricoh-the-dog"], "taskList": { "name": "specialTaskList" }, "taskStartToCloseTimeout": "600", "workflowType": { "name": "customerOrderWorkflow", "version": "1.0" } } } ], ... }

Setelah menerima riwayat eksekusi alur kerja, decider menginterpretasi riwayat dan membuat keputusan berdasarkan logika koordinasi.

Karena jumlah kejadian riwayat untuk eksekusi satu alur kerja mungkin besar, hasil yang dikembalikan mungkin dipisah di sejumlah halaman. Untuk mengambil halaman berikutnya, buat panggilan tambahan ke PollForDecisionTask menggunakan nextPageToken yang dikembalikan oleh panggilan awal. Perhatikan bahwa Anda tidak melakukan panggilan GetWorkflowExecutionHistory dengan nextPageToken ini. Sebagai gantinya, panggil PollForDecisionTask lagi.

Menerapkan Logika Koordinasi

Setelah decider menerima tugas keputusan, programkan untuk menginterpretasi riwayat eksekusi alur kerja untuk menentukan apa yang telah terjadi sejauh ini. Berdasarkan hal tersebut, decider harus menghasilkan daftar keputusan.

Dalam contoh perdagangan elektronik, kita hanya peduli dengan kejadian terakhir dalam riwayat alur kerja, jadi kita mendefinisikan logika berikut.

IF lastEvent = "StartWorkflowInstance" addToDecisions ScheduleVerifyOrderActivity ELSIF lastEvent = "CompleteVerifyOrderActivity" addToDecisions ScheduleChargeCreditCardActivity ELSIF lastEvent = "CompleteChargeCreditCardActivity" addToDecisions ScheduleCompleteShipOrderActivity ELSIF lastEvent = "CompleteShipOrderActivity" addToDecisions ScheduleRecordOrderCompletion ELSIF lastEvent = "CompleteRecordOrderCompletion" addToDecisions CloseWorkflow ENDIF

Jika lastEvent adalah CompleteVerifyOrderActivity, Anda akan menambahkan kegiatan ScheduleChargeCreditCardActivity ke daftar keputusan.

Setelah decider menentukan keputusan yang akan diambil, decider dapat merespons Amazon SWF dengan keputusan yang tepat.

Merespons dengan Keputusan

Setelah menginterpreasikan riwayat alur kerja dan menghasilkan daftar keputusan, decider siap untuk merespons kembali ke Amazon SWF dengan keputusan tersebut.

Programkan decider Anda untuk mengekstraksi data yang dibutuhkan dari riwayat eksekusi alur kerja, lalu buat keputusan yang menentukan tindakan berikutnya sesuai untuk alur kerja. Decider mentransmisikan keputusan ini kembali ke Amazon SWF menggunakan tindakan RespondDecisionTaskCompleted. Lihat Referensi API mazon Simple Workflow Service untuk daftar tipe keputusan yang tersedia.

Dalam contoh perdagangan elektronik, ketika decider merespons dengan serangkaian keputusan yang dihasilkan, itu juga termasuk input kartu kredit dari riwayat eksekusi alur kerja. Pekerja aktivitas kemudian memiliki informasi yang dibutuhkan untuk melakukan tugas aktivitas.

Ketika semua aktivitas dalam eksekusi alur kerja selesai, decider menutup eksekusi alur kerja.

https://swf.us-east-1.amazonaws.com RespondDecisionTaskCompleted { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "decisions" : [ { "decisionType" :"ScheduleActivityTask", "scheduleActivityTaskDecisionAttributes" : { "control" :"OPTIONAL_DATA_FOR_DECIDER", "activityType" : { "name" :"ScheduleChargeCreditCardActivity", "version" :"1.1" }, "activityId" :"3e2e6e55-e7c4-beef-feed-aa815722b7be", "scheduleToCloseTimeout" :"360", "taskList" : { "name" :"CC_TASKS" }, "scheduleToStartTimeout" :"60", "startToCloseTimeout" :"300", "heartbeatTimeout" :"60", "input" : "4321-0001-0002-1234: 0212 : 234" } } ] }

Menutup Eksekusi Alur Kerja

Ketika decider menentukan bahwa proses bisnis selesai, yaitu, tidak ada lagi kegiatan untuk dilakukan, decider menghasilkan keputusan untuk menutup eksekusi alur kerja.

Untuk menutup eksekusi alur kerja, programkan decider Anda untuk menginterpretasikan kejadian dalam riwayat alur kerja untuk menentukan apa yang telah terjadi dalam eksekusi sejauh ini dan melihat apakah eksekusi alur kerja harus ditutup.

Jika alur kerja telah berhasil diselesaikan, kemudian tutup eksekusi alur kerja dengan memanggil RespondDecisionTaskCompleted dengan keputusan CompleteWorkflowExecution. Atau, Anda bisa gagal dalam eksekusi yang salah menggunakan keputusan FailWorkflowExecution.

Dalam contoh perdagangan elektronik, decider meninjau riwayat dan menambahkan keputusan berdasarkan logika koordinasi untuk menutup eksekusi alur kerja ke daftar keputusannya, dan memulai tindakan RespondDecisionTaskCompleted dengan keputusan alur kerja yang tertutup.

catatan

Ada beberapa kasus di mana menutup alur kerja eksekusi mengalami kegagalan. Misalnya, jika sinyal diterima saat decider menutup eksekusi alur kerja, keputusan tertutup akan gagal. Untuk menangani kemungkinan ini, pastikan bahwa decider terus melakukan polling untuk tugas-tugas keputusan. Dalam kasus ini, pastikan juga bahwa decider yang menerima tugas keputusan berikutnya merespons kejadian, sinyal yang mencegah eksekusi dari penutupan.

Anda mungkin juga mendukung pembatalan eksekusi alur kerja. Hal ini sangat berguna untuk alur kerja yang berjalan lama. Untuk mendukung pembatalan, decider Anda harus menangani kejadian WorkflowExecutionCancelRequested dalam riwayat. Kejadian ini menunjukkan bahwa pembatalan eksekusi telah diminta. Decider Anda harus melakukan tindakan pembersihan yang tepat, seperti membatalkan tugas aktivitas yang sedang berlangsung, dan menutup alur kerja yang memanggil tindakan RespondDecisionTaskCompleted dengan keputusan CancelWorkflowExecution.

Contoh berikut memanggil RespondDecisionTaskCompleted untuk menentukan bahwa eksekusi alur kerja saat ini dibatalkan.

https://swf.us-east-1.amazonaws.com RespondDecisionTaskCompleted { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "decisions" : [ { "decisionType":"CancelWorkflowExecution", "CancelWorkflowExecutionAttributes":{ "Details": "Customer canceled order" } } ] }

Amazon SWF memeriksa untuk memastikan bahwa keputusan penutupan atau pembatalan eksekusi alur kerja adalah keputusan terakhir yang dikirim oleh decider. Artinya, tidak valid untuk memiliki serangkaian keputusan di mana ada keputusan setelah salah satu menutup alur kerja.

Meluncurkan Decider

Setelah menyelesaikan pengembangan decider, Anda siap untuk meluncurkan satu atau lebih decider.

Untuk meluncurkan decider, paketkan logika koordinasi Anda menjadi dapat dieksekusi yang dapat digunakan pada platform decider Anda. Misalnya, Anda mungkin memaketkan kode decider Anda sebagai dapat dieksekusi Java yang dapat Anda jalankan pada komputer Linux dan Windows.

Setelah diluncurkan, decider Anda harus mulai nelakukan polling Amazon SWF untuk tugas-tugas. Sampai Anda memulai eksekusi alur kerja dan Amazon SWF menjadwal tugas keputusan, polling ini akan kehabisan waktu dan mendapat respons kosong. Respons kosong adalah struktur Task di mana nilai taskToken merupakan string kosong. Keputusan Anda harus terus melakukan polling.

Amazon SWF memastikan bahwa hanya satu tugas keputusan yang dapat aktif untuk eksekusi alur kerja setiap saat. Hal ini mencegah masalah seperti keputusan yang bertentangan. Selain itu, Amazon SWF memastikan bahwa satu tugas keputusan ditugaskan untuk decider tunggal, terlepas dari jumlah decider yang berjalan.

Jika terjadi sesuatu yang menghasilkan tugas keputusan saat decider sedang memproses tugas keputusan lain, Amazon SWF mengantrekan tugas baru sampai tugas saat selesai. Setelah tugas saat ini selesai, Amazon SWF membuat tugas keputusan baru yang tersedia. Juga, tugas keputusan yang di-batch dalam artian, jika beberapa aktivitas telah selesai sementara decider sedang memproses tugas keputusan, Amazon SWF hanya akan membuat satu tugas keputusan baru untuk memperhitungkan beberapa penyelesaian tugas. Namun, setiap penyelesaian tugas akan menerima kejadian individu dalam riwayat eksekusi alur kerja.

Karena polling merupakan permintaan keluar, decider dapat berjalan di jaringan apa pun yang memiliki akses ke endpoint Amazon SWF.

Agar eksekusi alur kerja untuk berlanjut, satu atau lebih decider harus berjalan. Anda dapat meluncurkan sebanyak decider yang Anda inginkan. Amazon SWF mendukung beberapa decider yang melakukan polling pada daftar tugas yang sama.