Bối cảnh và vấn đề nghiên cứu

Trong bối cảnh ngành du lịch Việt Nam không ngừng phát triển nhờ nguồn tài nguyên thiên nhiên phong phú và di sản văn hóa đặc sắc, nhu cầu tham quan, nghỉ ngơi của người dân cũng như du khách quốc tế ngày càng gia tăng. Tuy nhiên, việc tự tổ chức tour du lịch, lựa chọn điểm đến và sắp xếp lộ trình hợp lý vẫn là rào cản lớn đối với những người chưa có nhiều kinh nghiệm du lịch, đặc biệt là nhóm du khách trẻ tuổi. Bên cạnh đó, khi tổ chức du lịch theo nhóm, vấn đề quản lý vị trí giữa các thành viên nhằm tránh thất lạc trở thành một nhu cầu thực tế cấp thiết.

Khóa luận tốt nghiệp kỹ sư Công nghệ Thông tin (chuyên ngành Công nghệ Phần mềm) tại Trường Đại học Sư phạm Kỹ thuật TP.HCM của nhóm tác giả Trần Kim Hoàng và Trần Lê Anh Quốc (GVHD: ThS. Trương Thị Ngọc Phượng, 2019) thực hiện đề tài "Xây dựng ứng dụng du lịch sử dụng Flutter và Microservices" nhằm giải quyết các bài toán trên.

Mục tiêu và nhiệm vụ nghiên cứu được xác định cụ thể gồm:

  1. Tìm hiểu tổng quan về framework Flutter và mô hình kiến trúc Microservices.
  2. Khảo sát, nghiên cứu các công cụ, giao thức và thư viện hỗ trợ liên quan (Protocol Buffers, NATS Streaming, MongoDB).
  3. Ứng dụng Flutter và Microservices vào việc xây dựng phần mềm du lịch mang tên Travel-Express hoạt động trên hai hệ điều hành Android và iOS.
  4. Cài đặt, kiểm thử toàn diện các luồng chức năng và đánh giá hoạt động của ứng dụng du lịch trong thực tế.

Đối tượng và phạm vi nghiên cứu của đề tài:

  • Đối tượng nghiên cứu: Nền tảng lập trình di động Flutter, kiến trúc phân tán Microservices, các thư viện hỗ trợ truyền thông liên dịch vụ, cùng các mô hình ứng dụng hỗ trợ lập lịch trình và đánh giá địa điểm du lịch hiện hành.
  • Phạm vi nghiên cứu:
    • Về không gian và chức năng: Nghiên cứu, xây dựng ứng dụng di động đa nền tảng tập trung vào các nghiệp vụ tạo lịch trình, theo dõi vị trí thành viên, chia sẻ chuyến đi và đánh giá địa danh.
    • Về thời gian: Đề tài được thực hiện từ ngày 18/03/2019 đến ngày 30/06/2019.

Cơ sở lý thuyết và phương pháp

Đề tài áp dụng các phương pháp nghiên cứu học thuật kết hợp kỹ thuật công nghệ phần mềm:

  • Phương pháp nghiên cứu tài liệu: Thu thập, phân tích tài liệu kỹ thuật chính thức từ Google về Flutter, tài liệu về kiến trúc Microservices, Protocol Buffers (Protobuf), hệ thống truyền tin NATS Streaming và cơ sở dữ liệu MongoDB.
  • Phương pháp chuyên gia: Tiếp nhận tư vấn chuyên môn, phản biện và hướng dẫn trực tiếp từ giảng viên hướng dẫn (ThS. Trương Thị Ngọc Phượng) cùng các giảng viên Khoa Công nghệ Thông tin - Trường Đại học Sư phạm Kỹ thuật TP.HCM.

Về mặt công nghệ, hệ thống được xây dựng trên các nền tảng và công cụ chuyên biệt:

  • Ngôn ngữ lập trình: Sử dụng Golang cho phía máy chủ (backend microservices) nhằm tối ưu hiệu năng xử lý đa luồng và sử dụng Dartlang cho phía máy khách di động (Flutter).
  • Kiến trúc Microservices: Chia nhỏ hệ thống thành các dịch vụ độc lập, giúp cô lập tài nguyên, dễ mở rộng và bảo trì từng module riêng biệt.
  • Định dạng dữ liệu Protocol Buffers (Protobuf): Công nghệ tuần tự hóa dữ liệu dạng nhị phân do Google phát triển, cho phép tối ưu kích thước gói tin và tốc độ truyền tải trên đường truyền.
  • NATS Streaming: Đóng vai trò là Event Bus trung gian, điều hướng message tự động, hỗ trợ cơ chế Service Discovery và ghi nhận nhật ký dịch vụ (Service Log).
  • Hệ quản trị cơ sở dữ liệu MongoDB: Cơ sở dữ liệu NoSQL hướng tài liệu (Document-oriented), lưu trữ dữ liệu dưới dạng JSON/BSON linh hoạt, phục vụ việc truy vấn dữ liệu phi cấu trúc và bán cấu trúc nhanh chóng.
