Belajar RoadRunner - RPC & Goridge
Episode 7 of 26

Belajar RoadRunner - RPC & Goridge

Mempelajari protokol Goridge sebagai tulang punggung komunikasi Go dan PHP: memakai package spiral/goridge untuk memanggil method plugin dari PHP, dan membuka jalur sebaliknya dengan service RPC kustom.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Di episode 2 kita menyebut Goridge sebagai jembatan Go↔PHP. Pada episode kali ini kita benar-benar melewati jembatan itu: memahami RPC RoadRunner dan memakai package spiral/goridge untuk komunikasi dua arah. Ini adalah fondasi dari semua plugin (KV, jobs, metrics, gRPC) yang akan kalian pakai di episode-episode berikutnya.

Mengapa episode ini penting? Karena begitu kalian paham RPC, plugin-plugin RoadRunner bukan lagi kotak hitam — kalian tahu persis bahwa kv.Get(), jobs.Push(), dan metrics.Inc() semuanya berjalan di atas mekanisme yang sama yang akan kita bedah sekarang.

Konsep RPC RoadRunner

RoadRunner membuka port RPC (default tcp://127.0.0.1:6001) yang dipakai aplikasi PHP untuk memanggil method yang disediakan plugin di sisi Go. Alurnya:

100%
  • Server Go mendengarkan port RPC dan mendaftarkan semua method plugin.
  • Aplikasi PHP membuat client RPC lalu memanggil method dengan nama plugin.Method (misal kv.Get).
  • Payload di-encode dengan protokol Goridge (berbasis protobuf sejak v2) dan dikembalikan ke PHP.

Port RPC dikonfigurasi di blok rpc:

Blok rpc
rpc:
  listen: tcp://127.0.0.1:6001

Memanggil dari PHP: Package spiral/goridge

Untuk memanggil method plugin dari PHP, gunakan package spiral/goridge:

Install package Goridge
composer require spiral/goridge

Contoh pemanggilan method RPC sederhana:

Memanggil RPC dari PHP
<?php
 
use Spiral\Goridge\RPC\RPC;
 
$rpc = RPC::create('tcp://127.0.0.1:6001');
 
// Set TTL 30 detik untuk method service_ready
$rpc->withServicePrefix('health')->withTimeout(30);
 
// Memanggil method "check" pada service "health"
$result = $rpc->call('health.check', ['healthy' => true]);
 
var_dump($result);

Detail yang perlu dipahami:

  • RPC::create($address) membuat koneksi ke port RPC. Bisa juga memakai Unix socket (unix://...) untuk keamanan lokal.
  • $rpc->call('health.check', $payload) memanggil method check pada service health dengan payload JSON.
  • Hasil call di-decode otomatis — objek menjadi stdClass/array PHP.
  • withTimeout() membatasi durasi tunggu agar worker tidak menggantung saat RPC lambat.

Pola Sebenarnya: Package Wrapper

Dalam praktik nyata kalian jarang memakai $rpc->call() langsung. Package seperti spiral/roadrunner-kv, spiral/roadrunner-jobs, dan spiral/roadrunner-metrics adalah wrapper di atas RPC yang menyediakan API yang nyaman. Misalnya memanggil KV:

Memanggil plugin KV via wrapper
use Spiral\RoadRunner\KeyValue\Factory;
 
$cache = (new Factory($rpc))->select('redis');
$cache->set('cart:42', $payload, 3600);
$value = $cache->get('cart:42');

Di balik layar, set() ini mengirim kv.Set ke server Go. Wrapper hanya menyembunyikan serialisasi dan nama method. Episode 10-12 akan memakai pola ini untuk KV, queue, dan metrics.

Arah Sebaliknya: Dari Go ke PHP

RPC tidak satu arah. Kalian bisa mendaftarkan method PHP agar bisa dipanggil dari Go, memakai Spiral\RoadRunner\RPC\ServiceInterface:

Service RPC kustom di PHP
<?php
 
use Spiral\RoadRunner\RPC\ServiceInterface;
 
final class HealthService implements ServiceInterface
{
    public function check($args): array
    {
        return ['status' => 'ok', 'time' => time()];
    }
}

Lalu daftarkan ke RPC server di dalam worker:

Daftarkan service ke RPC
$rpc = RPC::create('tcp://127.0.0.1:6001');
$rpc->withService(new HealthService());

Setelah worker menjalankan kode ini, service health.check bisa dipanggil oleh server Go — misalnya dari plugin kustom Go (episode 23) atau oleh proses lain yang terhubung ke port RPC. Ini membuka pola menarik: Go men-delegate komputasi berat ke pool PHP, dan PHP men-delegate infrastruktur ke Go.

Warning

Port RPC tanpa otentikasi adalah permukaan serangan: siapa pun yang bisa menjangkau tcp://127.0.0.1:6001 bisa memanggil method plugin. Jangan expose port RPC ke publik. Untuk lingkungan multi-proses, pertimbangkan Unix socket (unix://rr.sock) atau firewall ketat — detail hardening di episode 17.

Troubleshooting RPC

Masalah RPC paling umum dan solusinya:

GejalaKemungkinan PenyebabSolusi
connection refusedPlugin rpc tidak aktif / port salahPastikan blok rpc ada dan alamat cocok
unknown method kv.GetPlugin KV belum dikonfigurasiTambah blok kv (episode 10)
Call timeoutWorker macet atau port RPC overloadPerbesar withTimeout, cek beban pool
Decode errorPayload tidak sesuai skema methodPeriksa tipe data argumen

Penutup

Pada episode 7 ini, kalian telah melewati jembatan Goridge.

Inti yang harus dibawa pulang:

  • RPC RoadRunner adalah jalur aplikasi PHP ke method plugin Go.
  • spiral/goridge menyediakan RPC::create() dan $rpc->call().
  • Package wrapper (KV, jobs, metrics) membungkus RPC dengan API nyaman.
  • RPC dua arah: PHP bisa membuka service yang dipanggil dari Go.
  • Jangan pernah expose port RPC ke publik.

Di episode 8 selanjutnya, kita masuk ke middleware & pipeline — membangun middleware HTTP seperti logging, auth, dan CORS, menyusun pipeline yang rapi, serta menggabungkan middleware RoadRunner level Go dengan middleware PHP. Sampai jumpa di episode 8!