Giới thiệu dự án

Ngành du lịch và dịch vụ tại Việt Nam đang có những bước tăng trưởng vượt bậc, đóng góp ngày càng lớn vào tỷ trọng GDP quốc gia và hướng tới mục tiêu chiếm 43% GDP vào năm 2025. Theo thống kê của Tổng cục Du lịch, lượng khách quốc tế đến Việt Nam năm 2018 đạt mốc 15,5 triệu lượt, cùng với đó là sự bùng nổ của thị trường du lịch nội địa. Đặc biệt, xu hướng "du lịch phượt" – hình thức du lịch tự túc, ngẫu hứng theo nhóm bằng phương tiện cá nhân (xe máy, ô tô, xe đạp) – trở thành lựa chọn hàng đầu của giới trẻ nhờ tính tự do và trải nghiệm thực tế.

                  THỰC TRẠNG & NHU CẦU THỊ TRƯỜNG DU LỊCH
                  
┌────────────────────────────┐         ┌────────────────────────────┐
│   Thị trường truyền thống   │         │     Xu hướng Phượt / DIY   │
│  (Agoda, Booking, VeXeRe)  │         │   (Đang tăng trưởng mạnh)   │
└─────────────┬──────────────┘         └─────────────┬──────────────┘
              │                                      │
              ▼                                      ▼
┌────────────────────────────┐         ┌────────────────────────────┐
│ • Đặt phòng, vé xe khách   │         │ • Di chuyển theo đoàn      │
│ • Review tĩnh địa điểm     │   VS    │ • Theo dõi vị trí Realtime │
│ • Thiếu kết nối nhóm phượt │         │ • Tìm tiện ích khẩn cấp    │
│ • Khó điều phối lộ trình   │         │ • Lập & chia sẻ hành trình │
└────────────────────────────┘         └────────────────────────────┘

Vấn đề thực tế và Pain Points

Mặc dù thị trường xuất hiện nhiều nền tảng trực tuyến như Agoda, Booking.com, TripAdvisor hay VeXeRe, phần lớn các giải pháp này chỉ tập trung vào nghiệp vụ thương mại đơn lẻ (đặt vé, đặt phòng khách sạn) hoặc cung cấp đánh giá tĩnh. Nhóm du khách tự túc và phượt thủ đang đối mặt với các rào cản lớn:

  • Lạc đoàn và mất an toàn khi di chuyển: Việc di chuyển theo nhóm đông trên các cung đường đèo dốc thường xuyên xảy ra tình trạng tách đoàn, sự cố hỏng xe hoặc tai nạn mà không thể định vị và hỗ trợ kịp thời.
  • Rời rạc công cụ quản lý hành trình: Người tổ chức (lead tour) phải dùng kết hợp nhiều ứng dụng: Google Maps để định vị, Excel/Notion để lên lịch trình, Zalo/Messenger để liên lạc và Facebook để chia sẻ hình ảnh sau chuyến đi.
  • Thiếu dữ liệu tiện ích chuyên biệt cho phượt: Khó khăn trong việc tìm kiếm các điểm hỗ trợ khẩn cấp trên cung đường (tiệm sửa xe máy, trạm xăng vùng sâu, quán ăn bình dân, nhà trọ bản địa).

Mục tiêu dự án

  1. Xây dựng nền tảng ứng dụng di động đa nền tảng PackNGo hỗ trợ toàn diện vòng đời chuyến đi: Lập kế hoạch $\rightarrow$ Mời thành viên $\rightarrow$ Định vị realtime trong chuyến đi $\rightarrow$ Đánh giá & chia sẻ kinh nghiệm.
  2. Thiết kế và triển khai kiến trúc backend phân tán theo mô hình Microservices kết hợp Event-Driven Architecture, tối ưu hóa khả năng mở rộng (scalability) và chịu lỗi (fault tolerance).
  3. Thiết lập hạ tầng Cloud-Native trên Google Kubernetes Engine (GKE) kết hợp quy trình tự động hóa GitLab CI/CD (Auto DevOps) nhằm rút ngắn chu kỳ phát hành sản phẩm.
  4. Triển khai cơ chế đồng bộ tọa độ thời gian thực với độ trễ dưới 2 giây và độ ổn định kết nối đạt 99.9%.

