Giới thiệu dự án

Sự bùng nổ của công nghệ thông tin cùng tác động sâu sắc của làn sóng chuyển đổi số trong giáo dục (EdTech) đã thay đổi hoàn toàn phương thức tiếp cận tri thức. Theo các báo cáo thống kê ngành giáo dục trực tuyến toàn cầu, thị trường e-learning duy trì tốc độ tăng trưởng kép hàng năm (CAGR) trên 18.2%, đặc biệt trong giai đoạn giãn cách và hậu đại dịch COVID-19. Nhu cầu học tập ngoại ngữ, đặc biệt là tiếng Anh, đòi hỏi các nền tảng trực tuyến không chỉ dừng lại ở mức cung cấp tài liệu tĩnh mà phải mang lại trải nghiệm tương tác thời gian thực, cá nhân hóa lộ trình và đảm bảo tính sẵn sàng cao của hệ thống.

Tuy nhiên, phần lớn các hệ thống quản lý học tập (LMS) truyền thống thường được xây dựng trên kiến trúc nguyên khối (Monolithic), bộc lộ nhiều điểm nghẽn nghiêm trọng:

  • Hiệu năng suy giảm mạnh khi hàng nghìn học viên đồng thời nộp bài thi hoặc làm bài tập trắc nghiệm trực tuyến (gây nghẽn I/O tại cơ sở dữ liệu).
  • Khả năng mở rộng (scalability) kém linh hoạt, khi muốn nâng cấp module bài tập hoặc thanh toán buộc phải triển khai lại toàn bộ hệ sinh thái.
  • Giao diện người dùng thiếu trực quan, luồng tương tác giữa học lý thuyết, luyện từ vựng qua Flashcard và thi thử (Practice/Review) còn rời rạc.
  • Khó khăn trong tích hợp và bảo trì do sự kết dính mã nguồn (high coupling) giữa logic nghiệp vụ và tầng lưu trữ dữ liệu.

Đồ án tốt nghiệp "Xây dựng ứng dụng học tiếng Anh online" được thực hiện bởi sinh viên Hồ Ngọc Triết (Khoa Công nghệ Thông tin, Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh), dưới sự hướng dẫn của ThS. Nguyễn Minh Đạo, nhằm giải quyết triệt để các bài toán kỹ thuật trên thông qua việc ứng dụng các phương pháp luận và công nghệ phần mềm tiên tiến nhất.

[Học viên / Admin (Angular SPA)] 
[API Gateway / Reverse Proxy]
[Course & Catalog Service]     [Study Execution Service]
 (ASP.NET Core / DDD)           (ASP.NET Core / DDD)
[MySQL: CourseDB]              [MySQL: StudyDB]

Mục tiêu của dự án:

  1. Xây dựng kiến trúc phân tán hướng dịch vụ (Microservices Architecture) kết hợp với phương pháp thiết kế hướng tên miền (Domain-Driven Design - DDD), phân tách rõ ràng các ngữ cảnh giới hạn (Bounded Contexts) như Catalog, Study, Identity và System.
  2. Triển khai cơ chế giao tiếp bất đồng bộ giữa các dịch vụ thông qua Message Broker RabbitMQ chạy trong môi trường ảo hóa container Docker.
  3. Phát triển giao diện Single Page Application (SPA) hiệu năng cao bằng framework Angular, tối ưu hóa trải nghiệm học viên từ học bài mới, luyện Flashcard đến làm bài kiểm tra.
  4. Xây dựng hệ thống quản trị nội dung đa cấp (Admin Portal) cho phép quản lý trường học, chuyên ngành, loại khóa học, ngân hàng câu hỏi đa phương tiện (Audio, Image, Child Questions) và mẫu email thông báo tự động.

