Nguyên tắc thiết kế của nhóm Mezon

3 min read

Đặc điểm của hệ thống chat

Hệ thống chat ngày nay không chỉ đơn thuần là một ứng dụng nhắn tin mà còn là một công cụ giao tiếp thời gian thực (real-time) với những yêu cầu khắt khe về hiệu suất và độ tin cậy. Các hệ thống chat phải đảm bảo thời gian phản hồi nhanh chóng và duy trì sự đồng nhất về dữ liệu, mặc dù mức độ đồng nhất có thể không cao như các hệ thống doanh nghiệp (enterprise systems). Một trong những thách thức lớn là sự tương tác liên tục giữa server và client, dẫn đến một lượng lớn bản ghi trong cơ sở dữ liệu, mặc dù kích thước của từng bản ghi thường nhỏ.

Để đảm bảo tính mượt mà và đáp ứng tốt cho một lượng người dùng lớn, team Mezon đã thiết lập một số quy tắc và phương pháp để tối ưu hóa hiệu suất và đảm bảo tính năng hoạt động hiệu quả nhất có thể.

Về xử lý framework

Một trong những yếu tố quyết định hiệu suất của hệ thống chat chính là việc lựa chọn framework phù hợp. Đối với Mezon, việc ưu tiên các framework có hiệu suất cao là điều cần thiết. Chúng tôi đã chọn Golang và từ bỏ việc sử dụng ORM (Object-Relational Mapping) để tăng cường hiệu suất xử lý và giảm độ trễ.

Về xử lý logic server

Để tối ưu hóa việc xử lý logic trên server, chúng tôi phân loại các tác vụ theo ba cấp độ tần suất sử dụng:

  1. Tần Suất Cao: Đối với các tác vụ có tần suất cao, như việc lấy lịch sử trò chuyện hoặc gửi thông báo cho tất cả các tin nhắn, team Mezon không thực hiện các logic phức tạp. Thay vào đó, chúng tôi ưu tiên lấy dữ liệu đã có sẵn để giảm thiểu độ trễ và tăng hiệu quả xử lý. Điều này giúp giảm thiểu công sức xử lý đồng bộ dữ liệu.
  2. Tần Suất Vừa: Các tác vụ có tần suất vừa phải, như xử lý trường hợp có mention, cũng được ưu tiên không thực hiện logic phức tạp. Điều này giúp duy trì hiệu suất ổn định mà không làm giảm chất lượng trải nghiệm người dùng.
  3. Tần Suất Thấp: Đối với các tác vụ có tần suất thấp, chúng tôi ưu tiên xử lý và tổng hợp dữ liệu (sync) để phục vụ cho các tác vụ nhanh chóng hơn. Điều này đảm bảo rằng các chức năng ít được sử dụng vẫn hoạt động hiệu quả mà không làm ảnh hưởng đến hệ thống chính.
  4. Đối với socket: Cần đảm bảo số lượng socket bằng số lượng user trong hệ thống.

Với các bảng chứa nhiều data

Tránh sử dụng phép toán join; thay vào đó, bổ sung trường jsonb cho các thông tin cần thiết.

Đánh chỉ mục (index) hợp lý để tối ưu hóa truy vấn.

Partition dữ liệu theo tháng để cải thiện hiệu suất.

Với Redis cache

Chỉ tạo key sao cho có thể access by key được. Mục đích là truy xuất với độ phức tạp O(1)

Tránh sử dụng các lệnh Scan và Keys để giảm thiểu độ phức tạp.

Các tác vụ có tần suất cao ưu tiên sử dụng Redis; hạn chế tối đa việc query select DB.

Các tác vụ có tần suất thấp sẽ cập nhật Redis khi cần thiết.

Với FrontEnd

Khi render message history cần tránh select từ store và tính toán phức tạp. Server cần trả về đủ thông tin để FE chỉ cần hiển thị, không cần thực hiện thao tác logic phức tạp.

Khi user nhập text, cần phân tích để tạo định dạng phù hợp cho render đơn giản nhất

Tạm kết

Vấn đề hiện tại là những tác vụ ảnh hưởng đến nhiều cached data như thay đổi avatar, display name vẫn khó để handle. Mọi người có thể vào https://mezon.ai để trải nghiệm thử. Với những cải tiến và giải pháp tối ưu hóa này, chúng tôi hy vọng hệ thống chat của Mezon sẽ đáp ứng tốt hơn yêu cầu của người dùng và mang lại trải nghiệm mượt mà hơn.

Avatar photo

Clean Code: Nguyên tắc viết hàm trong lập trình…

Trong quá trình phát triển phần mềm, việc viết mã nguồn dễ đọc, dễ hiểu là yếu tố then chốt để đảm bảo code...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc comment trong lập trình

Trong lập trình, code không chỉ là một tập hợp các câu lệnh để máy tính thực thi, mà còn là một hình thức...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc xử lý lỗi (Error Handling)

Trong quá trình phát triển phần mềm, việc xử lý lỗi không chỉ là một phần quan trọng mà còn ảnh hưởng trực tiếp...
Avatar photo Dat Tran Thanh
4 min read

Leave a Reply

Your email address will not be published. Required fields are marked *