Phương pháp tiếp cận giải pháp

Đề tài lựa chọn kiến trúc Microservices thay vì Monolith truyền thống nhằm phân tách triệt để các miền nghiệp vụ (Core Domain và Media Processing Domain). Phía client sử dụng framework React Native cho phép tái sử dụng 85% mã nguồn giữa iOS và Android. Hệ thống backend vận hành trên nền tảng container Docker, được điều phối tự động bởi Kubernetes và tối ưu hóa truy vấn dữ liệu thông qua cơ chế đệm bộ nhớ Redis.

Kết quả kỳ vọng và chỉ số đo lường

  • Hệ thống Backend: Thời gian phản hồi API trung bình (latency) $\le 150\text{ ms}$, thông lượng xử lý $\ge 500\text{ RPS}$ (Requests Per Second) trên một cụm node cơ bản.
  • Ứng dụng Di động: Tốc độ khung hình duy trì $60\text{ FPS}$, dung lượng cài đặt $\le 45\text{ MB}$, thời gian khởi động ứng dụng $\le 2\text{ giây}$.
  • Hạ tầng CI/CD: Thời gian từ khi push code đến khi hoàn tất triển khai lên môi trường staging $\le 5\text{ phút}$.

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

  • Phạm vi: Nghiên cứu kiến trúc Microservices, containerization, điều phối cụm Kubernetes trên Google Cloud Platform (GCP), xây dựng ứng dụng di động React Native và tích hợp các dịch vụ bên thứ ba (Google Maps API, Google Cloud Storage, OAuth 2.0).
  • Giới hạn: Tập trung giải quyết bài toán định vị và quản lý hành trình theo nhóm tại thị trường Việt Nam; chưa tích hợp cổng thanh toán trực tiếp (Payment Gateway) và cơ chế gợi ý thông minh dựa trên mô hình học máy (Machine Learning recommendation).

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

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

Tiêu chí phân tích Nền tảng OTA (Agoda, Booking) Ứng dụng điều hướng (Google Maps) Mạng xã hội Du lịch (TripAdvisor) Giải pháp PackNGo
Quản lý hành trình nhóm Không hỗ trợ Rất hạn chế (chỉ chia sẻ lộ trình tĩnh) Lưu lịch trình cá nhân Chuyên sâu: phân quyền Lead/Member
Định vị thành viên Realtime Không có Có chia sẻ vị trí (rời rạc, tốn pin) Không có Tích hợp trực tiếp trên bản đồ hành trình
Tìm kiếm tiện ích khẩn cấp Khách sạn/Resort cao cấp Địa điểm chung chung Địa điểm du lịch nổi tiếng Tiện ích phượt: vá xe, xăng, quán ăn địa phương
Kiến trúc hệ thống Monolith phân tán / Microservices Hệ thống dữ liệu toàn cầu độc quyền Dịch vụ tập trung Microservices + Docker + Kubernetes + CI/CD

Ma trận ưu tiên yêu cầu người dùng (MoSCoW)

  • Must-Have (Bắt buộc): Đăng ký/Đăng nhập (OAuth 2.0/Local), Quản lý chuyến đi (CRUD Trip), Gắn tọa độ điểm xuất phát/điểm đến, Theo dõi vị trí thời gian thực giữa các thành viên, Upload hình ảnh chuyến đi, Viết review/bình luận.
  • Should-Have (Nên có): Mời bạn bè qua liên kết/mạng xã hội, Bộ nhớ đệm thông tin chuyến đi khi offline tạm thời, Cảnh báo lệch tuyến đường.
  • Could-Have (Có thể có): Gợi ý địa điểm tiện ích dọc tuyến đường dựa trên bán kính quét GPS, Tích hợp hệ thống thông báo đẩy (Push Notifications).
  • Won't-Have (Chưa triển khai): Đặt cọc kinh phí chuyến đi qua ví điện tử, Đặt xe khách hoặc thuê xe máy trực tiếp trên ứng dụng.

Thiết kế hệ thống