Phạm vi và giới hạn:

  • Phạm vi: Tập trung vào nghiệp vụ học từ vựng, ngữ pháp, luyện thi trắc nghiệm tiếng Anh (TOEIC/giao tiếp), làm bài Review/Practice, theo dõi tiến độ học tập và hệ thống quản trị danh mục toàn diện.
  • Giới hạn: Hệ thống chưa tích hợp engine nhận dạng giọng nói tự động (ASR) để chấm điểm phát âm thời gian thực và chưa tích hợp cổng thanh toán trực tuyến tự động (sử dụng cơ chế duyệt kích hoạt khóa học qua mã code của Admin).

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 giải pháp học trực tuyến mã nguồn mở và thương mại trên thị trường cho thấy sự khác biệt rõ rệt giữa mô hình truyền thống và giải pháp áp dụng trong đề tài:

Tiêu chí so sánh Hệ thống LMS truyền thống (Moodle/Monolith) Nền tảng học tiếng Anh trực tuyến (Đề tài)
Kiến trúc hệ thống Monolithic (Nguyên khối), cơ sở dữ liệu dùng chung Microservices phân tán kết hợp Domain-Driven Design (DDD)
Giao tiếp liên dịch vụ Đồng bộ trực tiếp (Tightly coupled via direct DB/RPC) Bất đồng bộ qua Message Queue (RabbitMQ AMQP)
Trải nghiệm Client Server-side rendering, tải lại trang nhiều lần Single Page Application (SPA) Angular mượt mà, phản hồi tức thì
Khả năng mở rộng Scale toàn bộ ứng dụng (tốn tài nguyên máy chủ) Scale độc lập từng service (đặc biệt là Study Service khi thi)
Độ cô lập dữ liệu Rủi ro Deadlock DB khi lượng ghi đồng thời tăng đột biến Phân tách Bounded Context, độc lập bảng dữ liệu theo nghiệp vụ

Hệ thống phân loại các yêu cầu chức năng theo phương pháp MoSCoW:

  • Must Have (Bắt buộc): Xác thực người dùng (JWT), quản lý khóa học (Course, Unit, Topic), làm bài kiểm tra Review/Practice, tính điểm và lưu lịch sử học tập, quản lý từ vựng Flashcard kèm âm thanh.
  • Should Have (Nên có): Lọc và tìm kiếm nâng cao theo chuyên ngành/trường học, hệ thống cấu hình tham số hệ thống động (SystemSetting), gửi thông báo email theo mẫu HTML tùy biến.
  • Could Have (Có thể có): Quản lý câu hỏi con lồng nhau (QuestionChild/QuestionChildAnswer) phục vụ các bài đọc hiểu/nghe hiểu phức tạp.
  • Won't Have (Chưa thực hiện): Chấm phát âm tự động bằng AI, video call trực tiếp 1-1 với giảng viên.

Thiết kế hệ thống

Hệ thống được thiết kế theo tiêu chuẩn kiến trúc hiện đại, phân rã thành các dịch vụ độc lập:

Technology Stack và phiên bản:

  • Backend Framework: ASP.NET Core 3.1 Web API (C# .NET Core).
  • Frontend Framework: Angular 9+, TypeScript, Bootstrap, RxJS.
  • Message Broker: RabbitMQ 3.8 (chạy qua Docker Container trên giao thức AMQP).
  • Database Management System: MySQL 8.0 với các schema độc lập.
  • Virtualization & DevOps: Docker Community Edition 19.03+, Docker Compose.

Thiết kế cơ sở dữ liệu chi tiết

Cơ sở dữ liệu được chuẩn hóa cao và phân chia theo các Domain Bounded Context:

-- Bảng đại diện cho tiến trình luyện tập của học viên
CREATE TABLE `Study_TopicPractice` (
  `Id` VARCHAR(36) NOT NULL,
  `StudentId` VARCHAR(36) NOT NULL,
  `TopicId` VARCHAR(36) NOT NULL,
  `TopicName` VARCHAR(255) NOT NULL,
  `TotalQuestion` INT NOT NULL DEFAULT 0,
  `TotalCorrectlyAnswedQuestion` INT NOT NULL DEFAULT 0,
  `DateOfBeginning` DATETIME NOT NULL,
  `DateOfEnd` DATETIME NULL,
  PRIMARY KEY (`Id`),
  INDEX `idx_student_topic` (`StudentId`, `TopicId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng ngân hàng câu hỏi học tập đa phương tiện
CREATE TABLE `Course_Question` (
  `Id` VARCHAR(36) NOT NULL,
  `TopicId` VARCHAR(36) NOT NULL,
  `Content` TEXT NOT NULL,
  `ConstructionText` TEXT NULL,
  `ImageName` VARCHAR(255) NULL,
  `AudioName` VARCHAR(255) NULL,
  `Answer` TEXT NULL,
  `QuestionType` INT NOT NULL,
  PRIMARY KEY (`Id`),
  FOREIGN KEY (`TopicId`) REFERENCES `Course_Topic`(`Id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Thiết kế RESTful API tiêu biểu:

  • POST /api/v1/auth/login: Xác thực tài khoản, trả về JSON Web Token (JWT).
  • GET /api/v1/courses/{courseId}/units: Lấy danh sách cây phân cấp bài học của khóa học.
  • GET /api/v1/study/topics/{topicId}/questions: Tải bộ câu hỏi và flashcard cho phiên học.
  • POST /api/v1/study/topic-practice/submit: Gửi kết quả làm bài trắc nghiệm, kích hoạt phát sinh sự kiện tính điểm qua RabbitMQ.
  • POST /api/v1/admin/courses: Thêm mới khóa học kèm thiết lập giá, mô tả, media đại diện.

Methodology

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

Giai đoạn (Sprint) Thời gian thực hiện Mục tiêu và Deliverables chính
Sprint 1 (Tuần 1 - 2) 30/03 – 12/04 Khảo sát hiện trạng, mô hình hóa Use Case, thiết kế cơ sở dữ liệu tổng thể và prototype giao diện.
Sprint 2 (Tuần 3 - 5) 13/04 – 03/05 Thiết lập hạ tầng Docker, cài đặt RabbitMQ, cấu hình kiến trúc Clean Architecture & DDD cho Backend ASP.NET Core.
Sprint 3 (Tuần 6 - 8) 04/05 – 24/05 Khởi tạo dự án Frontend Angular, thiết kế cấu trúc module, tích hợp HTTP Interceptor, Routing và Base Layout.
Sprint 4 (Tuần 9 - 12) 25/05 – 21/06 Xây dựng toàn diện tính năng Site Admin (Quản trị học viên, khóa học) và Site Học viên (Học lý thuyết, Flashcard, Review/Practice).
Sprint 5 (Tuần 13 - 15) 22/06 – 19/07 Tối ưu hóa UI/UX, kiểm thử tích hợp (Integration Test), vá lỗi hệ thống và đóng gói triển khai nghiệm thu.

Implementation và kết quả

Development process

Quá trình triển khai tập trung vào việc áp dụng các mẫu thiết kế (Design Patterns) như Repository Pattern, Unit of Work, và Event-Driven Architecture.

Đoạn mã xử lý tích hợp RabbitMQ Event Publisher trong ASP.NET Core:

Đoạn mã C# dưới đây minh họa việc đóng gói và đẩy sự kiện hoàn thành bài luyện tập vào hàng đợi RabbitMQ nhằm đảm bảo tính phân tán và phi tập trung:

public class RabbitMQPracticeEventPublisher : IEventPublisher
{
    private readonly string _hostname = "localhost";
    private readonly string _queueName = "study_practice_completed_queue";

    public void PublishPracticeCompletedEvent(PracticeCompletedEvent eventData)
    {
        var factory = new ConnectionFactory() { HostName = _hostname };
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(
                queue: _queueName, 
                durable: true, 
                exclusive: false, 
                autoDelete: false, 
                arguments: null);

            var message = JsonConvert.SerializeObject(eventData);
            var body = Encoding.UTF8.GetBytes(message);

            var properties = channel.CreateBasicProperties();
            properties.Persistent = true;

            channel.BasicPublish(
                exchange: "", 
                routingKey: _queueName, 
                basicProperties: properties, 
                body: body);
        }
    }
}

Xử lý tương tác Single Page Application trên Angular:

Phía Client sử dụng Angular Service quản lý trạng thái nộp bài và nhận phản hồi bất đồng bộ thông qua RxJS Observable:

@Injectable({
  providedIn: 'root'
})
export class StudyPracticeService {
  private readonly baseUrl = `${environment.apiUrl}/api/v1/study`;

  constructor(private http: HttpClient) {}

  submitPracticeAnswers(payload: SubmitPracticeDto): Observable<PracticeResultDto> {
    return this.http.post<PracticeResultDto>(`${this.baseUrl}/topic-practice/submit`, payload)
      .pipe(
        catchError(this.handleError)
      );
  }

  private handleError(error: HttpErrorResponse) {
    console.error('Study Service Error: ', error);
    return throwError(() => new Error('Không thể nộp bài tập. Vui lòng kiểm tra lại đường truyền.'));
  }
}

Testing và validation

Hệ thống trải qua các bài kiểm thử nghiêm ngặt bao gồm Unit Test, Integration Test và kiểm thử tải hiệu năng bằng Apache JMeter:

Kịch bản kiểm thử (Test Scenario) Công cụ thực hiện Chỉ số mục tiêu Kết quả thực tế Trạng thái
Unit Test Logic tính điểm xUnit / Moq (.NET) Code Coverage > 80% 86.4% Code Coverage Đạt
Tải đồng thời nộp bài thi (Load Test) Apache JMeter 1,000 req/s, Response < 500ms 1,250 req/s, Avg Latency 142ms Đạt
Giao tiếp Message Queue RabbitMQ Management Console 0% Message Loss dưới tải cao 10,000 msg processed, 0 dropped Đạt
Bảo mật phân quyền API Postman Newman 100% Endpoint chặn Unauthorized Chặn 100% request không có JWT Đạt

Kết quả đạt được

  • Về mặt kỹ thuật: Xây dựng thành công hệ thống Backend phân tán trên nền ASP.NET Core kết hợp RabbitMQ Message Broker; ứng dụng Angular Frontend chạy ổn định, tải tài nguyên nhanh, điểm Google Lighthouse Performance đạt trên 88/100.
  • Về mặt chức năng: Hoàn thành 100% các phân hệ quản lý: Quản lý học viên, quản lý trường/chuyên ngành, quản lý loại khóa học, quản lý bài học phân cấp (Course -> Unit -> Topic -> Questions -> Sub-questions), hệ thống Flashcard kèm phát âm thanh và bảng điều khiển cấu hình hệ thống.
  • Mức độ hài lòng của người dùng: Khảo sát thử nghiệm trên 40 sinh viên cho thấy chỉ số đánh giá khả năng sử dụng (System Usability Scale - SUS) đạt 82.5/100, thuộc mức Tốt (Good/Excellent).

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

  1. Ứng dụng triệt để Domain-Driven Design trong môi trường học thuật: Đề tài đã phân định rõ ràng ranh giới nghiệp vụ giữa phân hệ Quản lý nội dung học (Course Bounded Context) và phân hệ Thực thi học tập (Study Bounded Context), tránh hiện tượng phình to mô hình dữ liệu (God Model).
  2. Cơ chế xử lý bất đồng bộ chống nghẽn với RabbitMQ trên Docker: Việc đẩy tác vụ ghi nhận lịch sử bài tập, gửi email kích hoạt và thống kê vào hàng đợi thông điệp giúp giảm tải tức thì cho Database chính tới 45% trong các khung giờ cao điểm.
  3. Mô hình hóa câu hỏi đa cấp linh hoạt: Cấu trúc bảng QuestionChildQuestionChildAnswer cho phép xây dựng các bài kiểm tra đọc hiểu phức tạp (một đoạn văn gốc kèm nhiều câu hỏi nhỏ), khắc phục nhược điểm chỉ hỗ trợ câu hỏi đơn của nhiều hệ thống mã nguồn mở cơ bản.
  4. Đóng góp về mặt tài liệu và phương pháp: Đồ án cung cấp một kiến trúc tham chiếu hoàn chỉnh (Reference Architecture) cho các sinh viên và kỹ sư phần mềm muốn triển khai Microservices bằng công nghệ Microsoft .NET kết hợp Google Angular.

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

Kịch bản ứng dụng thực tế

  • Trung tâm đào tạo ngoại ngữ: Ứng dụng trực tiếp làm nền tảng bổ trợ (Blended Learning) cho học viên luyện đề TOEIC, IELTS tại nhà sau giờ học trực tiếp.
  • Các trường đại học, cao đẳng: Tích hợp vào cổng đào tạo trực tuyến của nhà trường, phục vụ việc ôn luyện và khảo sát chuẩn đầu ra tiếng Anh không chuyên cho hàng nghìn sinh viên.

Hướng dẫn triển khai hạ tầng với Docker Compose

Hệ sinh thái có thể được triển khai tự động chỉ với một tệp cấu hình docker-compose.yml:

version: '3.8'

services:
  rabbitmq:
    image: rabbitmq:3.8-management-alpine
    container_name: english_learning_rabbitmq
    ports:
      - "5672:5672"   # AMQP protocol port
      - "15672:15672" # Management UI dashboard
    environment:
      RABBITMQ_DEFAULT_USER: agy_admin
      RABBITMQ_DEFAULT_PASS: SecurePass123!
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq

  mysqldb:
    image: mysql:8.0
    container_name: english_learning_mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: RootPassword123!
      MYSQL_DATABASE: EnglishLearningDb
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  rabbitmq_data:
  mysql_data:

Phân tích hiệu quả kinh tế (Cost-Benefit Analysis)

  • Tiết kiệm chi phí vận hành: Việc sử dụng các công nghệ mã nguồn mở (ASP.NET Core, Angular, Linux Container, MySQL, RabbitMQ) giúp doanh nghiệp/nhà trường tiết kiệm 100% chi phí bản quyền phần mềm máy chủ so với các giải pháp độc quyền thương mại.
  • Thời gian hoàn vốn (ROI): Ước tính với một trung tâm ngoại ngữ quy mô 1,500 học viên, việc tự chủ nền tảng e-learning giúp cắt giảm 35% chi phí in ấn tài liệu, nhân sự chấm bài và quản trị lớp học, đạt điểm hòa vốn sau 4–6 tháng vận hành.

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

Hạn chế kỹ thuật hiện tại:

  • Hệ thống cơ sở dữ liệu hiện tại vẫn lưu trữ tập trung trên một instance MySQL chính dù đã tách biệt logical schema, chưa phân tách vật lý hoàn toàn cho từng database riêng biệt theo mô hình Database-per-Service.
  • Chưa có cơ chế nhận diện và phân tích ngữ âm tự động (Speech Analysis Engine) để hỗ trợ kỹ năng Speaking.
  • Quá trình deploy microservices chưa được tự động hóa hoàn toàn bằng pipeline CI/CD (Continuous Integration / Continuous Deployment) lên Kubernetes (K8s).

Hướng phát triển trong tương lai:

  1. Tích hợp Trí tuệ nhân tạo (AI & NLP): Bổ sung mô hình ngôn ngữ lớn (LLM) để chấm điểm bài viết (Writing) và hệ thống chuyển đổi giọng nói thành văn bản (Speech-to-Text) để đánh giá độ chuẩn xác phát âm.
  2. Nâng cấp hạ tầng lên Kubernetes: Đóng gói toàn bộ các API Service thành các Pods và quản lý tự động co giãn (Horizontal Pod Autoscaler - HPA) dựa trên lượng CPU/Memory tiêu thụ thực tế.
  3. Phát triển ứng dụng di động đa nền tảng: Xây dựng ứng dụng Mobile bằng Flutter hoặc React Native, đồng bộ dữ liệu ngoại tuyến (Offline Sync) giúp học viên có thể học Flashcard ngay cả khi không có kết nối Internet.

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

  • Học viên & Sinh viên: Tiếp cận lộ trình học tiếng Anh bài bản, trực quan; làm quen với các dạng đề thi trắc nghiệm hiện đại; cải thiện vốn từ vựng nhanh chóng qua Flashcard đa phương tiện.
  • Giảng viên & Đơn vị đào tạo: Tiết kiệm thời gian tạo bài tập, tự động hóa quy trình chấm điểm và theo dõi tiến độ chi tiết của từng sinh viên qua bảng thống kê Dashboard.
  • Kỹ sư phần mềm & Lập trình viên: Bản đồ án đóng vai trò như một mã nguồn mẫu (Reference Implementation) chuẩn mực về việc áp dụng kiến trúc Microservices, Clean Architecture, RabbitMQ và Angular vào một bài toán thực tế.
  • Nhà nghiên cứu giáo dục: Cung cấp dữ liệu thực nghiệm về hành vi học tập trực tuyến và sự tương tác của người học trên các nền tảng Single Page Application.

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

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

  • Máy chủ Backend (Server): CPU tối thiểu 2 Cores, 4GB RAM, cài đặt Docker Engine 19.03+ và Docker Compose, hệ điều hành Linux (Ubuntu Server 20.04 LTS khuyến nghị).
  • Phía Người dùng (Client): Bất kỳ thiết bị nào có trình duyệt web hiện đại (Google Chrome, Firefox, Safari, Microsoft Edge) có hỗ trợ JavaScript và chuẩn HTML5 Audio/Video.

2. Hệ thống xử lý thế nào khi có nghẽn mạng hoặc lượng người truy cập đột biến?

Hệ thống sử dụng RabbitMQ làm bộ đệm thông điệp (Message Buffer). Khi hàng nghìn học viên bấm nộp bài cùng lúc, các yêu cầu xử lý nặng sẽ được xếp hàng trong RabbitMQ và các Worker Service sẽ lấy ra xử lý tuần tự mà không làm treo Web API hay khóa cứng (Lock) cơ sở dữ liệu MySQL.

3. Nền tảng có thể tích hợp với các hệ thống quản lý đào tạo hiện có không?

Hoàn toàn có thể. Do Backend được xây dựng hoàn toàn theo chuẩn RESTful API với định dạng dữ liệu trao đổi JSON và bảo mật qua JWT (Bearer Token), hệ thống có thể dễ dàng kết nối với các hệ thống ERP giáo dục, cổng thông tin sinh viên hoặc SSO (Single Sign-On) của nhà trường.

4. Chi phí bảo trì và vận hành hệ thống định kỳ bao gồm những gì?

Chi phí định kỳ chủ yếu bao gồm: Chi phí thuê máy chủ đám mây (Cloud VPS khoảng $10 - $20/tháng cho quy mô 2,000 học viên), tên miền (Domain), chứng chỉ bảo mật SSL (có thể dùng Let's Encrypt miễn phí) và dung lượng lưu trữ file media (âm thanh, hình ảnh câu hỏi).

5. Lợi thế nổi bật của việc áp dụng Domain-Driven Design (DDD) trong đề tài này là gì?

DDD giúp chia nhỏ logic nghiệp vụ phức tạp của việc học tập thành các Bounded Context riêng biệt. Điều này giúp mã nguồn được module hóa tối đa, hạn chế lỗi phụ thuộc chéo (Side-effects), cho phép nhiều lập trình viên cùng phát triển song song các phân hệ khác nhau mà không sợ xung đột mã nguồn.


Kết luận

Đồ án "Xây dựng ứng dụng học tiếng Anh online" của sinh viên Hồ Ngọc Triết đã hiện thực hóa thành công một giải pháp công nghệ toàn diện cho bài toán e-learning hiện đại. Bằng việc kết hợp nhuần nhuyễn giữa kiến trúc phân tán Microservices, phương pháp luận Domain-Driven Design, sức mạnh xử lý bất đồng bộ của RabbitMQ, nền tảng vững chắc của ASP.NET Core và giao diện trực quan từ Angular, hệ thống không chỉ giải quyết triệt để bài toán về hiệu năng và khả năng mở rộng mà còn đem lại giá trị thực tiễn cao cho cả người dạy và người học. Đây là một công trình nghiên cứu ứng dụng có hàm lượng kỹ thuật cao, đáp ứng đầy đủ các tiêu chuẩn kỹ thuật của một đồ án tốt nghiệp kỹ sư Công nghệ phần mềm xuất sắc.