Giới thiệu dự án

Nhu cầu trao đổi thông tin trực tuyến thời gian thực (real-time communication) đã trở thành hạ tầng thiết yếu trong kỷ nguyên số. Theo báo cáo từ Grand View Research, thị trường truyền thông hợp nhất (Unified Communications) toàn cầu đạt quy mô 120,7 tỷ USD vào năm 2023 với tốc độ tăng trưởng kép hàng năm (CAGR) 17,4%. Tại Việt Nam, xu hướng chuyển đổi số và làm việc lai (hybrid work) hậu đại dịch COVID-19 thúc đẩy hơn 80 triệu người dùng thường xuyên tiếp cận các nền tảng hội thoại và họp trực tuyến.

Tuy nhiên, việc triển khai một hệ thống giao tiếp thời gian thực độc lập thường đối mặt với các rào cản kỹ thuật nghiêm trọng:

  • Độ trễ mạng (latency) cao khi sử dụng cơ chế kéo dữ liệu truyền thống (HTTP Polling/Long Polling).
  • Tải máy chủ (server load) tăng vọt khi duy trì hàng nghìn kết nối đồng thời.
  • Chi phí hạ tầng khổng lồ nếu tự xây dựng máy chủ truyền phát video (WebRTC Media Server/SFU/MCU).
  • Nguy cơ rò rỉ dữ liệu phiên làm việc và thông tin định danh cá nhân.

Đồ án "Xây Dựng Ứng Dụng Chat RealTime Video Call" (PNChat) do sinh viên Đặng Anh Phú thực hiện dưới sự hướng dẫn của TS. Phạm Thị Thu Thúy tại Khoa Công nghệ Thông tin – Trường Đại học Nha Trang giải quyết triệt để các bài toán trên thông qua các mục tiêu kỹ thuật cụ thể:

  1. Thiết kế kiến trúc Client-Server tối ưu: Tách biệt hoàn toàn tầng giao diện (Front-end SPA) và tầng nghiệp vụ (Back-end Web API).
  2. Triển khai cơ chế giao tiếp Full-Duplex: Ứng dụng thư viện ASP.NET Core SignalR nhằm đồng bộ dữ liệu hai chiều tức thì với độ trễ dưới 50ms.
  3. Tích hợp giải pháp Video Calling đa nền tảng: Kết nối hạ tầng WebRTC thông qua Daily.co API giúp truyền tải âm thanh/hình ảnh chuẩn HD mà không gây quá tải cho máy chủ nghiệp vụ.
  4. Chuẩn hóa quy trình lưu trữ và xác thực: Ứng dụng chuẩn JSON Web Token (JWT) cho luồng Authentication/Authorization không trạng thái (stateless) và lưu trữ tệp đính kèm trên đám mây Azure Blob Storage.

Phạm vi đề tài tập trung vào việc xây dựng nền tảng web ứng dụng hoàn chỉnh cho môi trường doanh nghiệp/giáo dục, bao gồm hội thoại 1:1, hội thoại nhóm, gửi tệp/hình ảnh và phòng họp video chất lượng cao. Giới hạn hiện tại của hệ thống là chưa hoàn thiện hệ thống thông báo đẩy (push notification) nền khi người dùng ngắt kết nối trình duyệt hoàn toàn.


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khảo sát các hệ thống truyền thông phổ biến trên thị trường cho thấy sự phân hóa rõ rệt về kiến trúc và chi phí triển khai:

Tiêu chí Zalo / Messenger Tự dựng WebRTC (Kurento/Janus) Hệ thống đề xuất (SignalR + Daily API)
Tính đóng gói & Tùy biến Thấp (nền tảng đóng, phụ thuộc bên thứ 3) Cao (toàn quyền kiểm soát mã nguồn) Rất cao (dễ tích hợp vào cổng nội bộ)
Độ trễ truyền tin (Chat) < 100ms (Hạ tầng máy chủ lớn) Tùy thuộc cấu hình WebSocket < 50ms (SignalR Hub tối ưu giao thức)
Chi phí máy chủ Media Miễn phí/Trả phí theo tài khoản Rất cao (yêu cầu CPU/Băng thông lớn) Tối ưu (Pay-as-you-go qua API Gateway)
Độ phức tạp bảo trì Không kiểm soát được hạ tầng Rất cao (quản trị STUN/TURN/ICE) Thấp (tập trung phát triển core nghiệp vụ)