Tiêu chí Protocol Buffers (Protobuf) JSON XML
Định dạng dữ liệu Nhị phân (Binary) Văn bản thuần (Text) Văn bản thuần (Text/Tags)
Kích thước đầu ra Rất nhỏ, độ đậm đặc dữ liệu cao Trung bình Lớn, dài dòng
Khả năng đọc hiểu Cần schema file (.proto), không đọc trực tiếp Con người đọc/sửa dễ dàng Con người đọc/sửa dễ dàng
Tốc độ xử lý Nhanh hơn 3 đến 10 lần so với XML/JSON Trung bình Chậm nhất
Hỗ trợ Schema Bắt buộc định nghĩa trước cấu trúc Không bắt buộc Hỗ trợ qua XSD/DTD

Thiết kế và triển khai

Hệ thống Travel-Express được thiết kế theo mô hình phân tán nhiều tầng, phân định rõ ràng giữa tầng hiển thị di động và tầng xử lý nghiệp vụ microservices:

+-------------------------------------------------------------------+
|               CLIENT LAYER (Android & iOS)                       |
|               - Flutter UI Framework (Dartlang)                   |
|               - State Management & Local Storage                  |
+---------------------------------+---------------------------------+
                                  |
               Protobuf Over gRPC / HTTP REST API
                                  |
+---------------------------------v---------------------------------+
|                     BACKEND MICROSERVICES LAYER                   |
|                                                                   |
|   +-------------------+  NATS Streaming   +-------------------+   |
|   |   User Service    |<=================>|   Trip Service    |   |
|   |     (Golang)      |   (Event Bus)     |     (Golang)      |   |
|   +---------+---------+                   +---------+---------+   |
|             |                                       |             |
|   +---------v---------+                   +---------v---------+   |
|   | Destination Svc   |                   |  Location Service |   |
|   |     (Golang)      |                   |     (Golang)      |   |
|   +---------+---------+                   +---------+---------+   |
+-------------|---------------------------------------|-------------+
              |                                       |
              +-------------------+-------------------+
                                  |
+---------------------------------v---------------------------------+
|                      DATABASE LAYER (NoSQL)                       |
|                             MongoDB                               |
|        (tbl_users, tbl_trips, tbl_places, tbl_days, tbl_regions)  |
+-------------------------------------------------------------------+

Kiến trúc phân tầng và luồng dữ liệu

  1. Tầng ứng dụng di động (Frontend): Xây dựng trên Flutter, hỗ trợ Material Design và Cupertino, giao diện dạng Reactive kết nối trực tiếp với backend qua API.
  2. Tầng dịch vụ phân tán (Backend): Các dịch vụ viết bằng Golang thực hiện từng nghiệp vụ độc lập (quản lý người dùng, quản lý lịch trình, quản lý địa danh, quản lý vị trí nhóm). NATS Streaming điều phối thông điệp bất đồng bộ giữa các service, giảm phụ thuộc trực tiếp.
  3. Tầng cơ sở dữ liệu: Toàn bộ dữ liệu nghiệp vụ được chuẩn hóa và lưu trữ tại MongoDB.

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

Cơ sở dữ liệu của ứng dụng gồm 5 thực thể chính:

  • tbl_users: Lưu trữ thông tin cá nhân, định danh tài khoản, số điện thoại, token mạng xã hội.
  • tbl_trips: Quản lý thông tin chuyến đi bao gồm id, userIds, name, fromRegionId, toRegionId, fromDate, toDate, dayIds, active, ngày tạo/cập nhật/xóa.
  • tbl_places: Lưu trữ các địa điểm dừng chân, tham quan, địa chỉ, hình ảnh và xếp hạng đánh giá.
  • tbl_days: Quản lý danh sách hoạt động, lộ trình chi tiết gán theo từng ngày cụ thể của một chuyến đi.
  • tbl_regions: Thông tin vùng miền, khu vực địa lý xuất phát và điểm đến (id, name, address, active).

