Roadmap Belajar

Laravel dari Nol sampai Enterprise

Dari rute pertama sampai aplikasi yang berjalan di produksi untuk banyak orang β€” dengan izin yang benar, query yang tidak menghabiskan database, deploy tanpa jeda, dan biaya yang bisa dijelaskan.

Dua fase terakhir sebelum capstone menjawab pertanyaan yang paling sering ditanyakan tapi jarang dibahas tuntas: FrankenPHP atau RoadRunner, dan bagaimana persisnya semua ini di-deploy di AWS.

Durasi
~16 minggu
Beban
~8 jam/minggu
Prasyarat
Pernah ngoding, paham HTTP
Target akhir
Aplikasi produksi di AWS

Untuk siapa roadmap ini

"Dari nol" di sini berarti nol Laravel, bukan nol pemrograman. Kamu diasumsikan sudah pernah menulis kode di bahasa apa pun dan paham dasar HTTP. PHP modern dibahas ringkas di Fase 0 β€” cukup untuk membaca seluruh kode di roadmap ini, tanpa berpura-pura ini kursus PHP.

Kalau kamu belum pernah ngoding sama sekali, mulai dari Python Dasar untuk Pemula dulu. Konsepnya β€” variabel, percabangan, fungsi, struktur data β€” sama di semua bahasa, dan jauh lebih mudah dipelajari tanpa framework di atasnya.

Bentuk roadmap ini

BagianFaseMenjawab
Dasar framework0 – 2Bagaimana Laravel bekerja, dan bagaimana bicara ke database
Cara menulis aplikasi nyata3 – 6Arsitektur, keamanan, API, dan bukti bahwa semuanya masih benar
Membuatnya cepat7 – 8Query, cache, CDN, lalu worker mode
Menjalankannya untuk orang lain9 – 10AWS, deploy tanpa jeda, dan bertahan bertahun-tahun

Urutannya disengaja. Fase 8 dan 9 adalah bagian yang paling sering dicari duluan β€” tapi worker mode di atas kode yang masih punya query N+1 hanya memindahkan masalah, dan deploy ke AWS tanpa tes hanya mempercepat penyebaran bug. Jangan lompat ke Fase 8.

0

Fondasi PHP & Tooling

1 minggu PHP 8.3+ComposerArtisan.env

Tujuan: punya aplikasi Laravel yang berjalan di laptopmu, dan bisa membaca kode PHP modern tanpa tersandung sintaks.

Perhatian: banyak tutorial Laravel masih menyuruhmu membuka app/Http/Kernel.php. File itu tidak ada lagi sejak Laravel 11 β€” konfigurasinya pindah ke bootstrap/app.php. Kalau sebuah panduan menyebut berkas yang tidak kamu punya, cek dulu versi Laravel yang ditulisnya.

Setup sekali jalan

# PHP + Composer + installer sekaligus
/bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.5)"

laravel new portal
cd portal

npm install && npm run build
composer run dev        # server + queue listener + vite, satu perintah

Empat hal yang harus benar sejak hari pertama

HalKenapa
Web root menunjuk ke public/Kalau tidak, .env bisa diunduh siapa saja
env() hanya di dalam config/Setelah config:cache, di tempat lain ia null
Database yang sama dengan produksiPerbedaan SQLite dan MySQL bocor di tempat-tempat kecil
declare(strict_types=1)Jauh lebih murah dinyalakan sekarang daripada nanti

Materi

βœ“ Checkpoint

Aplikasi Laravel berjalan di laptopmu, kamu bisa menjelaskan apa yang dilakukan composer install versus composer update, dan kamu tahu kenapa env() di dalam controller adalah bug yang menunggu produksi.

1

Request, Routing & Blade

1,5 minggu routingmiddlewarevalidasiBlade

Tujuan: bisa membangun halaman dan form yang lengkap β€” tervalidasi, tertangani errornya, dan tahu persis apa yang terjadi antara browser menekan Enter dan controller-mu berjalan.

Bentuk yang akan kamu tulis berulang kali

Route::resource('artikel', ArtikelController::class);

public function store(SimpanArtikelRequest $request): RedirectResponse
{
    // Sudah tervalidasi DAN terotorisasi sebelum baris ini berjalan.
    $artikel = Artikel::create($request->validated());

    return redirect()
        ->route('artikel.show', $artikel)
        ->with('sukses', 'Artikel tersimpan.');
}

