Hệ thống Live Chat Đơn Giản Suýt Làm Hỏng Bản Phát Hành Này

Một hệ thống live chat cơ bản suýt chút nữa đã phá hỏng bản phát hành mới nhất của tôi.

Nghe có vẻ đơn giản. Bạn hiển thị những người dùng ở gần và cho phép họ trò chuyện. Nhưng thực tế kỹ thuật lại khó hơn nhiều. Tôi đã phải kết nối live chat với định vị địa lý (geolocation) và một hệ thống đánh giá. Điều này đã tạo ra sự phức tạp cực lớn về mặt kỹ thuật bên trong.

Kiến trúc:

• Frontend: React và TypeScript. • Backend: Node.js với Express và WebSockets. • Database: PostgreSQL cho người dùng và đánh giá. • Cache: Redis cho các phiên hoạt động và trạng thái hiện diện (presence).

Vấn đề Định vị Địa lý (Geolocation)

Ghép đôi người dùng theo vị trí không hề dễ dàng. Tôi đã phải xử lý rất nhiều trường hợp biên (edge cases):

  • Lưu trữ vĩ độ và kinh độ.
  • Sử dụng các tiện ích mở rộng (extensions) của Postgres để truy vấn khoảng cách.
  • Xử lý những người dùng từ chối quyền truy cập vị trí.
  • Quản lý dữ liệu lỗi thời (stale data) khi người dùng di chuyển mà không mở ứng dụng.

Nếu làm lại việc này, tôi sẽ tách biệt việc thu thập vị trí và việc ghép đôi thành các dịch vụ khác nhau.

Thực tế của Live Chat

WebSockets mang lại các tính năng thời gian thực, nhưng chúng cũng mang lại sự hỗn loạn. Tôi đã sử dụng Redis pub/sub để gửi tin nhắn qua các máy chủ khác nhau.

Những phần khó nhất là:

  • Dọn dẹp các kết nối khi người dùng ngắt kết nối bất ngờ.
  • Ngăn chặn tin nhắn được gửi vào các phòng mà người dùng đã rời khỏi.
  • Xử lý việc kết nối lại mà không tạo ra các phiên ảo (ghost sessions).

Tôi học được rằng một máy trạng thái (state machine) chính thức sẽ tốt hơn là chỉ sử dụng các cờ (flags) đơn giản.

Hệ thống Đánh giá

Đánh giá có vẻ tầm thường cho đến khi bạn bắt tay vào xây dựng chúng. Tôi đã phải đảm bảo:

  • Người dùng không thể đánh giá cùng một phiên hai lần.
  • Các đánh giá được tổng hợp nhanh chóng để hiển thị trên hồ sơ.
  • Dữ liệu luôn nhất quán trong toàn bộ ứng dụng.

Tôi đã sử dụng các ràng buộc duy nhất (unique constraints) trên session ID để ngăn chặn việc trùng lặp và lưu bộ nhớ đệm (cache) các giá trị trung bình để tối ưu hiệu suất.

Bài học rút ra

Nếu xây dựng lại hệ thống này vào hôm nay, tôi sẽ thay đổi ba điều:

  1. Tách biệt việc ghép đôi và chat thành các module riêng biệt.
  2. Sử dụng mô hình hóa rõ ràng cho các trạng thái kết nối WebSocket.
  3. Thêm nhật ký (logs) và các chỉ số (metrics) tốt hơn cho chat và ghép đôi ngay từ ngày đầu tiên.

Xây dựng phần mềm là một chuỗi các quyết định nhỏ. Những quyết định này sẽ quyết định hệ thống của bạn là sạch sẽ hay mong manh.

Bạn đã từng xây dựng hệ thống live chat hay hệ thống ghép đôi nào chưa? Bạn sẽ làm gì khác đi?

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