Meningkatkan RoadRunner ke skala cluster: memperbanyak replica, menghilangkan sticky session dengan store Redis, membagikan queue antar node, menjaga state konsisten, dan menyusun strategi zero-downtime deployment.

Setelah di episode 21 kita men-deploy satu aplikasi ke Kubernetes, pada episode kali ini kita menaikkan skala: cluster, multisite & high availability. Satu replica tidak pernah cukup untuk production yang serius — dan begitu ada banyak node, muncul masalah yang tidak ada di single node: session harus dibagikan, queue harus konsisten, dan deployment tidak boleh memutus user.
Mengapa episode ini penting? Karena hampir semua aturan yang kita pelajari sejak episode 10 (state di store eksternal) baru terasa manfaatnya di skala ini. Cluster adalah ujian sejati arsitektur stateless.
RoadRunner adalah aplikasi stateless secara alami: server Go hanya mengelola worker dan plugin; data hidup di store eksternal. Karena itu cluster adalah kumpulan replica identik yang masing-masing berjalan normal:
Tidak ada sinkronisasi antar replica karena tidak ada state lokal yang perlu disinkronkan — selama semua state "lintas-request" hidup di Redis/DB.
Di banyak setup PHP-FPM, session tersimpan di file lokal → butuh sticky session (load balancer memaksa user ke node yang sama). Di RoadRunner, ini seharusnya tidak perlu. Pola yang benar (dari episode 10 dan 14):
$sessionId = $request->getCookieParams()['session'] ?? bin2hex(random_bytes(16));
$key = 'session:' . $sessionId;
$data = $cache->get($key) ?? [];
// ... mutasi data ...
$cache->set($key, $data, 1800);Karena session ada di Redis bersama, replica mana pun bisa melayani request user mana pun. Load balancer bisa memakai round-robin sederhana tanpa affinity — dan ketika satu replica mati, request tetap diproses node lain tanpa kehilangan session.
Tip
Jika kalian menemukan config load balancer yang memaksa sticky session, itu sinyal aplikasi masih menyimpan state di worker (pelanggaran episode 14). Pindahkan state ke store eksternal, lalu hapus sticky session — cluster menjadi lebih tangguh dan lebih mudah di-scale.
Queue (episode 11) juga harus dibagikan antar node. Gunakan driver yang bersifat terpusat — Redis, AMQP, atau SQS — bukan Boltdb lokal:
jobs:
consume:
- queue: "emails"
pipeline: "redis-emails"
pipelines:
redis-emails:
driver: redis
config:
addr: ${REDIS_ADDR}
queue: emailsSaat satu node mem-push job, node lain yang idle akan menariknya — pekerjaan didistribusikan otomatis. Untuk job dengan prioritas/latensi tinggi, pertimbangkan AMQP/RabbitMQ dengan exchange yang lebih kaya; untuk volume raksasa, SQS.
Aturan praktis state di cluster:
| Jenis state | Tempat | Konsisten lintas node? |
|---|---|---|
| Session | Redis/KV | Ya |
| Cache | Redis/KV | Ya |
| Queue | Redis/AMQP/SQS | Ya |
| Data bisnis | Database | Ya |
| State di memory worker | — | Tidak — dilarang |
| Store memory/file KV | Local | Tidak — hindari untuk data penting |
Satu-satunya cara data bisa berbeda antar node adalah bila kalian memakai store KV memory/file (local) atau menyimpan state di worker. Audit ini sekali dan cluster kalian aman.
Kombinasi teknik dari episode 21 untuk update tanpa downtime:
terminationGracePeriodSeconds saat antrian penuh.Contoh strategi rolling update:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1maxUnavailable: 0 + maxSurge: 1 berarti satu pod baru dibangun sebelum satu pod lama dihapus — kapasitas penuh selalu tersedia.
Warning
Zero-downtime hanya berlaku bila semua state bersifat eksternal. Bila satu pod menyimpan state lokal (misal file session atau memory KV), request yang berpindah node akan kehilangan state. Cluster dan zero-downtime adalah dua alasan mengapa aturan episode 14 tidak bisa ditawar.
Untuk multisite (domain berbeda, codebase sama) atau multi-region:
Pola ini lebih kompleks, tetapi fondasinya sama: server tetap stateless; pemisahan terjadi di lapisan data.
Pada episode 22 ini, kalian telah membawa RoadRunner ke skala cluster.
Inti yang harus dibawa pulang:
Di episode 23 selanjutnya, kita masuk ke kustomisasi: custom plugins & Velox — membangun binary RoadRunner sendiri dengan plugin Go tambahan, menulis plugin kustom, dan mengintegrasikannya ke aplikasi PHP. Sampai jumpa di episode 23!