Phân loại yêu cầu hệ thống theo mô hình MoSCoW

  • Must have (Bắt buộc): Đăng ký/đăng nhập xác thực JWT, nhắn tin tức thời 1:1 và nhóm qua SignalR, gửi hình ảnh/tệp tin qua Azure Storage, khởi tạo và kết thúc cuộc gọi video phòng Daily.co, quản lý danh bạ liên hệ.
  • Should have (Nên có): Hiển thị trạng thái hoạt động (online/offline), lịch sử cuộc gọi (gọi nhỡ, gọi đến, gọi đi), xem trước hình ảnh trực tiếp trong luồng chat.
  • Could have (Có thể có): Biểu tượng cảm xúc (Emoji/Reactions), tải tệp tin tốc độ cao.
  • Won't have (Chưa thực hiện ở phiên bản này): Mã hóa đầu cuối (E2EE) cho tin nhắn văn bản, gọi thoại nhóm trên 50 người cùng lúc.

Thiết kế hệ thống

Kiến trúc tổng thể của hệ thống áp dụng mô hình phân lớp hiện đại (Decoupled Client-Server Architecture):

+-------------------------------------------------------------+
|               Client Layer (Angular 15 SPA)                |
|  - Components: Auth, ChatDetail, VideoCall, Contact, Group  |
|  - Services: SignalR Client, AuthService, DailyMediaService |
+------------------------------+------------------------------+
                               | HTTPS / WSS (WebSockets)
+------------------------------v------------------------------+
|              Server Layer (.NET 7 Web API Core)             |
|  - Controllers: AuthController, UserController, GroupCtrl    |
|  - SignalR Hub: ChatHub (Connection Manager, Group Dispatch)|
|  - Middleware: JWT Bearer Authentication, Error Handling    |
+---------------+------------------------------+--------------+
                |                              |
+---------------v-------------+  +-------------v--------------+
| Database (SQL Server 2022)  |  | Cloud Services             |
| - Users, Messages, Contacts |  | - Azure Blob Storage       |
| - Groups, GroupUsers, Calls |  | - Daily.co Video Call API  |
+-----------------------------+  +----------------------------+

Công nghệ và phiên bản sử dụng

  • Back-end: ASP.NET Core Web API (.NET 7.0), C# 11, Entity Framework Core 7.0, SignalR Core.
  • Front-end: Angular 15.2.0, TypeScript 4.9, RxJS 7.8, Bootstrap 5.
  • Cloud & Third-party Services: Azure Blob Storage SDK, Daily.co REST API / JavaScript SDK (@daily-co/daily-js), SQL Server 2022.

Thiết kế cơ sở dữ liệu quan hệ (Relational Data Model)

Mô hình dữ liệu logic được chuẩn hóa bậc 3 (3NF) với 7 thực thể cốt lõi:

  1. User (Code [PK], UserName, PasswordHash, FullName, Dob, Phone, Email, Address, Avatar, Gender, LastLogin, CurrentSession)
  2. Contact (Id [PK], UserCode [FK], ContactCode [FK], Created)
  3. Group (Code [PK], Type, Avatar, Name, Created, CreatedBy, LastActive)
  4. GroupUser (Id [PK], GroupCode [FK], UserCode [FK])
  5. Message (Id [PK], Type, GroupCode [FK], Content, Path, Created, CreatedBy [FK])
  6. GroupCall (Code [PK], Type, Avatar, Name, Created, CreatedBy, LastActive)
  7. Call (Id [PK], GroupCallCode [FK], UserCode [FK], Url, Status, Created)

Thiết kế bảo mật và định tuyến

  • Cơ chế xác thực JWT: Khi đăng nhập thành công, Server phát hành mã token chứa Header (thuật toán HMAC-SHA256), Payload (Claims: UserId, UserName, Email, Role, ExpireTimestamp) và Signature. Mã token được truyền trong Header Authorization: Bearer <token> ở mỗi request và query string khi thiết lập kết nối WebSocket (access_token).
+--------+            +-------------------+            +-------------------+
| Client |            | .NET Core Web API |            | SQL Server / Auth |
+----+---+            +---------+---------+            +---------+---------+
     |                          |                                |
     |  1. POST /api/auth/login |                                |
     |------------------------->|  2. Validate Credentials       |
     |                          |------------------------------->|
     |                          |  3. Return User Data           |
     |                          |<-------------------------------|
     |  4. Generate JWT Token   |                                |
     |  5. Response { token }   |                                |
     |<-------------------------|                                |
     |                                                           |
     |  6. Connect WSS /chatHub?access_token=<JWT>               |
     |------------------------->|  7. Validate Token Claims      |
     |  8. Connection Accepted  |                                |
     |<-------------------------|                                |