Empat lapis yang harus kamu bedakan

LapisTugasnyaBukan tugasnya
MiddlewareSyarat yang berlaku untuk sekelompok ruteLogika bisnis
Form RequestBentuk data boleh masuk atau tidakMenyimpan data
ControllerMenerjemahkan HTTP ke domain dan sebaliknyaQuery kompleks, kirim email
BladeMenampilkanMengambil data

Yang membedakan controller sehat dan controller gemuk bukan panjangnya, tapi apakah setiap urusan sudah ada di tempat yang disediakan framework. Validasi punya rumah, otorisasi punya rumah, perhitungan punya rumah. Controller yang tipis adalah akibat, bukan tujuan.

Materi

βœ“ Checkpoint

Kamu punya CRUD lengkap dengan Form Request, pesan error yang muncul di form, dan satu exception domain yang merender dirinya berbeda untuk HTML dan JSON. Kamu juga bisa menjelaskan kenapa 419 muncul.

2

Database & Eloquent

2 minggu migrasiEloquentrelasiN+1

Tujuan: bisa memodelkan data dengan benar, dan mengenali sendiri kapan kodemu diam-diam menjalankan lima puluh query untuk satu halaman.

Satu baris yang mengubah kebiasaan tim. Pasang ini di AppServiceProvider sejak hari pertama β€” N+1 berubah dari "agak lambat" jadi tes yang gagal:

Model::preventLazyLoading(! app()->isProduction());
Model::preventSilentlyDiscardingAttributes(! app()->isProduction());

Peta keputusan

KebutuhanPakaiKenapa
CRUD satu entitasEloquentRelasi, cast, event, policy ikut bekerja
Laporan & agregasiQuery builderTidak butuh objek model
Update jutaan barisQuery builderSatu query, bukan sejuta objek
Menampilkan relasi di daftarwith()Dua query, berapa pun barisnya
Menghitung relasiwithCount()Tanpa memuat satu baris pun
Uanginteger atau decimalJangan pernah float

Materi

βœ“ Checkpoint

Halaman daftarmu menjalankan jumlah query yang tetap berapa pun jumlah barisnya, kamu punya factory dengan state bernama, dan kamu bisa menulis rencana tiga deploy untuk mengganti nama sebuah kolom di tabel yang sedang dipakai.

3

Arsitektur Laravel

1,5 minggu containereventqueuecache

Tujuan: tahu ke mana sebuah kode seharusnya diletakkan β€” dan bisa memindahkan pekerjaan berat keluar dari siklus permintaan pengguna.

Fase ini yang membuat sisa roadmap masuk akal. Container menjelaskan kenapa tipe di parameter itu instruksi, bukan dokumentasi. Queue adalah cara termurah membuat aplikasi terasa cepat. Dan pemahaman soal singleton versus scoped di sini adalah yang mencegah kebocoran data antar pengguna saat kita sampai di Fase 8.

BindingUmur objekUntuk
bindBaru setiap kaliObjek yang menyimpan keadaan
singletonSatu, seumur prosesKlien HTTP, koneksi
scopedSatu per permintaanKonteks tenant, keranjang β€” apa pun yang milik pengguna

Aturan yang menyelamatkan Fase 8: kalau isi sebuah layanan bergantung pada siapa yang meminta, ia tidak boleh singleton. Di PHP-FPM kesalahan ini tidak terasa; di worker mode ia jadi kebocoran data antar pengguna.

Materi

βœ“ Checkpoint

Pekerjaan berat sudah pindah ke antrean, job-mu aman kalau dijalankan dua kali, jadwal berkala berjalan lewat penjadwal Laravel, dan kamu bisa menjelaskan kenapa register() tidak boleh memakai layanan lain.

4

Autentikasi & Keamanan

1,5 minggu authpolicySanctumrate limit

Tujuan: aturan "siapa boleh melakukan apa" tinggal di satu tempat dan tidak bisa dilewati β€” termasuk oleh orang yang mengetik URL langsung.

Pertahanan berlapis, dari yang paling lemah

LapisanCukup sendirian?
@can menyembunyikan tombolTidak β€” cuma urusan tampilan
Middleware can: di ruteYa, untuk rute itu
$this->authorize() di aksiYa
Query dibatasi kepemilikanTerkuat β€” yang bukan miliknya tidak pernah ditemukan

