Laravel

Laravel Reverb dan CRDT: Ketika Monolith Menjadi Coordinator untuk State Sync Real-Time

Kholil · 20 Apr 2026 · 6 min read · 1 views
Laravel Reverb dan CRDT: Ketika Monolith Menjadi Coordinator untuk State Sync Real-Time

Tren tersembunyi: Laravel Reverb + CRDT mengubah monolith jadi coordinator state real-time. Offline-first, no merge conflicts, Figma-like collaboration.

Pendahuluan: Tren Tersembunyi di Balik "The Splat"

Komunitas Laravel sedang sibuk membicarakan SQLite, simplified deployment, dan "The Splat"—sebuah gerakan menuju kesederhanaan infrastruktur. Namun, di bawah permukaan, ada sebuah tren yang jauh lebih menarik dan revolusioner yang jarang dibicarakan: penggunaan CRDT (Conflict-free Replicated Data Types) untuk sinkronisasi state real-time melalui Laravel Reverb.

Selama satu dekade, Laravel dibangun atas fondasi Request-Response cycle—sebuah model di mana server adalah satu-satunya sumber kebenaran (source of truth). Namun paradigma baru sedang muncul yang mengubah peran Laravel dari sekadar "API gateway" menjadi CRDT Coordinator—sebuah sistem yang dapat mensinkronkan state kompleks antar pengguna secara real-time, offline-first, dan tanpa merge conflicts.

Dengan peluncuran Laravel Reverb (WebSocket server first-party dengan performa tinggi), hambatan teknis untuk komunikasi real-time telah hilang. Kini, pertanyaannya bukan lagi "bagaimana kita membuat real-time notification?", melainkan "bagaimana kita membangun pengalaman kolaboratif seperti Figma atau Google Docs di dalam monolith PHP?"

Memahami CRDT dan Mengapa Ini Penting untuk Laravel

CRDT adalah struktur data matematis yang memungkinkan multiple nodes (clients) untuk secara independen memodifikasi state, dan kemudian ketika mereka terhubung kembali, perubahan tersebut akan auto-merge tanpa konflik. Ini berbeda dengan pendekatan tradisional yang mengandalkan database locking atau operational transformation yang kompleks.

Dalam konteks Laravel, alih-alih mengirim pesan "User A mengubah field X menjadi Y" dan menyimpannya ke database, sistem berbasis CRDT mengirim delta terenkripsi dari state lokal setiap client. Laravel Reverb bertindak sebagai orchestrator—menerima delta ini, memverifikasi integritas, dan menyebarkannya kembali ke semua clients yang terhubung.

Perpustakaan seperti Yjs (berbasis TypeScript) dan Automerge (berbasis JavaScript/Rust) telah menjadi standar industri untuk implementasi CRDT. Yang menarik: kedua library ini dapat diintegrasikan dengan Laravel Reverb tanpa memerlukan infrastruktur Node.js terpisah.

Arsitektur: Dari Request-Response ke State Synchronization

Model Tradisional Laravel

Dalam model tradisional:

  1. Client mengirim HTTP request ke Laravel
  2. Laravel memproses, menyimpan ke database
  3. Server mengirimkan response JSON
  4. Client memperbarui UI berdasarkan response

Pendekatan ini memiliki latensi inherent dan tidak mendukung kolaborasi real-time yang smooth.

Model CRDT-Driven Monolith

Dalam model baru:

  1. Client melakukan perubahan pada state lokal (menggunakan Yjs) tanpa menunggu server
  2. Client mengirim delta (bukan seluruh state) ke Laravel Reverb
  3. Laravel Reverb memverifikasi delta dan mengbroadcast ke semua clients lain
  4. Setiap client me-merge delta tersebut ke state lokal mereka tanpa merge conflicts
  5. Database Laravel (masih) menjadi source of truth untuk persistence jangka panjang, tapi bukan lagi "truth" real-time

Kode Ilustrasi: Setup Awal

Mari kita lihat bagaimana setup dasar Laravel Reverb + Yjs terlihat:

// app/Http/Controllers/DocumentController.php
namespace App\Http\Controllers;

use Illuminate\Broadcasting\Channel;
use Illuminate\Support\Facades\Broadcast;

class DocumentController extends Controller
{
    public function joinSession($documentId)
    {
        return Broadcast::channel(
            'document.' . $documentId,
            function ($user) {
                return true; // Authorize user
            }
        );
    }

    public function syncDelta(Request $request, $documentId)
    {
        $delta = $request->input('delta');
        $version = $request->input('version');

        // Store delta in database for audit/recovery
        DocumentDelta::create([
            'document_id' => $documentId,
            'user_id' => auth()->id(),
            'delta' => $delta,
            'version' => $version,
        ]);

        // Broadcast delta to all connected clients
        broadcast(new DeltaSync($documentId, $delta, $version));

        return response()->json(['status' => 'synced']);
    }
}

Di sisi frontend (JavaScript dengan Yjs):

