Laravel Broadcasting Realtime Events Echo Pusher Driver Concepts
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama Laravel untuk melanjutkan topik lainnya.
Kembali ke rujukan utama Laravel untuk melanjutkan topik lainnya.
Broadcasting di Laravel adalah cara mengirim event aplikasi ke client melalui channel realtime, biasanya lewat WebSocket provider seperti Pusher atau driver lain yang kompatibel.
Kalau request biasa sifatnya client → server → response, broadcasting menambah jalur server → banyak client tanpa menunggu client melakukan polling terus-menerus.
Realtime dipakai kalau UI perlu bereaksi cepat terhadap perubahan yang datang dari luar konteks halaman aktif.
Contoh yang cocok:
pending ke paidRealtime bukan default untuk semua fitur.
Jangan pakai realtime kalau:
Aturan kasarnya: kalau keterlambatan beberapa detik masih aman, realtime sering kali bukan kebutuhan wajib.
Alur dasarnya begini:
ShouldBroadcast atau ShouldBroadcastNow.config/broadcasting.php.Event adalah sinyal bahwa sesuatu penting sudah terjadi.
Di konteks realtime, event biasanya membawa data minimal yang dibutuhkan UI untuk update. Jangan asal kirim seluruh model kalau client hanya butuh satu status.
Channel adalah jalur distribusi event.
Jenis yang umum:
Channel naming harus konsisten dan mudah dipetakan ke domain.
Contoh:
orders.{orderId}chat.{roomId}presence.project.{projectId}Driver adalah implementasi transport yang dipakai Laravel untuk mengirim event ke layanan realtime.
Di Laravel, driver ini dikonfigurasi melalui broadcast connection. Konsepnya sama seperti cache atau queue driver: aplikasi Laravel tidak peduli detail transport selama kontraknya sama.
Contoh driver/transport yang sering ditemui:
Laravel Echo adalah helper client-side untuk subscribe channel dan mendengar event dengan API yang lebih nyaman dibanding manipulasi WebSocket mentah.
Echo memudahkan hal seperti:
private atau presence channelEcho tidak menggantikan state management. Echo hanya sumber event; UI tetap perlu memutuskan bagaimana state diperbarui.
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class OrderPaid implements
Echo.private(`orders.${orderId}`)
.listen('.order.paid', (event) => {
updateOrderStatus(event.order_id, event.status)
})broadcastAs(), sering kali nama event di client perlu prefiks titik (.order.paid) agar tidak otomatis diubah.Driver menentukan bagaimana event keluar dari aplikasi.
Secara praktis, ini memengaruhi:
Kalau app kecil, driver managed seperti Pusher sering lebih simpel. Kalau volume tinggi atau arsitektur sudah kompleks, tim biasanya mulai mempertimbangkan trade-off biaya, kontrol, dan observability.
Realtime bukan database.
Kalau browser keburu disconnect, event bisa terlewat. Karena itu UI tetap harus bisa:
Praktik aman: gunakan realtime untuk notifikasi perubahan, lalu ambil ulang state penting dari API saat perlu.
Mengirim seluruh objek sering kelihatan praktis, tapi mahal.
Masalahnya:
Lebih baik kirim data minimum yang cukup untuk update UI.
Private dan presence channel harus dilindungi.
Kalau authorization salah, subscribe gagal diam-diam atau event tidak pernah masuk. Di production, ini sering terlihat seperti “realtime-nya mati”, padahal masalahnya ada di auth handshake.
Event bisa datang lebih dari sekali, atau state bisa di-refresh dari sumber lain pada saat yang sama.
Kalau logic frontend tidak idempotent, UI bisa double insert, angka jadi dobel, atau list urutannya rusak.
Koneksi WebSocket bisa putus karena jaringan, proxy, timeout, atau tab tidur.
UI yang sehat biasanya punya fallback:
Broadcasting paling enak kalau event merepresentasikan kejadian domain, bukan sekadar aksi visual.
Contoh yang bagus:
OrderPaidMessageSentInventoryAdjustedContoh yang kurang sehat:
FlashToastNowToggleModalKalau event terlalu UI-centric, backend jadi susah dirawat dan logic bisnis ikut bocor ke layer presentasi.
Beberapa broadcast berjalan lewat queue. Kalau queue worker mati, event tidak terkirim.
Di production, itu artinya realtime tampak rusak padahal problemnya ada di worker, retry, atau failed jobs.
BROADCAST_CONNECTION atau konfigurasi broadcasting konsisten dengan environment.Pakai broadcasting kalau:
Kalau kebutuhan utamanya cuma “UI jangan terasa lambat”, sering kali caching, polling ringan, atau refresh manual sudah cukup.
Broadcasting di Laravel adalah jalur server-to-client untuk update realtime. Event mendefinisikan kejadian, channel menentukan siapa yang menerima, driver menentukan bagaimana event dikirim, dan Laravel Echo membantu client mendengarkan update itu dengan rapi.
Kalau dipakai dengan benar, realtime membuat UX lebih responsif. Kalau dipakai asal-asalan, hasilnya justru rawan race condition, payload besar, dan state UI yang susah dijaga.