graph TD
    Client["PackNGo Mobile App (React Native)"] -->|HTTPS / REST API| Ingress["Kubernetes Ingress / Load Balancer"]
    
    subgraph K8s_Cluster ["Google Kubernetes Engine (GKE) Cluster"]
        Ingress --> CoreService["PackNGo Core API Service (Node.js/Express)"]
        Ingress --> ImageService["PackNGo Image API Service (Node.js)"]
        
        CoreService --> PostgreSQL[("PostgreSQL Database (ACID Storage)")]
        CoreService --> Redis[("Redis Cache (Session & Latency Store)")]
        
        ImageService --> GCS["Google Cloud Storage (Media Files)"]
        
        GitLabRunner["GitLab Runner (K8s Executor)"] -.->|Auto Deploy| CoreService
        GitLabRunner -.->|Auto Deploy| ImageService
    end

    Client -->|Map Tiles & Routing| GMapAPI["Google Maps Platform API"]

Chi tiết Tech Stack và Phiên bản

Thành phần Công nghệ / Thư viện Phiên bản Vai trò kỹ thuật
Mobile Frontend React Native 0.63.4 Xây dựng UI đa nền tảng (iOS & Android), quản lý luồng Main/JS Thread
State Management Redux & Redux-Saga 4.0.5 / 1.1.3 Quản lý global state và xử lý side-effects bất đồng bộ
Backend Framework Node.js / Express.js 14.15.1 / 4.17.1 RESTful API Engine xử lý nghiệp vụ non-blocking I/O
Database PostgreSQL 12.5 Lưu trữ dữ liệu quan hệ có cấu trúc (User, Trip, Review, Area)
In-Memory Cache Redis 6.0.9 Caching truy vấn thường xuyên và lưu trữ session/tọa độ tạm thời
Containerization Docker Engine 19.03.13 Đóng gói môi trường ứng dụng và tối ưu hóa layer image
Orchestration Kubernetes 1.18.12-gke Tự động điều phối, nhân bản Pods và tự phục hồi (Self-healing)
CI/CD Pipeline GitLab CI / Runner 13.6.0 Tự động hóa quá trình Linting, Testing, Build Image và Helm Deploy
Cloud Storage Google Cloud Storage v1 Lưu trữ phân tán tài nguyên đa phương tiện (Avatar, Review photos)

Thiết kế Cơ sở dữ liệu (Database Schema / Entities)

Hệ thống sử dụng mô hình cơ sở dữ liệu quan hệ PostgreSQL với các thực thể cốt lõi:

  • User: id (UUID, PK), username (VARCHAR), password_hash (VARCHAR), display_name (VARCHAR), phone_number (VARCHAR), avatar_url (TEXT), friend_ids (UUID[]), created_at (TIMESTAMP).
  • Trip: id (UUID, PK), owner_id (UUID, FK -> User.id), title (VARCHAR), from_area_id (UUID, FK -> Area.id), to_area_id (UUID, FK -> Area.id), start_date (TIMESTAMP), end_date (TIMESTAMP), partner_ids (UUID[]), status (INT), created_at (TIMESTAMP).
  • Area: id (UUID, PK), name (VARCHAR), latitude (DECIMAL(10,8)), longitude (DECIMAL(11,8)), category (INT), base_address (TEXT).
  • Review: id (UUID, PK), owner_id (UUID, FK -> User.id), trip_id (UUID, FK -> Trip.id), title (VARCHAR), content (TEXT), image_urls (TEXT[]), created_date (TIMESTAMP).
  • Comment: id (UUID, PK), owner_id (UUID, FK -> User.id), review_id (UUID, FK -> Review.id), content (TEXT), created_date (TIMESTAMP).

Thiết kế RESTful API Endpoints

POST   /api/v1/auth/login                  # Xác thực người dùng, trả về JWT Access Token
POST   /api/v1/auth/register               # Đăng ký tài khoản người dùng mới
GET    /api/v1/trips                       # Lấy danh sách chuyến đi theo bộ lọc người dùng
POST   /api/v1/trips                       # Khởi tạo chuyến đi mới (Title, Date, Waypoints)
PUT    /api/v1/trips/:id/members           # Mời hoặc thêm thành viên vào danh sách chuyến đi
POST   /api/v1/trips/:id/locations/sync    # Đẩy tọa độ GPS hiện tại của thành viên lên Redis/DB
GET    /api/v1/trips/:id/locations/stream  # Lấy tọa độ realtime mới nhất của toàn bộ nhóm
POST   /api/v1/media/upload                # Tải ảnh lên Google Cloud Storage qua Image API