Yang paling sering bocor bukan autentikasi, melainkan otorisasi objek. /artikel/7/ulasan/999 yang menampilkan ulasan milik artikel lain, halaman edit yang bisa dibuka siapa saja karena hanya tombolnya yang disembunyikan, atau binding bersarang tanpa scopeBindings(). Kelas bug ini tidak akan ditemukan tes yang cuma menguji jalur bahagia.

Yang wajib dibatasi lajunya

EndpointSaran
Login5 / menit per email + IP
Lupa password, registrasi3 / menit per IP
Pencarian30 / menit
API publik60 / menit per token

Materi

βœ“ Checkpoint

Setiap model punya policy, setiap policy punya tes dari kedua sisi, rute login dibatasi lajunya, dan kamu bisa menjelaskan kenapa endpoint webhook-mu memakai hash_equals().

5

API & Frontend

1,5 minggu API ResourcepaginasiLivewireInertia

Tujuan: bentuk keluaran API jadi keputusan yang ditulis, dan kamu bisa memilih pendekatan frontend dengan alasan yang bisa dijelaskan.

Memilih pendekatan frontend

BladeLivewireInertia
BahasaPHPPHPReact / Vue
InteraksiMuat ulang halamanPermintaan ke serverState di klien
Beban server per interaksiβ€”Lebih tinggiLebih rendah
Bisa di-cache penuh di CDNYaTidakTidak
SEOBawaanBawaanPerlu SSR
Paling cocok untukHalaman baca publikPanel admin, formAntarmuka kaya

Tidak perlu memilih satu untuk seluruh aplikasi. Pola yang paling sehat untuk situs bertrafik baca tinggi: halaman publik memakai Blade statis yang bisa disajikan penuh dari CDN, dengan komponen Livewire hanya di bagian yang memang interaktif β€” pencarian, komentar. Panel admin boleh jadi SPA penuh; ia dipakai sedikit orang dan tidak perlu di-cache.

Paginasi: pilihan yang menentukan saat data membesar

paginatesimplePaginatecursorPaginate
Query per halaman211
Biaya di halaman jauhNaik terusNaik terusTetap
Tahan data baru masukTidakTidakYa
UntukTabel adminDaftar biasaUmpan, API

Materi

βœ“ Checkpoint

API-mu memakai Resource sehingga menambah kolom database tidak mengubah kontrak publik, daftar panjang memakai cursor, dan setiap panggilan HTTP keluar punya timeout.

6

Testing & Kualitas Kode

1,5 minggu PestHTTP testPintLarastan

Tujuan: berani men-deploy pada Jumat sore β€” karena ada yang memeriksa selain matamu sendiri.

AlatMenangkapYang tidak bisa ditangkapnya
Tes fiturPerilaku yang salah pada jalur yang diujiJalur yang tidak diuji
PHPStanTipe salah, null, method tak ada β€” di setiap barisAturan bisnis yang salah
PintGaya kodeSegalanya yang lain
Uji arsitekturBatas modul yang dilanggarKode yang jelek tapi patuh

Yang wajib punya tes

  1. Setiap aturan otorisasi β€” dari sisi yang boleh dan yang tidak boleh.
  2. Setiap alur yang menyentuh uang atau data pribadi.
  3. Bentuk respons setiap endpoint API publik.
  4. Setiap bug yang pernah terjadi β€” tulis tesnya sebelum memperbaikinya.
  5. Jumlah query pada halaman daftar (expectsDatabaseQueryCount).

Cakupan 100% tidak membuktikan apa pun. Yang lebih berguna: pastikan setiap aturan otorisasi dan setiap jalur uang punya tesnya sendiri. Itu daftar yang pendek, dan justru di situlah kegagalan paling mahal.

Materi

βœ“ Checkpoint

Satu perintah composer periksa menjalankan Pint, PHPStan, dan seluruh tes β€” persis seperti yang dijalankan CI. PHPStan berjalan di level 8 dengan baseline yang hanya menyusut.

7

Performa & Skala

1,5 minggu indexRedisCDNHorizon

Tujuan: tahu apa yang lambat berdasarkan data, dan memperbaikinya dengan urutan yang benar.