Nội dung chính theo từng chương

Chương 1: Cơ sở lý thuyết

Chương này tổng hợp cơ sở lý thuyết nền tảng phục vụ nghiên cứu. Tác giả phân tích ưu và nhược điểm của kiến trúc Microservices so với kiến trúc nguyên khối (Monolith); nêu rõ ưu điểm về tính linh hoạt, khả năng mở rộng độc lập, tối ưu tài nguyên vận hành, đồng thời chỉ ra thách thức trong kiểm thử và duy trì tính nhất quán dữ liệu. Nội dung chương trình bày chi tiết về giao thức Protocol Buffers, giải thích cơ chế truyền thông điệp của NATS Streaming và cấu trúc tài liệu không ràng buộc lược đồ (schema-less) của MongoDB. Đối với ứng dụng di động, chương 1 giới thiệu công nghệ Flutter, làm rõ cơ chế Hot Reload và khả năng biên dịch trực tiếp sang mã máy native trên cả hai nền tảng Android và iOS.

Chương 2: Khảo sát hiện trạng

Tác giả tiến hành khảo sát thực trạng và đánh giá chức năng của ba ứng dụng phổ biến: Trip hunter, GrupTrip và Google Maps.

Tên ứng dụng Ưu điểm ghi nhận Nhược điểm/Hạn chế theo tác giả
Trip hunter Hỗ trợ lập lịch trình tự động/thủ công; dự trù chi phí; đề xuất địa danh, quán ăn, khách sạn; chia sẻ lộ trình. Chưa cụ thể hóa lộ trình trực quan trên bản đồ; chưa xác định vị trí thực tế trong lộ trình; thiếu tính năng chat nhóm.
GrupTrip Giao diện thân thiện; hỗ trợ lưu hình ảnh và gắn thẻ cá nhân; có dòng thời gian; hỗ trợ thành viên góp ý. Chưa hỗ trợ hiển thị toàn bộ lộ trình; chưa theo dõi tiến độ chuyến đi; thiếu tính năng chat nội bộ nhóm.
Google Maps Định vị chính xác vị trí hiện tại; điều hướng lộ trình tối ưu kèm khoảng cách và thời gian di chuyển. Không hỗ trợ thiết lập lịch trình du lịch nhiều ngày nhiều điểm; không có quản lý kinh phí và ghi chú địa điểm chuyên biệt.

Dựa trên kết quả khảo sát, tác giả xây dựng bảng đặc tả 16 tính năng chính cho ứng dụng Travel-Express, định rõ các tác nhân Guest và User.

Chương 3: Lập danh sách yêu cầu

Chương 3 xây dựng sơ đồ Use Case tổng thể và chi tiết hóa các yêu cầu nghiệp vụ kèm mã quy định (QD) và biểu mẫu (BM):

  • Phân hệ Guest (Khách vãng lai): Bao gồm chức năng đăng nhập qua số điện thoại (QD_LoginWithPhoneNumber - mã OTP xác thực có hiệu lực trong 60 giây), đăng nhập bằng tài khoản Facebook (QD_LoginWithFacebook), và đăng nhập bằng tài khoản Google (QD_LoginWithGoogle).
  • Phân hệ User (Người dùng đã đăng nhập): Gồm 13 nhóm nghiệp vụ chính: Xem thông tin tài khoản (QD_ViewProfile), Chỉnh sửa thông tin (QD_EditProfile), Tạo lịch trình (QD_CreateTripItinerary), Xóa lịch trình (QD_DeleteTripItinerary), Xem lịch trình (QD_ViewTripItinerary), Lưu/Đặt lịch trình từ người khác (QD_BookTripItinerary), Ước tính kinh phí (QD_EstimateBudget), Tạo/Sửa/Xóa địa danh (QD_CreateDestination, QD_EditDestination, QD_DeleteDestination), Xem thông tin địa danh (QD_ViewDestination), Đánh dấu điểm đã đến (QD_MarkArrivedDestination), và Đăng xuất hệ thống (QD_Logout).

Chương 4: Phân tích yêu cầu và thiết kế cơ sở dữ liệu