Kiến trúc Bảo mật và Tối ưu Hiệu năng

  • Bảo mật: Sử dụng cơ chế xác thực không trạng thái (Stateless Authentication) qua JSON Web Tokens (JWT) được mã hóa bằng thuật toán HS256. Triển khai giao thức OAuth 2.0 cho phép đăng nhập an toàn qua Facebook SDK. Toàn bộ mật khẩu được hash bằng thư viện bcrypt với Salt Rounds = 10. API Gateway kiểm soát CORS và Rate Limiting nhằm chống lại các cuộc tấn công Brute-force/DDoS.
  • Hiệu năng: Cấu hình Redis Cache đệm dữ liệu thông tin địa điểm và danh sách thành viên với TTL (Time-To-Live) $300\text{ giây}$, giảm 75% tải đọc trực tiếp tới PostgreSQL.

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

Dự án áp dụng mô hình phát triển phần mềm lặp Agile/Scrum, phân chia thời gian thực hiện 16 tuần thành 5 giai đoạn rõ ràng:

                            LỘ TRÌNH TRIỂN KHAI DỰ ÁN (16 TUẦN)
                            
[Giai đoạn 1: Tuần 1 - 4]  ──> Nghiên cứu công nghệ (Node.js, React Native, K8s, Docker)
[Giai đoạn 2: Tuần 5 - 6]  ──> Phân tích nghiệp vụ, mô hình hóa UML & Database Design
[Giai đoạn 3: Tuần 7 - 14] ──> Phát triển Core API, Image Service & App React Native
[Giai đoạn 4: Tuần 15]     ──> Triển khai Cloud GKE Cluster, thiết lập GitLab CI/CD
[Giai đoạn 5: Tuần 16]     ──> Kiểm thử toàn diện, tối ưu hiệu năng & hoàn thiện báo cáo
  • Đánh giá rủi ro & giải pháp giảm thiểu:
    • Rủi ro rò rỉ bộ nhớ hoặc xung đột tài nguyên container: Giới hạn tài nguyên phần cứng nghiêm ngặt trong Kubernetes manifest (limits.cpu: "500m", limits.memory: "512Mi").
    • Rủi ro mất kết nối mạng di động trên vùng núi: Xây dựng cơ chế Local State Caching trên React Native bằng Redux-Persist và AsyncStorage, tự động gửi lại tọa độ ngay khi có mạng (Exponential Backoff Retry).

Implementation và kết quả

Quá trình phát triển và Code Snippets

1. Đóng gói ứng dụng với Multi-Stage Dockerfile

Tối ưu hóa dung lượng Docker image của PackNGo Core API, giảm kích thước image từ $1.1\text{ GB}$ xuống còn $135\text{ MB}$:

# Stage 1: Build & Install Dependencies
FROM node:14.15.1-alpine AS builder
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci --only=production

# Stage 2: Production Runtime
FROM node:14.15.1-alpine
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/node_modules ./node_modules
COPY . .
EXPOSE 3000
USER node
CMD ["node", "server.js"]

2. Thuật toán tính khoảng cách và định vị thời gian thực

Xử lý đồng bộ tọa độ giữa các thành viên đoàn phượt và tính toán cảnh báo tách đoàn bằng công thức Haversine trên Node.js backend:

/**
 * Tính khoảng cách giữa 2 tọa độ địa lý (Haversine Formula)
 * @param {number} lat1 - Vĩ độ điểm 1
 * @param {number} lon1 - Kinh độ điểm 1
 * @param {number} lat2 - Vĩ độ điểm 2
 * @param {number} lon2 - Kinh độ điểm 2
 * @returns {number} Khoảng cách tính theo Kilometers (km)
 */
function calculateHaversineDistance(lat1, lon1, lat2, lon2) {
  const toRad = (value) => (value * Math.PI) / 180;
  const R = 6371; // Bán kính Trái Đất (km)
  
  const dLat = toRad(lat2 - lat1);
  const dLon = toRad(lon2 - lon1);
  
  const a =
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
    Math.sin(dLon / 2) * Math.sin(dLon / 2);
    
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  return parseFloat((R * c).toFixed(3));
}

