Appendix A: Architectural Decision - Bus::chain() vs. Pipeline
A key decision in this system’s architecture was the choice of Bus::chain() with Jobs over Laravel’s Pipeline pattern for executing sequential tasks. While both can run operations in order, they are designed for different purposes. This section clarifies why the Job Chain was chosen.
Core Concepts
-
Bus::chain()with Jobs (The Project Manager): This pattern is designed for orchestrating a series of discrete, self-contained actions. Each “Job” is a complete task. The system ensures one job finishes before the next begins. It is ideal for long-running or heavy processes like file manipulation. -
Analogy: A construction project where the foundation must be built (
StampDocumentJob) before the walls are erected (GenerateThumbnailJob). -
app(Pipeline::class)with Pipes (The Assembly Line): This pattern is designed for transforming a single piece of data through a series of steps or “Pipes”. The same data object is passed from one step to the next, being modified along the way. - Analogy: A car chassis moving down an assembly line, where each station adds a new part to the same object.
Comparison and Justification
Conclusion
For processing documents—which involves external system calls, file I/O, and potentially long execution times—Bus::chain() is the superior and more conventional Laravel pattern. It provides the necessary robustness, state separation, and crucial flexibility to scale from synchronous to asynchronous processing in the future.
Addendum Dokumentasi Bahasa Indonesia
Lampiran A: Keputusan Arsitektur - Bus::chain() vs. Pipeline
Sebuah keputusan kunci dalam arsitektur sistem ini adalah pemilihan Bus::chain() dengan Jobs dibandingkan dengan pattern Pipeline dari Laravel untuk mengeksekusi tugas sekuensial. Meskipun keduanya dapat menjalankan operasi secara berurutan, mereka dirancang untuk tujuan yang berbeda. Bagian ini menjelaskan mengapa Job Chain dipilih.
Konsep Inti
-
Bus::chain()dengan Jobs (Manajer Proyek): Pattern ini dirancang untuk mengorkestrasi serangkaian aksi yang terpisah dan mandiri. Setiap “Job” adalah sebuah tugas yang utuh. Sistem memastikan satu job selesai sebelum job berikutnya dimulai. Ini ideal untuk proses yang berat atau berjalan lama seperti manipulasi file. -
Analogi: Proyek konstruksi di mana fondasi harus dibangun (
StampDocumentJob) sebelum dinding didirikan (GenerateThumbnailJob). -
app(Pipeline::class)dengan Pipes (Lini Perakitan): Pattern ini dirancang untuk mengubah (transformasi) sebuah data melalui serangkaian langkah atau “Pipes”. Objek data yang sama diteruskan dari satu langkah ke langkah berikutnya, dan dimodifikasi di sepanjang jalan. - Analogi: Sasis mobil yang bergerak di lini perakitan, di mana setiap stasiun menambahkan bagian baru ke objek yang sama.
Perbandingan dan Justifikasi
Kesimpulan
Untuk memproses dokumen—yang melibatkan panggilan sistem eksternal, I/O file, dan waktu eksekusi yang berpotensi lama—Bus::chain() adalah pattern Laravel yang lebih unggul dan konvensional. Pattern ini menyediakan kekokohan, pemisahan state, dan fleksibilitas krusial untuk beralih dari pemrosesan sinkron ke asinkron di kemudian hari.