Nội dung chương 4 tập trung mô hình hóa quy trình xử lý thông qua Sơ đồ luồng dữ liệu (Data Flow Diagram - DFD) và Lược đồ tuần tự (Sequence Diagram) cho từng trường hợp sử dụng cụ thể. Tác giả mô tả chi tiết các luồng dữ liệu trao đổi (như luồng D1 nhận dữ liệu từ người dùng, D3 truy vấn thông tin bảng tbl_trips và tbl_regions, D6 kết xuất lịch trình hiển thị). Bên cạnh đó, chương này chuẩn hóa cấu trúc dữ liệu cho 5 bảng trong MongoDB, xác định các trường dữ liệu khóa chính, kiểu dữ liệu, các cờ trạng thái active và các mốc thời gian quản lý bản ghi (dateCreatedAt, dateUpdatedAt, dateDeletedAt).

Chương 5: Thiết kế giao diện và xử lý

Chương 5 hiện thực hóa các yêu cầu người dùng thành 11 màn hình giao diện cụ thể:

  1. Màn hình khởi động (Splash Screen).
  2. Màn hình đăng nhập (Login Screen).
  3. Màn hình chỉnh sửa thông tin cá nhân (Edit Profile Screen).
  4. Màn hình chọn địa điểm (Select Destination Screen).
  5. Màn hình tạo lịch trình (Create Trip Screen).
  6. Màn hình thêm lịch trình chi tiết theo từng ngày (Daily Schedule Screen).
  7. Màn hình khám phá địa danh (Discovery Screen).
  8. Màn hình đánh giá địa danh (Review Screen).
  9. Màn hình thông tin chi tiết địa danh (Place Information Screen).
  10. Màn hình chọn nơi dừng chân (Place Selection Screen).
  11. Màn hình chi tiết kế hoạch chuyến đi (Trip Details & Map Plan Screen).

Mỗi màn hình đều được phân tích theo 3 bảng đặc tả: Bảng chi tiết đối tượng giao diện, Bảng chi tiết xử lý tương tác và Danh sách luồng xử lý dữ liệu.

Chương 6: Cài đặt và kiểm thử

Chương 6 trình bày Sơ đồ thành phần (Component Diagram) và Sơ đồ triển khai (Deployment Diagram) của hệ thống Travel-Express. Nhóm tác giả tiến hành kiểm thử hộp đen (Black-box testing) trên toàn bộ 10 màn hình chức năng chính của ứng dụng. Mỗi ca kiểm thử (Test case) đều được ghi nhận cụ thể điều kiện đầu vào, thao tác thực hiện, kết quả kỳ vọng và kết quả thực tế.

Kết quả và đóng góp

Khóa luận hoàn thành các mục tiêu kỹ thuật và nghiệp vụ đề ra:

  • Kết quả phần mềm: Xây dựng hoàn chỉnh ứng dụng di động Travel-Express chạy trên nền tảng Android và iOS bằng framework Flutter, kết nối đến hệ thống backend Microservices viết bằng Golang.
  • Kết quả kiểm thử: Toàn bộ các ca kiểm thử chức năng cho 10 màn hình (đăng nhập đa phương thức, tạo/xóa lịch trình, chỉnh sửa thông tin, tính toán dự trù kinh phí, xem địa danh, đánh dấu điểm đến) đều đạt kết quả khớp với yêu cầu thiết kế ban đầu.
  • Đóng góp kỹ thuật:
    • Minh chứng tính khả thi của việc ứng dụng Flutter để phát triển phần mềm di động đa nền tảng từ một cơ sở mã nguồn duy nhất.
    • Thiết lập thành công mô hình kiến trúc Microservices kết hợp NATS Streaming làm Event Bus và Protocol Buffers làm định dạng dữ liệu tuần tự hóa, giúp giảm thiểu độ trễ và kích thước gói tin so với các phương thức truyền thống dựa trên REST JSON thuần túy.