Phương pháp luận phát triển (Methodology)

Dự án áp dụng phương pháp phát triển phần mềm linh hoạt (Agile Scrum rút gọn) trong khung thời gian 16 tuần:

  • Tuần 1 - 3 (Khảo sát & Đặc tả): Nghiên cứu giao thức WebSocket, SignalR, Daily API; thu thập yêu cầu và vẽ biểu đồ Use Case, Activity.
  • Tuần 4 - 7 (Phân tích & Thiết kế): Thiết kế biểu đồ Sequence, Class Diagram, mô hình RDM và wireframe giao diện.
  • Tuần 8 - 12 (Hiện thực hóa hệ thống): Lập trình Back-end API, tích hợp SignalR Hub, cấu hình kết nối Angular SPA và Azure Storage.
  • Tuần 13 - 14 (Tích hợp Video Call & Kiểm thử): Tích hợp Daily.co REST API tạo phòng họp động, viết kịch bản Unit Test và Integration Test.
  • Tuần 15 - 16 (Đánh giá & Hoàn thiện): Đánh giá hiệu năng, tinh chỉnh UI/UX, lập báo cáo tốt nghiệp.

Implementation và kết quả

Chi tiết giải pháp kỹ thuật và mã nguồn

1. Xử lý thời gian thực với SignalR Hub (Back-end C#)

Lớp ChatHub chịu trách nhiệm quản lý kết nối, định tuyến tin nhắn đến các nhóm tương ứng thông qua giao thức truyền dữ liệu hai chiều:

[Authorize]
public class ChatHub : Hub
{
    private readonly IMessageService _messageService;
    public ChatHub(IMessageService messageService) => _messageService = messageService;

    public async Task SendMessage(string groupCode, string content, string type)
    {
        var userCode = Context.UserIdentifier;
        var messageDto = await _messageService.SaveMessageAsync(userCode, groupCode, content, type);
        
        // Phát dữ liệu tới toàn bộ client trong nhóm trò chuyện
        await Clients.Group(groupCode).SendAsync("ReceiveMessage", messageDto);
    }

    public async Task JoinChatGroup(string groupCode)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, groupCode);
    }
}

2. Kết nối và đồng bộ SignalR tại Client (Angular TypeScript)

Service ChatService đóng gói logic kết nối và bắt sự kiện từ máy chủ:

@Injectable({ providedIn: 'root' })
export class ChatSignalRService {
  private hubConnection!: signalR.HubConnection;
  public message$ = new Subject<MessageModel>();

  public startConnection(token: string): void {
    this.hubConnection = new signalR.HubConnectionBuilder()
      .withUrl(`${environment.apiUrl}/chatHub`, {
        accessTokenFactory: () => token,
        transport: signalR.HttpTransportType.WebSockets
      })
      .withAutomaticReconnect([0, 2000, 5000, 10000])
      .build();

    this.hubConnection.start()
      .then(() => this.registerSignalREvents())
      .catch(err => console.error('SignalR Connection Error: ', err));
  }

  private registerSignalREvents(): void {
    this.hubConnection.on('ReceiveMessage', (data: MessageModel) => {
      this.message$.next(data);
    });
  }
}

3. Khởi tạo cuộc gọi Video Call động qua Daily API

Khi người dùng bấm gọi, Back-end gọi REST API sang Daily.co để tạo phòng (room) bảo mật với thời hạn xác định, sau đó cấp URL cho các client tham gia:

public async Task<string> CreateDailyVideoRoomAsync(string roomName)
{
    using var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = 
        new AuthenticationHeaderValue("Bearer", _configuration["DailyConfig:ApiKey"]);

    var payload = new {
        name = roomName,
        privacy = "public",
        properties = new {
            exp = DateTimeOffset.UtcNow.AddHours(2).ToUnixTimeSeconds(),
            enable_chat = false,
            enable_screenshare = true
        }
    };

    var response = await httpClient.PostAsJsonAsync("https://api.daily.co/v1/rooms", payload);
    response.EnsureSuccessStatusCode();
    var result = await response.Content.ReadFromJsonAsync<DailyRoomResponse>();
    return result.Url;
}

Kết quả kiểm thử và đánh giá hiệu năng

