Xây dựng hệ thống nhắn tin thời gian thực tối ưu cho tải trọng dữ liệu trên nền tảng đám mây

MỤC LỤC

CƠ SỞ LÝ THUYẾT 2.1. Framework

  • Database
    • Công cụ hỗ trợ 1. RabbitMQ

      Được ưa chuộng trong các dự án có yêu cầu về tính nhất quán, bảo mật, và độ tin cậy cao, PostgreSQL hỗ trợ nhiều loại dữ liệu và cung cấp các tính năng như giao dịch, phân quyền, và truy vấn phức tạp, làm cho nó trở thành lựa chọn lý tưởng cho việc lưu trữ dữ liệu trong các ứng dụng phức tạp. Với khả năng xử lý dữ liệu nhanh chóng và hỗ trợ nhiều kiểu dữ liệu, Redis là một công cụ linh hoạt và mạnh mẽ cho việc quản lý và truy cập dữ liệu trong ứng dụng.

      PHÂN TÍCH THIẾT KẾ HỆ THỐNG 3.1. Phân tích thực tế

      Ưu điểm của các nền tảng hiện tại 1. Khả năng tiếp cận dễ dàng

      Từ gửi tin nhắn văn bản, hình ảnh, gắn thẻ người dùng đến cuộc gọi video và tạo nhóm, các ứng dụng này đáp ứng đầy đủ nhu cầu giao tiếp của người dùng hiện đại. Với số lượng người dùng khổng lồ, các nền tảng như WhatsApp, Facebook Messenger và WeChat đã chứng minh khả năng hỗ trợ lưu lượng người dùng khổng lồ mà vẫn giữ được độ trễ tối thiểu trong đường truyền của tin nhắn bằng sự đầu tư mạnh mẽ vào cơ sở hạ tầng và thiết kế của hệ thống.

      Nhược điểm của các nền tảng hiện tại 1. Bảo mật và quyền riêng tư

      Và cùng với đó các chức năng mới vẫn đang được phát triển liên tục, ví dụ như tính năng nhắn tin ẩn và trò chơi hội nhóm tích hợp bên trong phòng chat. Điều này đặc biệt quan trọng trong việc duy trì trải nghiệm người dùng mượt mà, hiệu quả và không gây khó chịu, từ đó giữ người dùng sử dụng nền tảng.

      Yêu cầu tổng quan

      - Đối với hệ thống vận hành: áp dụng các biện pháp vận hành container, cân bằng tải và bảo mật kết nối giữa các services; cùng với việc cung cấp cỏc cụng cụ theo dừi nhằm đảm bảo backend vận hành như mong muốn, cũng như phát hiện lỗi nếu có. - Người dùng có thể cung cấp và sửa đổi thông tin cho hồ sơ của họ, bao gồm tên người dùng, mã số nhận dạng, ảnh đại diện và mô tả người dùng - Người dùng có quyền chỉnh sửa tên tài khoản, mật khẩu và email liên kết - Người dùng có thể yêu cầu xóa tài khoản, đi cùng với xóa các thông tin.

      Yêu cầu phi chức năng

       Hệ thống được thiết kế để cung cấp khả năng mở rộng theo chiều dọc (tăng sức mạnh xử lý) và chiều ngang (tăng số lượng điểm triển khai hệ thống), áp dụng các cấu trúc cho phép mở rộng an toàn và ổn định, đảm bảo công năng để đối phó với số lượng người dùng tăng lên.  Hệ thống cung cấp được các thông số về quá trình hoạt động của các thành phần, cũng như sử dụng các công cụ trực quan để người quản lý dễ quan sát, nhận biết các điểm tắc nghẽn (nút cổ chai) và nâng cấp nếu cần thiết 3.2.2.5.

      Yêu cầu cấu trúc hệ thống 1. Phần cứng

       Đảm bảo các yêu cầu bảo mật ứng dụng đối với các thông tin người dùng, đặc biệt là thông tin cá nhân cũng như nội dung tin nhắn. Mỗi thành phần trong hệ thống cần cung cấp khả năng tạo replica (tạo bản sao hoạt động song song) để giải quyết các vấn đề tắc nghẽn cụ thể về sau.

      Thiết kế kiến trúc hệ thống

        Việc FastAPI sử dụng chuẩn ASGI (Asynchronous Server Gateway Interface) hỗ trợ code bất đồng bộ cho server interface so với các Python framework khác chỉ sử dụng WSGI, cùng với việc cung cấp sẵn các biện pháp kiểm tra dữ liệu đầu vào qua Pydantic đã giúp FastAPI có hiệu năng vận hành nhanh hơn đáng kể. Dữ liệu được phân bổ vào các node dựa trên Partition Key, với các phần tử dữ liệu có cùng Partition Key sẽ nằm ở chung node (các tin nhắn của cùng một nhóm, các nhóm đã tham gia của cùng một người, …), từ đó tăng tốc việc truy vấn dữ liệu. Cùng với đó, việc thiết kế theo dạng node giúp cho ScyllaDB có các tính năng bảo toàn dữ liệu như Replication Factor (RF - một phần tử dữ liệu nằm ở nhiều node) và Consistency Level (CL - số lượng phần tử dữ liệu tối thiểu để xác nhận dữ liệu tồn tại) rất mạnh mẽ.

        Hệ thống sử dụng các thư viện ORM (Object Relational Mapping) tuỳ vào framework thực hiện để đảm bảo xác thực các thuộc tính dữ liệu, cùng với đó là áp dụng transaction cho commit và rollback nếu có vấn đề xảy ra. Đối với dữ liệu người dùng được lưu trên PostgreSQL, dữ liệu của những người dùng sử dụng liên tục sẽ được lưu bản sao trên Redis để truy vấn về sau, từ đó giảm được tải trọng đến database chính, cùng với đó là tăng tốc các công việc như xác thực token đăng nhập. Đối với ScyllaDB, database cluster được thiết kế với 3 node kết nối với nhau, cùng với Replication Factor 2 (mỗi phần tử dữ liệu có bản sao trong 2 node) và Consistency Level 1 (truy vấn ít nhất 1 phần tử để xác nhận tồn tại) nhằm tăng tốc độ truy vấn và Availability của các node.

        Hình 3.1. Software Architecture Diagram tổng quan
        Hình 3.1. Software Architecture Diagram tổng quan

        Thiết kế chức năng

          Người dùng chọn loại hình đăng nhập bằng tài khoản tự cung cấp (chuyển đến bước 3a) hoặc bằng tài khoản bên thứ ba (chuyển đến bước 3b). Người dùng chọn loại hình đăng nhập bằng tài khoản tự cung cấp (chuyển đến bước 3a) hoặc bằng tài khoản bên thứ ba (chuyển đến bước 3b). Người dùng nhập các thông tin cá nhân (tên, mã số định danh và giới thiệu) muốn cập nhật và nhấn nút xác nhận (chuyển đến bước 4).

          Hệ thống tạo nhóm mới với các thông tin người dùng cung cấp, gán người dùng làm Chủ nhóm (Creator) và thông báo thành công cho người dùng. Pre-conditions - Người dùng đăng nhập hợp lệ và token đăng nhập còn thời gian hiệu lực - Người dùng là thành viên của nhóm. - Người dùng đăng nhập hợp lệ và token đăng nhập còn thời gian hiệu lực - Người dùng là chủ nhóm hoặc là admin của nhóm đó.

          - Đăng nhập: Xác nhận danh tính/tài khoản người dùng đã đăng ký trên ứng dụng hay chưa thông qua việc gọi API xuống backend để lấy token. - Đăng ký: Tiếp nhận yêu cầu đăng ký tài khoản của người dùng thực hiện gọi API để xác nhận không bị trùng tài khoản đã có trước đó và thực hiện lấy token khi đăng ký thành công.

          Bảng 3.1. Entity Account
          Bảng 3.1. Entity Account

          Thiết kế phi chức năng

            Hệ thống sử dụng SSL/TLS encrpytion cho cả HTTP và WS endpoint với certificate hợp lệ thông qua thiết lập NGINX nhằm mã hoá đường truyền dữ liệu và ngăn chặn các cách tấn công nghe lén thông tin như MITM (Man In The Middle) và packet sniffing. Các service của hệ thống được vận hành trong container và chỉ mở các cổng cần thiết, cùng với đó là không mở cổng cho public network, chỉ vận hành trong localhost và proxy ra ngoài bởi NGINX. Docker là một nền tảng cho phép tạo các môi trường độc lập và tách biệt để khởi chạy và phát triển các service được gọi là container, cũng như hỗ trợ vận hành các container đó trên hệ thống máy tính.

            Prometheus và Grafana là một bộ hệ thống phổ biến thường được sử dụng chung với nhau nhằm thu thập thông số của các service và trực quan hoá thông số đú thành cỏc dạng biểu đồ để phục vụ việc theo dừi và phõn tớch. Prometheus cung cấp cỏc tớnh năng thiết lập loại thông số cũng như thu thập thông số theo thời gian (time- series) từ các service; cùng với đó còn cung cấp thêm một ngôn ngữ truy vấn PromQL rất mạnh mẽ để thực hiện trên các dữ liệu đã thu thập được. K6 hỗ trợ thực hiện đa dạng các phương pháp kiểm thử trên các service bao gồm Load Testing, End-to-end Web Testing (kiểm thử tương tác trực tiếp), Infastructure Testing (Kiểm thử hạ tầng), ….

            Hình 3.18. Ví dụ một file môi trường của hệ thống 3.5.1.4. Bảo mật hệ thống
            Hình 3.18. Ví dụ một file môi trường của hệ thống 3.5.1.4. Bảo mật hệ thống

            Thông số kiểm thử thu được

            - Lý do testcase dừng lại: vượt quy định 95% số lượng HTTP request hoàn thành dưới 500ms.  Áp dụng các kiến thức cũ về việc xây dựng một hệ thống backend và frontend sử dụng các framework và thư viện có sẵn.  Tìm hiểu các khía cạnh mới của việc thiết kế một hệ thống như kết nối WebSocket, vận hành, theo dừi, kiểm thử hệ thống; cũng như thực hiện cỏc biện phỏp để tối ưu hệ thống dựa vào yêu cầu.

            Thất bại của nhóm trong việc đề ra và đạt được thông số cũng là một bài học để nhóm rút kinh nghiệm, từ đó xác định các thông số hợp lý cũng như điều chỉnh mức độ của hệ thống cho phù hợp.  Tiếp tục phát triển các tính năng mới cho hệ thống, biến đổi hệ thống để phục vụ cho một nhóm người dùng cụ thể.  Nâng cấp các công cụ kiểm thử để hỗ trợ thêm tính năng ghi logging, thu thập lỗi.

            Hình 4.8. Kết quả Breakpoint Test của testcase http-read.js
            Hình 4.8. Kết quả Breakpoint Test của testcase http-read.js