// Handler cập nhật và kiểm tra khoảng cách thành viên
exports.updateMemberLocation = async (req, res) => {
  const { tripId, userId, latitude, longitude } = req.body;
  const redisKey = `trip:${tripId}:locations`;
  
  // Lưu tọa độ người dùng vào Redis Hash (HSET)
  await redisClient.hset(redisKey, userId, JSON.stringify({
    latitude,
    longitude,
    updatedAt: new Date().toISOString()
  }));
  
  return res.status(200).json({ success: true, message: "Location synchronized." });
};

3. Cấu hình quy trình tự động hóa GitLab CI/CD Pipeline

Tự động kích hoạt kiểm thử, đóng gói container và triển khai lên cụm Kubernetes khi có commit vào nhánh master:

stages:
  - test
  - build
  - deploy

run_unit_tests:
  stage: test
  image: node:14.15.1-alpine
  script:
    - npm install
    - npm run test:coverage
  only:
    - master
    - develop

build_container_image:
  stage: build
  image: docker:19.03.12
  services:
    - docker:19.03.12-dind
  script:
    - echo "$GCP_SERVICE_KEY" | docker login -u _json_key --password-stdin https://gcr.io
    - docker build -t gcr.io/$GCP_PROJECT_ID/packngo-core-api:$CI_COMMIT_SHA .
    - docker push gcr.io/$GCP_PROJECT_ID/packngo-core-api:$CI_COMMIT_SHA
  only:
    - master

deploy_to_kubernetes:
  stage: deploy
  image: google/cloud-sdk:latest
  script:
    - echo "$GCP_SERVICE_KEY" > key.json
    - gcloud auth activate-service-account --key-file=key.json
    - gcloud container clusters get-credentials $GKE_CLUSTER_NAME --zone $GCP_ZONE --project $GCP_PROJECT_ID
    - kubectl set image deployment/packngo-core-api packngo-core-api=gcr.io/$GCP_PROJECT_ID/packngo-core-api:$CI_COMMIT_SHA
  only:
    - master

Kiểm thử và Đánh giá hiệu năng

                             KẾT QUẢ KIỂM THỬ TẢI TRÊN GKE
                             
  Requests/sec (RPS)       Latency trung bình (ms)        Tỷ lệ thành công (Success Rate)
 ┌───────────────────┐    ┌─────────────────────────┐    ┌──────────────────────────────┐
 │     620 RPS       │    │         142 ms          │    │            99.85%            │
 └───────────────────┘    └─────────────────────────┘    └──────────────────────────────┘
  • Độ bao phủ kiểm thử (Test Coverage): Hệ thống đạt 84.5% Code Coverage trên toàn bộ các endpoint nghiệp vụ cốt lõi thông qua bộ kiểm thử Jest & Supertest.
  • Benchmark tải hệ thống (Load Testing via Artillery):
    • Môi trường thử nghiệm: Cụm GKE 3 Worker Nodes (n1-standard-2, 2 vCPU, 7.5 GB RAM).
    • Tải giả lập: 500 người dùng đồng thời gửi request cập nhật vị trí và truy vấn lộ trình trong 10 phút.
    • Kết quả: Thông lượng đạt đỉnh 620 RPS, độ trễ trung bình đạt 142 ms (đáp ứng vượt kỳ vọng so với mục tiêu $\le 200\text{ ms}$), tỷ lệ lỗi phản hồi $\le 0.15%$.
  • Đánh giá trải nghiệm người dùng (UAT): Thử nghiệm thực tế với 30 sinh viên UIT tham gia chuyến đi giả định từ TP.HCM đến Vũng Tàu. Điểm số hài lòng trung bình đạt 9.0/10 về tính thân thiện của giao diện và độ chính xác của chức năng chia sẻ vị trí thành viên.

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

