𝗦𝗶𝗺𝗽𝗹𝗲 𝗟𝗶𝘃𝗲 𝗖𝗵𝗮𝘁 𝗛𝗮𝗺𝗽𝗶𝗿 𝗠𝗲𝗻𝗲𝗻𝗴𝗴𝗲𝗹𝗮𝗺𝗸𝗮𝗻 𝗥𝗲𝗹𝗶𝘀 𝗜𝗻𝗶

Sistem chat langsung dasar hampir merusak rilis terbaru saya.

Kedengarannya sederhana. Anda menampilkan pengguna terdekat dan membiarkan mereka mengobrol. Namun, realitas teknisnya jauh lebih sulit. Saya harus menghubungkan chat langsung dengan geolokasi dan sistem penilaian. Hal ini menciptakan kompleksitas besar di balik layar.

Arsitekturnya:

• Frontend: React dan TypeScript. • Backend: Node.js dengan Express dan WebSockets. • Database: PostgreSQL untuk pengguna dan penilaian. • Cache: Redis untuk sesi aktif dan kehadiran (presence).

Masalah Geolokasi

Mencocokkan pengguna berdasarkan lokasi tidaklah mudah. Saya harus menangani banyak kasus ekstrem (edge cases):

  • Menyimpan latitude dan longitude.
  • Menggunakan ekstensi Postgres untuk melakukan query jarak.
  • Menangani pengguna yang menolak izin lokasi.
  • Mengelola data usang (stale data) saat pengguna berpindah tanpa membuka aplikasi.

Jika saya melakukan ini lagi, saya akan memisahkan pengumpulan lokasi dari pencocokan ke dalam layanan yang berbeda.

Realitas Chat Langsung

WebSockets menghadirkan fitur real-time, tetapi juga membawa kekacauan. Saya menggunakan Redis pub/sub untuk mengirim pesan ke berbagai server yang berbeda.

Bagian tersulitnya adalah:

  • Membersihkan koneksi saat pengguna terputus secara tidak terduga.
  • Mencegah pesan terkirim ke ruang (room) yang telah ditinggalkan pengguna.
  • Menangani penyambungan ulang (reconnect) tanpa membuat sesi hantu (ghost sessions).

Saya belajar bahwa state machine formal lebih baik daripada menggunakan flag sederhana.

Sistem Penilaian

Penilaian tampak sepele sampai Anda membangunnya. Saya harus memastikan:

  • Pengguna tidak dapat menilai sesi yang sama dua kali.
  • Penilaian teragregasi dengan cepat untuk tampilan profil.
  • Data tetap konsisten di seluruh aplikasi.

Saya menggunakan batasan unik (unique constraints) pada ID sesi untuk mencegah duplikasi dan menyimpan rata-rata di cache untuk menghemat performa.

Pelajaran yang Dipetik

Jika saya membangun ulang ini hari ini, saya akan mengubah tiga hal:

  1. Memisahkan pencocokan dan chat ke dalam modul yang berbeda.
  2. Menggunakan pemodelan eksplisit untuk status koneksi WebSocket.
  3. Menambahkan log dan metrik yang lebih baik untuk chat dan pencocokan sejak hari pertama.

Membangun perangkat lunak adalah serangkaian keputusan kecil. Keputusan-keputusan ini menentukan apakah sistem Anda bersih atau rapuh.

Pernahkah Anda membangun chat langsung atau sistem pencocokan? Apa yang akan Anda lakukan secara berbeda?

Sumber: https://dev.to/jaeger974/simple-live-chat-almost-sank-this-release-2pn7