Hệ thống đã trải qua quá trình kiểm thử tự động và kiểm thử chấp nhận người dùng (UAT) với 45 kịch bản kiểm thử:

+--------------------------------------------------------------------+
|                      Test Execution Dashboard                      |
+------------------------------------+-------------------------------+
| Total Test Cases: 45               | Passed: 43 (95.5%)            |
| Unit Tests (xUnit): 25/25 Passed   | Integration Tests: 18/20 Pass |
| Code Coverage: 84.2%               | Critical Bugs: 0              |
+------------------------------------+-------------------------------+
Chỉ số hiệu năng (Metric) Kết quả đo đạc thực tế Chuẩn mục tiêu Đánh giá
Độ trễ tin nhắn (SignalR) 32ms - 48ms < 100ms Vượt chỉ tiêu
Thời gian thiết lập Video Call 1.1s - 1.4s < 2.5s Đạt xuất sắc
Thời gian tải trang ban đầu (SPA) 1.2s < 2.0s Tải nhanh
Băng thông trung bình (Video HD) 1.8 Mbps / user 1.5 - 2.5 Mbps Ổn định
Tải CPU máy chủ khi có 200 CCU 12.4% (4 Core vCPU) < 40% Tiết kiệm tài nguyên

Đổi mới và đóng góp

  1. Kiến trúc truyền thông thời gian thực không phụ thuộc vào hạ tầng phần cứng đắt đỏ: Bằng cách kết hợp linh hoạt giữa SignalR nội bộ cho tin nhắn văn bản và Daily.co Video Calling API cho media stream, hệ thống giảm tới 85% tải tính toán trên máy chủ ứng dụng so với mô hình tự dựng WebRTC Media Server.
  2. Cơ chế định tuyến thông minh theo nhóm (Hub Groups): Giảm thiểu tối đa lưu lượng mạng broadcast không cần thiết, giúp tiết kiệm 40% băng thông mạng máy chủ khi xử lý các cuộc hội thoại đồng thời.
  3. Độc lập nền tảng và dễ bảo trì: Phân tách rõ ràng giữa Core API (.NET 7) và Client (Angular 15) theo mô hình Micro-frontends/RESTful chuẩn hóa, cho phép thay thế giao diện Web bằng Mobile App (Flutter/React Native) mà không cần chỉnh sửa logic máy chủ.

Ứng dụng thực tế và triển khai

Yêu cầu cấu hình hệ thống triển khai

  • Máy chủ ứng dụng (Back-end Server):
    • OS: Ubuntu 22.04 LTS hoặc Windows Server 2022.
    • CPU: 2 vCPU trở lên; RAM: Tối thiểu 4GB.
    • Runtime: .NET Runtime 7.0+, Nginx/IIS làm Reverse Proxy hỗ trợ WebSocket Upgrade header.
  • Cơ sở dữ liệu: Microsoft SQL Server 2019/2022 Standard hoặc Azure SQL Database (Tối thiểu 10 DTUs).
  • Môi trường máy khách (Client Browser):
    • Google Chrome 90+, Mozilla Firefox 88+, Microsoft Edge 90+, Safari 14+.
    • Hỗ trợ chuẩn WebRTC và quyền truy cập Microphone/Camera.

Hướng dẫn triển khai nhanh (Deployment Guide)

# 1. Clone source code và cấu hình chuỗi kết nối cơ sở dữ liệu
git clone https://github.com/phudang/PNChat-Realtime.git
cd PNChat-Realtime/Backend
dotnet ef database update --context ApplicationDbContext

# 2. Publish Back-end API
dotnet publish -c Release -o /var/www/pnchat-api

# 3. Build Front-end Angular SPA
cd ../Frontend
npm install
ng build --configuration production --output-path=/var/www/pnchat-client

# 4. Cấu hình Nginx chuyển tiếp WebSocket cho SignalR
# Đảm bảo proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";

Hạn chế và hướng phát triển

  • Hạn chế kỹ thuật hiện tại:
    • Tính năng thông báo đẩy khi đóng hoàn toàn trình duyệt chưa tích hợp Web Push Notifications.
    • Chưa triển khai cơ chế end-to-end encryption (E2EE) cho tệp tin và tin nhắn văn bản nhạy cảm.
    • Video call phụ thuộc vào hạ tầng máy chủ của Daily.co, chưa có cơ chế fallback sang mạng P2P nội bộ khi mất kết nối quốc tế.
  • Hướng nâng cấp tương lai:
    • Ứng dụng mô hình AI xử lý ngôn ngữ tự nhiên (NLP) để dịch tin nhắn đa ngữ theo thời gian thực và tự động tóm tắt biên bản cuộc họp video.
    • Phát triển ứng dụng di động đa nền tảng bằng Flutter nhằm tận dụng phần cứng native.
    • Bổ sung bảng vẽ tương tác (Whiteboard) trực tuyến phục vụ giảng dạy từ xa.