Các cải tiến kỹ thuật nổi bật

  1. Kiến trúc Cloud-Native hoàn chỉnh: Ứng dụng thành công mô hình Microservices trên nền tảng Google Kubernetes Engine kết hợp GitLab CI/CD Auto DevOps. Khắc phục hoàn toàn tình trạng "code chạy được trên máy dev nhưng lỗi trên server" thông qua chuẩn hóa Containerization.
  2. Cơ chế định vị đoàn phân tán kết hợp Redis In-Memory: Thay vì ghi trực tiếp tọa độ liên tục vào cơ sở dữ liệu quan hệ gây tắc nghẽn I/O (Database Bottleneck), PackNGo định tuyến toàn bộ stream tọa độ qua Redis Hash. Giải pháp này giúp giảm tải thao tác ghi trên ổ đĩa $80%$, đồng thời tăng tốc độ đồng bộ giữa các client lên $4\times$.
  3. Mô hình Hybrid Mobile tối ưu: Ứng dụng React Native tận dụng luồng JS Thread để tính toán logic và Main Native Thread để render các marker bản đồ động mượt mà, loại bỏ hiện tượng giật khung hình (lag/stuttering) khi hiển thị nhiều thành viên cùng lúc.

So sánh với các giải pháp hiện hành

Chỉ số / Tính năng Mô hình Monolith truyền thống Giải pháp thủ công (Zalo + Google Maps) Giải pháp PackNGo (Microservices)
Thời gian triển khai tính năng mới 3 - 5 ngày (triển khai thủ công) Không áp dụng $\le 5$ phút (GitLab CI/CD Pipeline)
Tự động phục hồi khi Crash Cần quản trị viên can thiệp thủ công Không có Tự phục hồi Pods trong $\le 10$ giây (K8s)
Tải tài nguyên máy chủ Chiếm dụng RAM/CPU tĩnh cao Phân tán trên nhiều app riêng lẻ Tối ưu hóa động theo Pods ReplicaSets
Khả năng mở rộng ngang (Horizontal Scaling) Phức tạp, tốn kém hạ tầng Không hỗ trợ Tự động mở rộng tức thì qua Kubernetes HPA

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

Kịch bản sử dụng thực tế (Use Case Scenario)

  • Tình huống: Nhóm 8 thành viên di chuyển bằng 4 xe máy từ TP.HCM đi Đà Lạt qua Quốc lộ 20.
  • Quy trình hoạt động:
    1. Trưởng đoàn (Lead): Tạo chuyến đi "Phượt Đà Lạt 3N2Đ", chọn ngày khởi hành, thiết lập các điểm dừng chân (Dầu Giây, Đèo Bảo Lộc, Hồ Tuyền Lâm) và gửi liên kết mời 7 thành viên còn lại qua Facebook/Zalo.
    2. Thành viên (Members): Chấp nhận lời mời trên app PackNGo. Khi chuyến đi bắt đầu, ứng dụng tự động chạy nền dịch vụ định vị GPS.
    3. Trên cung đường di chuyển: Màn hình bản đồ PackNGo hiển thị vị trí của toàn bộ 4 xe theo thời gian thực. Nếu một xe gặp sự cố hỏng lốp và dừng lại cách đoàn quá 1.5 km, hệ thống sẽ gửi cảnh báo trên bản đồ của nhóm. Thành viên sử dụng app để tìm nhanh "Tiệm sửa xe máy" gần nhất đã được cộng đồng đánh giá trước đó.
    4. Kết thúc hành trình: Thành viên đăng tải bài viết tổng kết kèm album ảnh lên PackNGo để chia sẻ kinh nghiệm vượt đèo an toàn cho cộng đồng.
                    QUY TRÌNH VẬN HÀNH THỰC TẾ CỦA PACKNGO
                    
[Tạo chuyến đi & Lộ trình] ──> [Mời thành viên qua Link/App] ──> [Định vị Realtime khi di chuyển]
                                                                                │
                                                                                ▼
[Chia sẻ Review & Kinh nghiệm] <── [Tìm tiện ích khẩn cấp: Sửa xe, Xăng] <──────┘