Urutan yang menghasilkan perbaikan terbesar per satuan risiko

  1. Perbaiki N+1 dan index. Dampaknya terbesar, risikonya nol.
  2. Cache HTTP dan CDN untuk halaman yang sama bagi semua orang.
  3. php artisan optimize dan OPcache. Gratis.
  4. Skala mendatar β€” tambah kontainer.
  5. Baru worker mode (Fase 8).

Banyak aplikasi yang mengira butuh worker mode sebenarnya butuh langkah kedua. Permintaan yang dijawab CDN tidak menyentuh PHP sama sekali β€” itu bukan perbaikan beberapa persen, itu penghapusan permintaannya. Dan tidak seperti worker mode, ia tidak menambah satu pun kelas bug baru.

Tiga tempat sebuah halaman bisa di-cache

LapisanMenghematDikendalikan
BrowserSeluruh perjalanan jaringanmax-age
CDNSeluruh pemrosesan di servermus-maxage
RedisQuery dan renderKodemu

Peringatan yang tidak boleh dilewati: halaman yang isinya bergantung pada siapa yang login harus private atau no-store. Satu halaman personal yang ditandai public akan disimpan CDN dan disajikan ke orang lain β€” ini kebocoran data, bukan bug performa.

Anggaran yang layak dipegang

MetrikTarget
Waktu respons server p50 / p95< 100 ms / < 400 ms
Query per permintaan< 15, dan tidak bertambah seiring jumlah baris
Rasio hit CDN (situs konten)> 90%
Rasio hit cache aplikasi> 80%

Materi

βœ“ Checkpoint

Kamu bisa menunjuk rute paling lambat berdasarkan Pulse (bukan perasaan), sudah memperbaiki index yang hilang berdasarkan EXPLAIN, dan halaman publikmu mengirim header s-maxage sementara halaman personal mengirim no-store.

8

FrankenPHP & RoadRunner

2 minggu OctaneFrankenPHPRoadRunnerworker mode

Tujuan: paham persis apa yang dibeli worker mode, apa yang tidak, dan bisa memilih runtime berdasarkan bentuk beban kerjamu β€” bukan berdasarkan benchmark orang lain.

Yang sebenarnya berubah

PHP-FPMWorker mode
Bootstrap frameworkTiap permintaanSekali per proses
Koneksi databaseDibuka ulangDipakai ulang
Variabel statisSelalu bersihBertahan β€” bisa jadi bug
Kebocoran memoriTidak mungkin bertahanMenumpuk sampai restart
DeployGanti berkasWajib restart proses

Yang tidak diperbaiki worker mode: query N+1, index yang hilang, API luar yang lambat, halaman yang mengirim 2 MB HTML. Kalau permintaanmu 400 ms dengan 30 ms bootstrap dan 350 ms query, worker mode memberimu perbaikan 7% ditambah seluruh kelas bug state yang baru. Kerjakan Fase 7 dulu.

Perbandingan singkat

AspekFrankenPHPRoadRunner
ArsitekturSatu proses: Caddy + PHP tertanamServer Go + proses PHP terpisah
KonkurensiUtasProses
Butuh PHP thread-safeYaTidak
Web server & TLSTermasukPerlu di depannya
HTTP/3BawaanAda di plugin http
Kendali poolUtas, worker, kolam per ruteSangat detail
EkosistemModul CaddyJobs, gRPC, Temporal, KV
AlpineHindari (musl lambat untuk ZTS)Hindari (musl tidak sepenuhnya kompatibel)

Rekomendasi singkat β€” versi lengkapnya ada di materi terakhir fase ini. Untuk aplikasi web Laravel, mulai dari FrankenPHP: satu proses, satu konfigurasi, satu hal yang perlu dipantau. Pindah ke RoadRunner kalau ada kebutuhan konkret yang menariknya β€” gRPC, Temporal, antrean yang dikelola server, atau ekstensi PHP yang tidak thread-safe. Karena keduanya diakses lewat Octane, berpindah nanti berarti mengganti satu opsi, bukan menulis ulang aplikasi.

Daftar periksa sebelum menyalakan worker mode

  1. Tidak ada singleton yang menyimpan data permintaan β€” ubah jadi scoped.
  2. Tidak ada properti statis yang terus bertumbuh.
  3. Tidak ada request() di dalam service provider.
  4. Paket pihak ketiga sudah diperiksa dukungannya.
  5. Pemantauan memori per kontainer sudah terpasang.
  6. Pipeline deploy me-restart worker.
