𝗦𝗲𝗺𝗯𝗮𝗻𝗴 𝗟𝗮𝗻𝗴𝘀𝘂𝗻𝗴 𝗠𝘂𝗱𝗮𝗵 𝗛𝗮𝗺𝗽𝗶𝗿 𝗠𝗲𝗻𝗷𝗲𝗷a𝘀𝗸𝗮𝗻 𝗣𝗲𝗹𝗮𝗻𝗰𝗮𝗿𝗮𝗻 𝗜𝗻𝗶

Sebuah sistem sembang langsung yang asas hampir merosakkan pelancaran terbaru saya.

Ia kedengaran mudah. Anda tunjukkan pengguna berdekatan dan biarkan mereka berbual. Namun, realiti teknikalnya jauh lebih sukar. Saya perlu menyambungkan sembang langsung dengan geolokasi dan sistem penilaian. Ini mewujudkan kerumitan yang besar di sebalik tabir.

Seni Bina:

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

Masalah Geolokasi

Memadankan pengguna mengikut lokasi tidaklah mudah. Saya perlu mengendalikan banyak kes terpinggir (edge cases):

  • Menyimpan latitud dan longitud.
  • Menggunakan sambungan (extensions) Postgres untuk membuat pertanyaan jarak.
  • Mengendalikan pengguna yang menolak kebenaran lokasi.
  • Menguruskan data lapuk apabila pengguna bergerak tanpa membuka aplikasi.

Jika saya melakukannya lagi, saya akan memisahkan pengumpulan lokasi daripada pemadanan ke dalam perkhidmatan yang berbeza.

Realiti Sembang Langsung

WebSockets membawa ciri masa nyata, tetapi ia juga membawa kekacauan. Saya menggunakan Redis pub/sub untuk menghantar mesej merentasi pelayan yang berbeza.

Bahagian yang paling sukar adalah:

  • Membersihkan sambungan apabila pengguna terputus sambungan secara tidak dijangka.
  • Menghalang mesej daripada dihantar ke bilik yang telah ditinggalkan oleh pengguna.
  • Mengendalikan penyambungan semula tanpa mencipta sesi hantu (ghost sessions).

Saya belajar bahawa mesin keadaan (state machine) yang formal adalah lebih baik daripada menggunakan penanda (flags) ringkas.

Sistem Penilaian

Penilaian kelihatan remeh sehinggalah anda membinanya. Saya perlu memastikan:

  • Pengguna tidak boleh menilai sesi yang sama dua kali.
  • Penilaian diagregatkan dengan cepat untuk paparan profil.
  • Data kekal konsisten di seluruh aplikasi.

Saya menggunakan kekangan unik (unique constraints) pada ID sesi untuk mengelakkan pertindihan dan menyimpan purata dalam cache untuk menjimatkan prestasi.

Pengajaran yang Diperoleh

Jika saya membina semula ini hari ini, saya akan mengubah tiga perkara:

  1. Pecahkan pemadanan dan sembang ke dalam modul yang berasingan.
  2. Gunakan pemodelan eksplisit untuk keadaan sambungan WebSocket.
  3. Tambah log dan metrik yang lebih baik untuk sembang dan pemadanan dari hari pertama.

Membina perisian adalah siri keputusan kecil. Keputusan ini menentukan sama ada sistem anda bersih atau rapuh.

Pernahkah anda membina sistem sembang langsung atau sistem pemadanan? Apakah yang akan anda lakukan secara berbeza?

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