Chiến lược triển khai và Yêu cầu hệ thống

  • Yêu cầu hạ tầng tối thiểu để vận hành Backend:
    • Kubernetes Cluster: 2 Node Pools (tối thiểu 2 vCPU, 4GB RAM mỗi node).
    • PostgreSQL Instance: v12+ (1 Core, 2GB RAM, SSD Storage).
    • Redis Server: v6+ (1GB RAM In-memory).
  • Yêu cầu thiết bị người dùng (Client):
    • Android: Phiên bản 6.0 (Marshmallow) trở lên, hỗ trợ Google Play Services & GPS.
    • iOS: Phiên bản iOS 11.0 trở lên.
    • Kết nối mạng: 3G/4G/5G hoặc Wi-Fi.

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

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

  • Tiêu hao năng lượng thiết bị di động: Việc duy trì kết nối GPS liên tục ở chế độ nền trong thời gian dài (trên 6 tiếng di chuyển liên tục) có thể làm giảm thời lượng pin của thiết bị di động khoảng 15 - 20% so với mức thông thường.
  • Phụ thuộc vào sóng viễn thông di động: Tại các cung đường đèo hiểm trở hoặc vùng sâu vùng xa hoàn toàn mất sóng di động (No Signal), ứng dụng chưa thể đồng bộ tọa độ realtime qua máy chủ.
  • Hệ thống gợi ý chưa ứng dụng Trí tuệ nhân tạo: Chức năng tìm kiếm địa điểm hiện tại hoạt động dựa trên cơ chế truy vấn lọc theo bán kính địa lý và danh mục (Rule-based), chưa có khả năng cá nhân hóa theo sở thích người dùng.

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

  • Tích hợp công nghệ giao tiếp mạng ngang hàng Peer-to-Peer (P2P) Mesh Network qua Bluetooth Low Energy (BLE) / Wi-Fi Direct để giữ liên lạc nội bộ giữa các xe trong đoàn ngay cả khi mất kết nối Internet.
  • Ứng dụng mô hình học máy Recommendation Engine (Collaborative Filtering) nhằm tự động gợi ý lịch trình thông minh dựa trên lịch sử di chuyển và ngân sách của nhóm.
  • Tích hợp camera AI phát hiện tình trạng buồn ngủ của người lái xe và đưa ra cảnh báo âm thanh tức thì trên ứng dụng di động.

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

                              ĐỐI TƯỢNG HƯỞNG LỢI
                              
┌──────────────────────────┐                   ┌──────────────────────────┐
│        Sinh viên         │                   │   Kỹ sư phát triển       │
│  Tài liệu chuẩn mực về   │                   │ Kiến trúc Microservices  │
│  Microservices & DevOps  │                   │ thực chiến & K8s config  │
└────────────┬─────────────┘                   └────────────┬─────────────┘
             │                                              │
             ▼                                              ▼
┌──────────────────────────┐                   ┌──────────────────────────┐
│   Cộng đồng Phượt thủ    │                   │      Doanh nghiệp        │
│ Trải nghiệm an toàn,     │                   │ Nền tảng mở rộng linh    │
│ kết nối nhóm vững chắc   │                   │ hoạt, tối ưu chi phí hạ  │
└──────────────────────────┘                   └──────────────────────────┘
  • Sinh viên ngành Kỹ thuật Phần mềm / CNTT: Nguồn tài liệu tham khảo thực tế về cách tổ chức mã nguồn, xây dựng đồ án tốt nghiệp đạt chuẩn kỹ thuật cao, áp dụng đầy đủ quy trình từ thiết kế UML đến triển khai Cloud-Native.
  • Lập trình viên & Kỹ sư DevOps: Cung cấp mẫu cấu hình chuẩn (boilerplate) cho quy trình GitLab CI/CD tích hợp Kubernetes Executor, cách tối ưu hóa Dockerfile multi-stage và xử lý caching dữ liệu địa lý thời gian thực với Redis.
  • Cộng đồng du lịch tự túc / Phượt thủ: Sở hữu một công cụ tiện ích miễn phí giúp chuyến đi trở nên an toàn, có tổ chức, giảm thiểu rủi ro lạc đoàn và dễ dàng tìm kiếm sự trợ giúp trên hành trình.
  • Doanh nghiệp du lịch & Startups: Khung kiến trúc có thể mở rộng để phát triển thành các ứng dụng quản lý logistics, điều phối đội xe vận tải hoặc nền tảng du lịch thông minh toàn diện.

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

1. Hệ thống cần những yêu cầu phần cứng và dịch vụ cloud nào để triển khai?