grep -rn "singleton(" app/ | grep -v scoped
grep -rn "static \$" app/
grep -rn "request()" app/Providers/

Materi

βœ“ Checkpoint

Kamu punya tabel hasil uji beban sendiri untuk tiga konfigurasi β€” PHP-FPM, FrankenPHP klasik, dan FrankenPHP worker mode β€” berisi throughput, p95, dan pemakaian memori. Dan kamu sudah membuktikan sendiri kebocoran singleton lalu memperbaikinya.

9

Deploy di AWS

2,5 minggu ECS FargateALBAuroraCloudFrontCI/CD

Tujuan: aplikasimu berjalan di AWS, di-deploy dari git push tanpa jeda, dengan rahasia yang tidak pernah menyentuh repositori.

Arsitektur acuan

                  Route 53
                     β”‚
                CloudFront  ──────────►  S3 (aset & media)
                     β”‚
                    WAF
                     β”‚
            Application Load Balancer          (subnet publik)
                     β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚      ECS Fargate        β”‚            (subnet privat)
        β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
        β”‚  β”‚ service: web      β”‚  β”‚  FrankenPHP + Laravel
        β”‚  β”‚ service: worker   β”‚  β”‚  queue:work
        β”‚  β”‚ service: schedulerβ”‚  β”‚  schedule:work
        β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  Aurora        ElastiCache          SQS       Secrets Manager
 (writer +        (Redis)                       + CloudWatch
  reader)

Tiga service, bukan satu

ServicePerintahTaskDiskalakan dari
weboctane:frankenphp2–20Permintaan per target
workerqueue:work1–10Panjang antrean
schedulerschedule:workTepat 1β€”

Empat setelan yang harus selaras supaya deploy benar-benar tanpa jeda: health check ALB, deregistration_delay, stopTimeout ECS, dan penanganan SIGTERM. Aturannya: stopTimeout harus lebih panjang daripada deregistration delay. Kalau salah satu tidak sinkron, setiap rilis menghasilkan sejumlah 502 β€” dan biasanya tidak ada yang menyadarinya karena tidak ada yang mengukurnya.

Urutan pipeline yang benar

  1. Lint dan analisis statis β€” paling cepat, gagalkan lebih dulu.
  2. Tes, dengan database sejenis produksi.
  3. Build image, tag dengan SHA commit β€” bukan latest.
  4. Pindai kerentanan image.
  5. Migrasi sebagai task tersendiri; periksa exit code-nya.
  6. Perbarui service β€” web, worker, dan penjadwal.
  7. Tunggu stabil, lalu jalankan pemeriksaan asap.

Materi

βœ“ Checkpoint

git push ke main menghasilkan aplikasi baru di produksi tanpa satu pun respons non-200 selama deploy, tanpa satu pun access key AWS tersimpan di GitHub, dan dengan rollback yang bisa menunjuk revisi task definition sebelumnya.

10

Enterprise & Capstone

1,5 minggu modularmulti-tenantfeature flagupgrade

Tujuan: aplikasimu tetap bisa dipahami, diubah, dan di-upgrade setelah dua tahun dan lima orang yang berbeda menyentuhnya.

Fase-fase sebelumnya membuat aplikasi yang benar dan cepat. Fase ini tentang sifat yang baru terasa belakangan: apakah orang baru bisa menemukan kode yang dicarinya, apakah fitur bisa dimatikan tanpa deploy, dan apakah kamu masih bisa naik versi tahun depan.

Materi

Capstone: portal konten bertrafik baca tinggi

