Belajar WebSocket - Rooms, Namespaces & Broadcasting Patterns
Episode 9 of 34

Belajar WebSocket - Rooms, Namespaces & Broadcasting Patterns

Episode ini membahas pengelompokan koneksi di Socket.IO: konsep room dan namespace, join dan leave room, pola broadcasting yang tepat sasaran, serta implementasi chat per room.

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

Pendahuluan

Di episode 8 kalian mengamankan koneksi dengan autentikasi. Sekarang saatnya menjawab pertanyaan yang lebih besar: bagaimana cara mengirim pesan ke sebagian klien, bukan semua? Jawabannya adalah rooms, namespaces, dan pola broadcasting.

Episode 9 membahas tiga alat penting Socket.IO: room untuk grup koneksi, namespace untuk pemisahan domain komunikasi, dan broadcasting untuk menjangkau target yang tepat. Kalian akan membangun chat yang mendukung banyak room sekaligus, mirip seperti channel di aplikasi messaging profesional.

Konsep Room di Socket.IO

Apa itu Room

Room adalah grup koneksi yang dibuat di sisi server. Koneksi bisa bergabung ke banyak room sekaligus, dan server bisa mengirim pesan hanya ke anggota room tertentu.

JSJoin dan leave room
io.on("connection", (socket) => {
  socket.on("join:room", (room) => {
    socket.join(room);
    socket.emit("sistem", "Kamu masuk ke room " + room);
  });
 
  socket.on("leave:room", (room) => {
    socket.leave(room);
  });
});

socket.join(room) menambahkan koneksi ke room, dan socket.leave(room) menariknya keluar. Room dibuat secara otomatis saat ada koneksi pertama yang bergabung, dan dihapus saat kosong.

Pesan yang dikirim ke room hanya sampai ke anggota room itu. Ini memisahkan percakapan secara logis tanpa perlu membuat server baru.

JSBroadcast khusus room
socket.to("game-1").emit("status", { pemain: 3 });

Metode socket.to(room).emit(...) mengirim ke semua anggota room kecuali pengirim. Untuk termasuk pengirim, gunakan io.to(room).emit(...).

Namespace

Pemisahan Domain Komunikasi

Namespace adalah endpoint terpisah dalam satu server Socket.IO. Default namespace adalah /, tapi kalian bisa membuat namespace baru seperti /admin atau /public.

JSMembuat namespace khusus
const adminNs = io.of("/admin");
 
adminNs.on("connection", (socket) => {
  socket.on("hapus:user", (id) => {
    adminNs.emit("user:deleted", id);
  });
});

io.of("/admin") membuat namespace baru. Koneksi ke namespace itu terisolasi dari namespace lain: event yang dikirim di /admin tidak akan diterima koneksi di /.

Koneksi ke Namespace

Klien terhubung ke namespace dengan menambahkan jalurnya pada URL.

JSKlien konek ke namespace
const adminSocket = io("https://api.example.com/admin", {
  auth: { token: localStorage.getItem("token") },
});

URL https://api.example.com/admin mengarah ke namespace admin. Namespace sering digunakan untuk memisahkan area publik, area admin, dan area khusus pengguna dalam satu aplikasi.

Pola Broadcasting

Empat Pola Dasar

Ada beberapa cara menyiarkan pesan, masing-masing dengan target berbeda:

JSVariasi pola broadcast
io.emit("event", data);               // semua klien
socket.emit("event", data);           // hanya pengirim
socket.broadcast.emit("event", data); // semua kecuali pengirim
io.to("room-a").emit("event", data);  // anggota room-a

Pola io.emit(...) menyiarkan ke semua koneksi di namespace. Kombinasi to() dan emit() memungkinkan pengiriman ke satu room, beberapa room sekaligus, atau unicast ke koneksi tertentu.

Conditional Broadcasting

Kadang pengiriman perlu mempertimbangkan kondisi, misalnya hanya ke pengguna yang online atau yang berstatus tidak sibuk.

JSBroadcast bersyarat
io.to(room).emit("pesan", pesan);
socket.to(room).emit("tipe", {
  nama: socket.nama,
  mengetik: true,
});

Pola ini umum dipakai untuk indicator mengetik: hanya anggota room yang menerima status, bukan seluruh server.

Implementasi Chat per Room

Server Room Chat

Mari gabungkan semua konsep menjadi server chat multi-room:

JSServer chat multi-room
const { Server } = require("socket.io");
 
const io = new Server(server);
 
io.on("connection", (socket) => {
  socket.on("chat:join", (data) => {
    socket.join(data.room);
    socket.to(data.room).emit("sistem", data.nama + " bergabung");
  });
 
  socket.on("chat:message", (data) => {
    io.to(data.room).emit("chat:message", {
      nama: data.nama,
      teks: data.teks,
    });
  });
});

Handler chat:message memakai io.to(data.room) agar pesan hanya sampai ke room tujuan. Event join dan message memakai data yang sama, sehingga satu server bisa melayani ribuan room berbeda.

Skalabilitas Room

Room sangat ringan secara memori — sebuah server bisa menampung puluhan ribu room. Saat server dipecah menjadi beberapa instance, sinkronisasi room membutuhkan Redis adapter yang akan dibahas di episode 16.

Penutup

Episode 9 melengkapi toolkit komunikasi: room untuk grup, namespace untuk domain terisolasi, dan pola broadcast yang bisa disetel sekecil unicast atau sebesar seluruh server.

Inti yang harus dibawa pulang:

  • Room mengelompokkan koneksi secara logis tanpa server terpisah.
  • Join dan leave dilakukan dengan socket.join dan socket.leave.
  • Namespace memisahkan domain seperti publik dan admin.
  • Pola broadcast menentukan target: semua, kecuali pengirim, atau per room.
  • Chat multi-room bisa dibangun hanya dengan beberapa baris handler.

Di episode 10 berikutnya kita membahas message serialization & data formats: cara mengemas pesan teks dan binary, format JSON, MessagePack, protobuf, serta pola envelope untuk pesan yang terstruktur dan mudah dipertahankan versinya.

Belajar WebSocket - Rooms, Namespaces & Broadcasting Patterns | Belajar WebSocket