Hệ thống yêu cầu một tài khoản Google Cloud Platform đã kích hoạt Kubernetes Engine (GKE), Google Cloud Storage và Google Maps API. Về phía server, cụm Kubernetes cần tối thiểu 2 Worker Nodes cấu hình 2 vCPU và 4GB RAM cho mỗi node. Cơ sở dữ liệu PostgreSQL và Redis có thể được triển khai trực tiếp dưới dạng StatefulSet trong cụm hoặc sử dụng dịch vụ quản lý (Cloud SQL, Memorystore).

2. Khi số lượng người dùng tăng đột biến, hệ thống xử lý mở rộng (scalability) như thế nào?

Nhờ kiến trúc Microservices và Kubernetes, hệ thống kích hoạt cơ chế Horizontal Pod Autoscaler (HPA) dựa trên chỉ số CPU/Memory Utilization. Khi lượng request vượt ngưỡng $70%$ công suất, Kubernetes sẽ tự động nhân bản từ 2 Pods lên tối đa 10 Pods cho PackNGo Core API. Tọa độ realtime được xử lý trên RAM thông qua Redis Cluster giúp giảm tải tối đa cho cơ sở dữ liệu chính.

3. Làm thế nào để tích hợp hệ thống với các dịch vụ bản đồ khác ngoài Google Maps?

Kiến trúc phía client được thiết kế trừu tượng hóa (Abstraction Layer) thông qua component MapViewWrapper. Do đó, lập trình viên có thể dễ dàng thay thế Google Maps API bằng các nền tảng mã nguồn mở như OpenStreetMap / Mapbox bằng cách thay đổi adapter module mà không cần viết lại logic quản lý tọa độ của ứng dụng.

4. Chi phí duy trì hệ thống trên nền tảng đám mây Google Cloud ước tính là bao nhiêu?

Với quy mô thử nghiệm và phục vụ khoảng 1.000 người dùng hoạt động hàng ngày (DAU), chi phí ước tính khoảng $30 - $50 USD/tháng cho cụm GKE tiêu chuẩn, Redis và dung lượng lưu trữ Cloud Storage. Khi mở rộng quy mô thương mại, chi phí có thể tối ưu bằng cách áp dụng Preemptible VMs (Spot Instances) để tiết kiệm tới $60%$ chi phí máy chủ.

5. Dữ liệu vị trí của người dùng có được bảo mật và xóa sau chuyến đi không?

Toàn bộ dữ liệu vị trí truyền qua mạng đều được mã hóa bằng giao thức HTTPS/TLS. Tọa độ realtime lưu trên bộ nhớ đệm Redis được cấu hình cơ chế tự động xóa (TTL expiry) sau 24 giờ kể từ khi chuyến đi kết thúc. Người dùng có toàn quyền bật/tắt quyền chia sẻ vị trí bất kỳ lúc nào ngay trong mục cài đặt quyền riêng tư của ứng dụng.


Kết luận

Khóa luận tốt nghiệp "Phát triển ứng dụng hỗ trợ tư vấn & chia sẻ thông tin du lịch cùng nhau" (PackNGo) của tác giả Ngô Đức Hòa (Trường ĐH Công nghệ Thông tin - ĐHQG TP.HCM) đã hoàn thành xuất sắc các mục tiêu đề ra. Đề tài không chỉ giải quyết trọn vẹn bài toán thực tiễn của cộng đồng du lịch tự túc tại Việt Nam mà còn là một minh chứng tiêu chuẩn cho việc ứng dụng các kỹ thuật công nghệ phần mềm tiên tiến:

  • Hiện thực hóa thành công kiến trúc Microservices phân tán, module hóa cao, đảm bảo tính sẵn sàng và khả năng chịu lỗi.
  • Ứng dụng trọn vẹn văn hóa DevOps thông qua hệ thống tự động hóa GitLab CI/CD kết hợp Google Kubernetes Engine (GKE).
  • Xây dựng ứng dụng di động React Native hoàn chỉnh, hoạt động mượt mà, tích hợp đồng bộ dữ liệu thời gian thực và quản trị tài nguyên hiệu quả.

Đề tài đã được Hội đồng chấm khóa luận tốt nghiệp đánh giá loại Giỏi với điểm số xuất sắc 9/10, khẳng định giá trị ứng dụng cao và tiềm năng phát triển mạnh mẽ thành sản phẩm thương mại trong tương lai.