Bangun satu aplikasi yang menyentuh seluruh fase. Proyek yang paling tepat adalah yang didominasi pembaca anonim dengan sedikit penulis β€” karena bentuk beban itu memaksamu memakai hampir semua yang dipelajari di sini.

  1. Domain β€” artikel, kategori, penulis, komentar. Enum untuk status, objek nilai untuk hal yang punya aturan.
  2. Redaksi β€” alur draf β†’ tinjau β†’ terbit, dengan policy per peran dan tes dari kedua sisi.
  3. Media β€” unggahan ke S3, varian ukuran dibuat lewat antrean, disajikan lewat CloudFront.
  4. Halaman publik β€” Blade, tanpa JavaScript yang tidak perlu, dengan s-maxage dan stale-while-revalidate.
  5. Pencarian β€” Scout, dibatasi lajunya, hasilnya di-cache.
  6. API β€” Resource ber-versi, cursor pagination, Sanctum untuk konsumen.
  7. Kualitas β€” Pest, PHPStan level 8, Pint, uji arsitektur, semuanya jadi gerbang CI.
  8. Performa β€” index berdasarkan EXPLAIN, preventLazyLoading aktif, anggaran query di dalam tes.
  9. Runtime β€” FrankenPHP worker mode, dengan daftar periksa state yang sudah dituntaskan.
  10. Infrastruktur β€” ECS Fargate tiga service, Aurora writer + reader, ElastiCache, SQS, Secrets Manager.
  11. Deploy β€” GitHub Actions lewat OIDC, migrasi sebagai task terpisah, nol respons non-200.
  12. Observability β€” log JSON dengan request_id, delapan alarm, dasbor p95.

Kenapa proyek ini: ia memaksa setiap keputusan yang dibahas di roadmap. Beban baca tinggi menuntut strategi cache berlapis; alur redaksi menuntut otorisasi yang benar; media menuntut antrean dan penyimpanan objek; dan target tanpa jeda menuntut migrasi yang kompatibel dua arah. Kalau kamu bisa menjelaskan setiap keputusan di proyek ini, kamu bisa menjalankan aplikasi Laravel di produksi.

βœ“ Checkpoint

Aplikasi berjalan end-to-end di AWS, di-deploy dari pipeline, punya dasbor yang menunjukkan p95 dan rasio hit CDN, dan kamu bisa mematikan satu fitur tanpa deploy.

Rekomendasi best practice

Ringkasan keputusan yang, kalau harus memilih satu jawaban, inilah jawabannya. Konteksnya: aplikasi Laravel dengan lalu lintas baca yang jauh lebih besar daripada tulis β€” situs konten, katalog, portal. Setiap baris punya materi yang membahas alasannya.

Tumpukan yang direkomendasikan

LapisanPilihanAlasan singkat
FrameworkLaravel 13, PHP 8.4Dukungan keamanan sampai 2028
RuntimeFrankenPHP + OctaneSatu proses; TLS, HTTP/3, dan berkas statis bawaan
Basis imageDebian, bukan AlpineKedua runtime worker mode menyarankan menghindari musl
ComputeECS Fargate, tiga serviceTanpa server yang dikelola; proses berumur panjang
DatabaseAurora MySQL, writer + readerBeban baca dipindahkan ke replica
Cache & sessionElastiCache Redis, Multi-AZWajib bersama begitu ada kontainer kedua
AntreanSQS (+ Redis/Horizon kalau butuh dasbor)Pekerjaan tidak hilang; tanpa klaster yang dikelola
Aset & mediaS3 di belakang CloudFrontBucket tidak pernah publik
Halaman publikBlade, di-cache di CloudFrontPermintaan yang tidak pernah menyentuh PHP
Panel adminLivewireInteraktif tanpa membangun SPA
RahasiaSecrets Manager lewat secrets ECSTidak ada rahasia di image maupun repositori
CI/CDGitHub Actions + OIDCTanpa access key jangka panjang

Sepuluh yang paling menentukan

  1. Pindahkan sebanyak mungkin ke CDN. Untuk halaman yang sama bagi semua pembaca, s-maxage plus stale-while-revalidate memangkas beban server berkali-kali lipat β€” dan tidak menambah satu pun kelas bug. Ini pengungkit terbesar, dan yang paling sering dilewati.
  2. Nyalakan preventLazyLoading() sejak commit pertama. N+1 yang tidak pernah jadi error tidak akan pernah masuk daftar pekerjaan.
  3. Buat index dari EXPLAIN, bukan dari tebakan. Urutan kolom pada index gabungan menentukan apakah ia terpakai sama sekali.
  4. Semua yang bersama harus di Redis β€” cache, session, lock β€” dengan database terpisah per peran supaya cache:clear tidak menghapus antrean.
  5. Jangan lompat ke worker mode. Urutannya: N+1 dan index β†’ CDN β†’ optimize dan OPcache β†’ tambah kontainer β†’ baru worker mode.
  6. Sebelum worker mode, bereskan state. Tidak ada singleton yang menyimpan data permintaan, tidak ada properti statis yang bertumbuh, tidak ada request() di provider.
  7. Job harus idempoten. Ia akan berjalan dua kali β€” SQS menjaminnya at-least-once, dan worker bisa mati setelah pekerjaan selesai tapi sebelum pesannya dihapus.
  8. Migrasi harus kompatibel dua arah. Selama rolling update, kode lama dan baru berjalan bersamaan. Ganti nama kolom = tiga deploy, bukan satu.
  9. Ukur p95, bukan rata-rata. Rata-rata menyembunyikan satu dari sepuluh pengguna yang menunggu tiga detik.
  10. Upgrade setiap tahun, bukan setiap empat tahun. Biaya upgrade tumbuh lebih cepat daripada linear terhadap waktu yang ditunda.