Đối tượng hưởng lợi

  • Sinh viên & Học viên: Làm tài liệu tham khảo chuẩn mực về kiến trúc phân tầng, cách tích hợp SignalR thời gian thực và mô hình phân tích hướng đối tượng (OOAD) sử dụng biểu đồ UML chuẩn.
  • Lập trình viên (Developers): Nắm bắt mô hình kết hợp Angular 15 với ASP.NET Core 7 Web API, cấu hình WebSocket bảo mật bằng JWT Token và tích hợp Third-party API nhanh chóng.
  • Doanh nghiệp vừa và nhỏ: Sở hữu giải pháp hội thoại nội bộ chi phí thấp, triển khai nhanh, linh hoạt tùy biến và bảo vệ quyền riêng tư dữ liệu kinh doanh.
  • Nhà nghiên cứu: Nền tảng thực nghiệm để đánh giá hiệu suất mạng giữa các giao thức truyền tải tín hiệu thời gian thực (WebSockets vs WebTransport).

Câu hỏi thường gặp

1. Technical requirements để deploy hệ thống là gì?

Hệ thống yêu cầu máy chủ cài đặt .NET 7 Runtime, SQL Server 2019+, Nginx/IIS hỗ trợ WebSocket reverse proxy và tài khoản kích hoạt API key tại Daily.co cùng tài khoản lưu trữ Azure Blob Storage.

2. Khả năng mở rộng (Scalability) của hệ thống như thế nào?

Để mở rộng phục vụ hàng chục nghìn kết nối đồng thời, kiến trúc hỗ trợ cấu hình Redis Backplane cho SignalR, cho phép mở rộng máy chủ Back-end theo chiều ngang (Horizontal Scaling) mà không làm gián đoạn trạng thái phân phối tin nhắn giữa các máy chủ.

3. Hệ thống có thể tích hợp vào các nền tảng có sẵn không?

Hoàn toàn khả thi. Do Back-end được xây dựng theo chuẩn RESTful API kết hợp WebSocket độc lập, bất kỳ hệ sinh thái quản lý nào (như ERP, CRM, LMS) đều có thể nhúng giao diện chat hoặc gọi video thông qua REST endpoints và SDK client.

4. Chi phí vận hành và bảo trì ước tính bao nhiêu?

Với quy mô doanh nghiệp 500 người dùng thường xuyên, chi phí duy trì máy chủ Cloud VPS và cơ sở dữ liệu chỉ dao động từ 20 - 40 USD/tháng. Chi phí video call của Daily.co được tính theo phút sử dụng thực tế (miễn phí 10.000 phút/tháng đầu tiên).

5. Lợi tức đầu tư (ROI) và thời gian hoàn vốn?

So với việc mua bản quyền các phần mềm hội họp chuyên dụng (như Zoom, MS Teams) với giá 15 - 20 USD/người/tháng, việc tự vận hành hệ thống PNChat giúp doanh nghiệp tiết kiệm đến 75% chi phí liên lạc hàng năm, đạt điểm hòa vốn chỉ sau 3 - 6 tháng vận hành.


Kết luận

Đồ án tốt nghiệp "Xây Dựng Ứng Dụng Chat RealTime Video Call" của sinh viên Đặng Anh Phú đã giải quyết xuất sắc bài toán truyền thông thời gian thực đa phương tiện bằng sự kết hợp hài hòa giữa ASP.NET Core SignalR, Angular 15 và Daily API. Đề tài không chỉ hoàn thành trọn vẹn các yêu cầu học thuật khắt khe về phân tích thiết kế hệ thống thông tin mà còn mang lại một sản phẩm ứng dụng có giá trị thực tiễn cao, sẵn sàng phục vụ nhu cầu chuyển đổi số trong giáo dục và doanh nghiệp. Mã nguồn và tài liệu kỹ thuật của dự án là nguồn tham khảo hữu ích cho cộng đồng phát triển phần mềm ứng dụng tại Việt Nam.