import * as Y from 'yjs';
import { WebsocketProvider } from 'y-websocket';

const ydoc = new Y.Doc();
const ytext = ydoc.getText('shared-text');

const provider = new WebsocketProvider(
    'ws://localhost:6001',
    'document.1',
    ydoc
);

// Local changes apply immediately
ytext.observe(event => {
    console.log('Change detected:', event.changes);
});

// Bind to editor
const editor = document.getElementById('editor');
editor.addEventListener('input', (e) => {
    ytext.insert(0, e.target.value);
});

Mengapa Database Menjadi "Secondary Truth"

Ini adalah konsep yang paling counter-intuitive bagi developer Laravel tradisional. Dalam sistem CRDT-driven, database tidak lagi menjadi primary source of truth untuk state real-time. Sebaliknya, database berfungsi sebagai:

  • Audit trail: Setiap delta dicatat untuk compliance dan debugging
  • Persistent snapshot: State terakhir yang disetujui disimpan untuk recovery
  • Query engine: Untuk operasi read-heavy seperti searching atau reporting

State real-time hidup di distributed clients dan Reverb in-memory store. Ketika user offline, mereka terus melakukan perubahan lokal. Ketika reconnect, Laravel Reverb menangani merge matematis tanpa konflik.

Local-First Persistence: Game Changer untuk Pengalaman Pengguna

Fitur killer dari CRDT adalah offline-first capability. User dapat:

  • Membuka dokumen saat online
  • Kehilangan koneksi internet
  • Terus mengedit tanpa lag atau error
  • Reconnect, dan perubahan mereka auto-merge dengan perubahan dari user lain

Ini mengubah paradigma UX secara fundamental. Tidak ada lagi "save failed" error atau "you were disconnected" modal. Semuanya bekerja seamlessly.

Use Cases Praktis yang Sedang Berkembang

Meskipun tren ini masih underground, beberapa use cases sudah menunjukkan potensi nyata:

  • Collaborative Spreadsheets: Seperti Excel online, tapi dalam monolith PHP
  • Real-Time Kanban Boards: Multiple users drag-drop cards tanpa race conditions
  • Shared Code Editors: Untuk pair programming atau code review sessions
  • Collaborative Design Tools: SVG-based atau canvas-based collaborative drawing
  • Multiplayer Task Management: Google Keep-like apps dengan offline support

Tantangan Teknis yang Perlu Dipertimbangkan

Meskipun powerful, pendekatan ini bukan tanpa kompleksitas:

1. Memory Management di Reverb

Reverb adalah in-memory server. Jika Anda memiliki ribuan concurrent documents dengan state besar, memory footprint bisa meledak. Solusi: implement document unloading strategy.

2. Conflict Resolution yang Kompleks

CRDT menghilangkan merge conflicts otomatis, tapi Anda masih perlu business logic untuk "semantic conflicts" (misalnya: dua user menghapus item yang sama). Ini harus dihandle di application layer.

3. Audit dan Compliance

Dengan state distributed di multiple clients, audit trail menjadi lebih kompleks. Setiap delta harus dicatat dengan metadata (user, timestamp, version).

// Contoh: Logging delta dengan metadata
DocumentDelta::create([
    'document_id' => $documentId,
    'user_id' => auth()->id(),
    'delta' => json_encode($delta),
    'clock_vector' => $request->input('clock_vector'), // Untuk ordering
    'created_at' => now(),
]);

Mengapa Laravel Developer Harus Perhatikan Ini

Mitos paling besar tentang Laravel adalah bahwa PHP "terlalu lambat" untuk aplikasi real-time yang heavy. CRDT + Reverb menunjukkan bahwa mitos ini fundamental salah. Laravel tidak perlu mencoba bersaing dengan Node.js dalam hal latency raw. Sebaliknya, dengan offloading state resolution ke client, Laravel menjadi coordinator yang sangat efficient.

Ini berarti:

  • Anda dapat membangun SaaS kolaboratif kompleks tanpa microservices
  • Developer PHP dapat bersaing dengan React/Node.js developers dalam hal UX
  • Total cost of ownership turun (satu bahasa, satu framework, satu deployment pipeline)
  • Debugging dan maintenance menjadi lebih mudah (monolith yang coherent)

Kesimpulan: The Future of Laravel Collab Apps

Sementara industri sibuk dengan AI wrappers dan hype-driven architecture, Local-First Laravel dengan CRDT adalah sleeper hit yang akan mendefinisikan generasi SaaS berikutnya. Tren ini belum mainstream, documentation belum lengkap, dan tutorial jarang ditemukan—tapi ini adalah exactly mengapa early adopters akan memiliki competitive advantage yang signifikan.

Laravel Reverb + Yjs bukan hanya kombinasi tool. Ini adalah paradigm shift yang mengubah peran developer PHP dari "database gatekeeper" menjadi "state synchronizer". Siapa yang ready untuk mengambil langkah ini?