Hạn chế và hướng nghiên cứu tiếp

  • Hạn chế:

    • Hệ thống chưa tích hợp tính năng giao tiếp thời gian thực (Chat nhóm nội bộ) giữa các thành viên trong suốt hành trình.
    • Việc theo dõi vị trí nhóm theo thời gian thực và tự động cảnh báo khi có thành viên bị tách đoàn chưa được triển khai hoàn chỉnh ở mức tự động hóa cao.
    • Phạm vi dữ liệu địa danh và đề xuất lịch trình vẫn cần được quản trị thủ công hoặc bán tự động.
  • Hướng phát triển:

    • Hoàn thiện module trò chuyện trực tuyến và đồng bộ trạng thái vị trí thành viên theo thời gian thực (Real-time tracking).
    • Tích hợp các thuật toán trí tuệ nhân tạo nhằm gợi ý và tối ưu hóa lộ trình di chuyển tự động dựa trên thời gian, ngân sách và sở thích cá nhân.
    • Mở rộng hệ thống API liên kết với các đơn vị dịch vụ thứ ba (đặt phòng khách sạn, vé máy bay, dịch vụ ăn uống).

Giá trị tham khảo

Khóa luận là tài liệu tham khảo chuyên môn phù hợp cho sinh viên ngành Công nghệ Thông tin, Kỹ thuật Phần mềm và các kỹ sư phát triển ứng dụng di động:

  • Tài liệu tham khảo kiến trúc: Cung cấp phương pháp phân tích, thiết kế hệ thống phân tán sử dụng Microservices, Golang, NATS Streaming và Protobuf.
  • Tài liệu thiết kế phần mềm: Cung cấp hệ thống tài liệu chuẩn mực về phân tích yêu cầu (Use Case, DFD, Sequence Diagram), thiết kế cơ sở dữ liệu NoSQL (MongoDB) và phương pháp xây dựng kịch bản kiểm thử giao diện di động trên Flutter.

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

1. NATS Streaming đóng vai trò gì trong kiến trúc backend của ứng dụng Travel-Express?
NATS Streaming được sử dụng như một Event Bus trung gian giúp điều hướng và luân chuyển các message bất đồng bộ giữa các microservices, đồng thời đảm nhận vai trò hỗ trợ Service Discovery và ghi nhận nhật ký hệ thống (Service Log).

2. Cơ chế đăng nhập bằng số điện thoại được quy định xử lý như thế nào?
Theo quy định QD_LoginWithPhoneNumber, người dùng nhập số điện thoại và nhận một mã xác thực gửi về máy. Mã xác thực này có hiệu lực trong vòng 60 giây; nếu quá thời gian trên, người dùng bắt buộc phải yêu cầu gửi lại mã mới.

3. Cơ sở dữ liệu MongoDB trong đồ án quản lý những bảng dữ liệu nào?
Cơ sở dữ liệu gồm 5 bảng (collection) chính: tbl_users (thông tin người dùng), tbl_trips (thông tin chuyến đi), tbl_places (thông tin địa điểm), tbl_days (lịch trình chi tiết từng ngày) và tbl_regions (khu vực/vùng miền).

4. Vì sao nhóm tác giả sử dụng Protocol Buffers thay vì định dạng JSON hoặc XML?
Protocol Buffers mã hóa dữ liệu dưới dạng nhị phân, tạo ra kích thước gói tin nhỏ hơn và tốc độ xử lý tuần tự hóa nhanh hơn từ 3 đến 10 lần so với XML hoặc JSON, giúp giảm tải băng thông mạng di động và tăng tốc độ giao tiếp giữa các dịch vụ.

5. Ứng dụng Travel-Express khắc phục được những nhược điểm nào của Trip hunter và GrupTrip?
Travel-Express tích hợp việc định vị và hiển thị chi tiết các điểm đến trong lộ trình trên bản đồ, hỗ trợ người dùng đánh dấu địa điểm đã đến (Mark Arrived Destination), đồng thời kết hợp tính năng dự trù kinh phí và quản lý lộ trình theo từng ngày cụ thể trên một giao diện thống nhất.

Kết luận

Đồ án tốt nghiệp "Xây dựng ứng dụng du lịch sử dụng Flutter và Microservices" của sinh viên Trần Kim Hoàng và Trần Lê Anh Quốc đã giải quyết thành công bài toán xây dựng ứng dụng hỗ trợ du lịch nhóm trên thiết bị di động. Bằng việc kết hợp nền tảng Flutter ở phía máy khách và kiến trúc Microservices (Golang, NATS Streaming, MongoDB, Protobuf) ở phía máy chủ, sản phẩm Travel-Express đáp ứng đầy đủ các yêu cầu về lập lịch trình, quản lý chi phí và theo dõi chuyến đi. Công trình là tài liệu tham khảo có giá trị cao về mặt kỹ thuật triển khai hệ thống phân tán và phát triển ứng dụng di động đa nền tảng.