Kesalahan yang paling mahal

KesalahanAkibatnyaDibahas di
Halaman personal ditandai public di CDNData satu pengguna tersaji ke pengguna lainFase 7, 9
singleton menyimpan data permintaan di worker modeKebocoran antar pengguna, hanya sesekaliFase 3, 8
Kunci cache tanpa ID tenantKebocoran antar pelangganFase 3, 10
$guarded = []Kolom apa pun bisa diisi dari input penggunaFase 2
APP_DEBUG=true di produksiStack trace + seluruh environment terlihat publikFase 1
Visibility timeout SQS lebih pendek dari durasi jobJob diproses berkali-kali; email dan tagihan dobelFase 9
Session driver file di banyak kontainerPengguna ter-logout acakFase 4, 7
Image tag latestRollback tidak mengembalikan apa punFase 9
Migrasi di entrypoint kontainer webLima task menjalankannya bersamaan saat scale-outFase 9
Health check menyentuh databaseGangguan sebagian berubah jadi kegagalan totalFase 9

Kalau lalu lintas naik, periksa dalam urutan ini

  1. Rasio hit CDN. Di bawah 90% untuk situs konten berarti ada yang salah di kunci cache β€” biasanya query string pelacakan atau cookie yang ikut masuk kunci.
  2. Query per permintaan. Kalau bertambah seiring jumlah baris, itu N+1.
  3. p95 database. Buka Performance Insights; query teratas biasanya menunjuk index yang hilang.
  4. Utas atau worker yang sibuk. Kalau selalu mentok, tambah task β€” bukan tambah worker per task.
  5. Panjang antrean. Menumpuk berarti worker kurang, atau ada job yang menahan.
  6. Baru pikirkan arsitektur. Lima langkah di atas menyelesaikan sebagian besar kasus.

Satu hal yang tidak akan diselesaikan infrastruktur: halaman yang butuh empat puluh query dan mengirim dua megabita HTML tetap mahal di runtime mana pun, di kelas instans apa pun. Ukur dulu, baru belanja.

Aturan main

  1. Bangun, jangan cuma baca. Hampir semua materi di sini punya latihan konkret di akhirnya; latihan itu yang membuatnya melekat.
  2. Ukur sebelum dan sesudah. Setiap klaim performa di roadmap ini bisa kamu buktikan sendiri dalam sepuluh menit β€” lakukan.
  3. Satu perubahan pada satu waktu. Mengubah runtime dan konfigurasi database bersamaan membuat hasilnya tidak bisa dibaca.
  4. Baca pesan error sampai habis. Bedakan masalah izin, masalah konfigurasi, dan masalah kode β€” ketiganya sering terlihat mirip.
  5. Jangan lompat ke Fase 8. Godaannya besar. Worker mode di atas kode yang belum bersih hanya menambah kelas bug baru.
  6. Hapus resource AWS setelah berlatih. Aurora, ElastiCache, dan NAT Gateway ditagih per jam, dipakai atau tidak.
  7. Tulis tes untuk setiap bug. Sebelum memperbaikinya, bukan sesudah.

Sebelum ini

Roadmap ini mengandaikan kamu sudah pernah menulis kode di bahasa apa pun dan paham dasar HTTP. Kalau belum pernah ngoding sama sekali, mulai dari Python Dasar untuk Pemula. Kalau kamu tertarik pada sisi infrastruktur AWS-nya secara lebih dalam, AWS untuk AI Engineer membahas IAM, IaC, dan observability dengan sudut pandang yang berbeda.