You are on page 1of 40

HỢP TÁC XÃ NÔNG NGHIỆP SỐ

TRUNG TÂM CÔNG NGHỆ THÔNG TIN

TỔNG QUAN VỀ BACKEND

Phạm vi sử dụng: HTX Nông Nghiệp Số


Biên soạn: Trần Lý Bửu

Trần Lý Bửu

Thừa Thiên Huế, ngày 24 tháng 08 năm 2023


Mục lục
Mục lục............................................................................................................................................
Lời mở đầu......................................................................................................................................
1. Giới thiệu về BackEnd...............................................................................................................
a. Định nghĩa BackEnd......................................................................................................................................
b. Vai trò và chức năng của BackEnd trong ứng dụng......................................................................................
2. Công nghệ và ngôn ngữ lập trình..............................................................................................
a. Ngôn ngữ lập trình Go...................................................................................................................................
b. Framework Gin Gonic....................................................................................................................................
3. Kiến trúc hệ thống......................................................................................................................
4. Cơ sở dữ liệu................................................................................................................................
a. Mô tả hệ quản trị cơ sở dữ liệu được sử dụng.............................................................................................
b. Cấu trúc cơ sở dữ liệu và các bảng quan trọng............................................................................................
c. Mô tả quy trình truy vấn và tương tác với cơ sở dữ liệu...............................................................................
5. API và giao tiếp với Frontend...................................................................................................
a. Khái niệm về API...........................................................................................................................................
b. Các bước phát triển.......................................................................................................................................
c. Chuẩn giao tiếp và định dạng dữ liệu............................................................................................................
6. Xây dựng API từ thiết kế trên Figma......................................................................................
7. Xử lý yêu cầu từ Frontend........................................................................................................
8. Bảo mật và xác thực...................................................................................................................
a. Khái niệm.......................................................................................................................................................
b. Các thư viện được sử dụng trong Golang.....................................................................................................
9. Quản lý lỗi và ghi nhật ký.........................................................................................................
10. Hiệu suất và tối ưu hóa............................................................................................................
a. Các biện pháp tối ưu hóa hiệu suất của BackEnd........................................................................................
b. Các công cụ và kỹ thuật để đo lường và nâng cao hiệu suất.......................................................................
11. Quản lý phiên và trạng thái....................................................................................................
a. Cách BackEnd quản lý phiên làm việc của người dùng................................................................................
b. Cách lưu trữ và truy xuất trạng thái ứng dụng..............................................................................................
12. Vấn đề mở rộng và mở rộng quy mô.....................................................................................
a. Các vấn đề liên quan đến mở rộng quy mô của BackEnd............................................................................
b. Cách thiết kế để hỗ trợ mở rộng và tăng quy mô..........................................................................................
13. Các công cụ hỗ trợ...................................................................................................................
a. Các công cụ đang sử dụng...........................................................................................................................
b. Cách cài đặt môi trường................................................................................................................................
14. Phụ lục hình ảnh mã nguồn....................................................................................................

1
Lời mở đầu
Tài liệu này là kết quả của công sức tự nghiên cứu và biên soạn của tôi về Backend -
một khía cạnh quan trọng trong việc xây dựng ứng dụng web và di động. Tôi đã tập
trung vào việc cung cấp một tổng quan về Backend, từ các khái niệm cơ bản đến tìm
hiểu về vai trò của Backend, các công nghệ và ngôn ngữ lập trình phổ biến, kiến trúc
hệ thống, cơ sở dữ liệu, giao tiếp với Frontend thông qua APIs, bảo mật và xác thực,
quản lý lỗi và ghi nhật ký, hiệu suất và tối ưu hóa, quản lý phiên và trạng thái, vấn đề
mở rộng và mở rộng quy mô, cùng các công cụ hỗ trợ trong quá trình phát triển
Backend. Tài liệu này không nhằm thay thế các tài liệu chi tiết và tài nguyên tham
khảo khác, mà nó sẽ cung cấp một cái nhìn tổng quan và mở đầu cho việc nghiên cứu
và khám phá về Backend. Nó được biên soạn dựa trên kiến thức và kinh nghiệm cá
nhân của tôi trong lĩnh vực này. Hy vọng rằng nó sẽ giúp bạn có được một cơ sở
vững chắc và khám phá thêm về thế giới phát triển ứng dụng web và di động. Cảm ơn
bạn đã quan tâm và sử dụng tài liệu này!

2
1. Giới thiệu về BackEnd
a. Định nghĩa BackEnd
Backend là một thuật ngữ trong lĩnh vực phát triển phần mềm và web, được sử dụng
để chỉ các thành phần và quy trình xử lý dữ liệu ở phía server trong một ứng dụng. Nhiệm
vụ chính của backend là xử lý các yêu cầu từ phía client (giao diện người dùng) và cung cấp
dữ liệu hoặc chức năng tương ứng. Backend thường bao gồm các thành phần, công nghệ và
quy trình như sau:
● Ngôn ngữ lập trình: Backend có thể được viết bằng nhiều ngôn ngữ lập trình
khác nhau như JavaScript (với Node.js), Python, Ruby, Java, PHP, và nhiều
ngôn ngữ khác.
● Framework: Backend thường sử dụng các framework để nhanh chóng xây
dựng ứng dụng. Ví dụ: Express.js và Koa cho Node.js, Django và Flask cho
Python, Ruby on Rails cho Ruby, Spring cho Java, Laravel cho PHP, và nhiều
framework khác.
● Cơ sở dữ liệu: Backend thường sử dụng cơ sở dữ liệu để lưu trữ và truy vấn dữ
liệu. Các hệ quản trị cơ sở dữ liệu phổ biến bao gồm MySQL, PostgreSQL,
MongoDB, Redis, và nhiều loại cơ sở dữ liệu khác.
● API (Application Programming Interface): Backend cung cấp API để cho phép
các ứng dụng khác tương tác với nó. API cho phép truy xuất dữ liệu, thực hiện
các thao tác CRUD (Create, Read, Update, Delete), và thực hiện các chức năng
khác.
● Xử lý logic: Backend chứa logic xử lý dữ liệu và logic kinh doanh của ứng
dụng. Nó kiểm tra và xử lý yêu cầu từ phía client, thực hiện tính toán, áp dụng
quy tắc kinh doanh, và gửi dữ liệu trả về cho phía client.
● Bảo mật: Backend đảm bảo bảo mật thông tin bằng cách xác thực và xác
authorize yêu cầu từ phía client. Nó cũng đảm bảo an toàn cho dữ liệu và thông
tin đi qua mạng.
● Quản lý phiên: Backend có thể quản lý phiên làm việc của người dùng, bao
gồm xác thực, quản lý trạng thái đăng nhập, và quản lý thông tin phiên làm
việc.
● Tương tác với các dịch vụ khác: Backend có thể tương tác với các dịch vụ bên
ngoài như dịch vụ thanh toán, dịch vụ email, dịch vụ lưu trữ đám mây, và
nhiều dịch vụ khác để thực hiện các chức năng bổ sung cho ứng dụng.
Tóm lại, backend là phần của một ứng dụng chịu trách nhiệm xử lý các yêu cầu từ
phía client, xử lý logic, truy xuất và lưu trữ dữ liệu, đảm bảo bảo mật, và cung cấp
các chức năng và dữ liệu cho phía client.

3
b. Vai trò và chức năng của BackEnd trong ứng dụng
Các lập trình viên Backend là những chuyên gia xây dựng và duy trì các cơ chế xử lý
dữ liệu và thực hiện các hành động động trên web. Các lập trình viên front-end kiểm
soát những gì được hiển thị trên trang, trong khi các lập trình viên BackEnd xử lý các
tác vụ liên quan đến lưu trữ dữ liệu, bảo mật và các hoạt động máy chủ ẩn khác.
● Xây dựng logic phía máy chủ: Tất cả các hoạt động và chương trình chạy trên
máy chủ. Ví dụ: xác minh tài khoản, xác minh thông tin tài khoản người dùng
chính xác, tối ưu hóa tốc độ trang web, v.v.
● Tự động hóa: Hạn chế các thao tác thủ công lặp đi lặp lại bằng cách tự động
hóa một số thao tác từ hệ thống dữ liệu được hỗ trợ
● Thông báo tự động: Thiết lập tính năng thông báo tính năng mới, chương trình
ưu đãi, … khách hàng quan tâm
● Xác nhận cơ sở dữ liệu: Kiểm tra thông tin khi cập nhật cơ sở dữ liệu trang
web hoặc ứng dụng bằng mã code. Các lập trình viên backend tạo ra các thủ
tục để đảm bảo rằng thông tin dữ liệu được xác thực trước khi thực hiện các
lệnh khác từ máy chủ.
● Hợp lý hóa quá trình truy cập hệ thống dữ liệu: Đảm bảo các trang web và ứng
dụng hoạt động nhanh chóng và cung cấp kết quả chính xác
Tổng quát, vai trò và chức năng của backend trong một ứng dụng là xử lý yêu cầu,
truy xuất và quản lý dữ liệu, thực hiện logic và quy tắc kinh doanh, đảm bảo bảo tổng
quát, vai trò và chức năng của backend trong một ứng dụng là xử lý yêu cầu từ phía
client, truy xuất và quản lý dữ liệu, thực hiện logic và quy tắc kinh doanh, đảm bảo
bảo mật và xác thực, tương tác với các dịch vụ khác, và quản lý phiên làm việc của
người dùng. Backend đóng vai trò quan trọng trong việc đảm bảo hoạt động ổn định
và cung cấp các dịch vụ và chức năng cho phía client của ứng dụng.

2. Công nghệ và ngôn ngữ lập trình


a. Ngôn ngữ lập trình Go
Golang, còn được gọi là Go, là một ngôn ngữ lập trình mã nguồn mở được phát triển
bởi Google. Go được thiết kế với mục tiêu đơn giản, hiệu quả và dễ sử dụng cho việc
phát triển ứng dụng phía máy chủ và các hệ thống mạng.
Dưới đây là một số đặc điểm và lợi ích của Golang:
● Hiệu suất cao: Golang được thiết kế để đạt hiệu suất cao. Nó sử dụng bộ thu

gom rác (garbage collector) hiệu quả, hỗ trợ đa luồng (concurrency) và xử lý không
đồng bộ (asynchronous) một cách dễ dàng. Điều này giúp ứng dụng Go có khả năng
xử lý đồng thời nhiều yêu cầu và tải lớn mà vẫn đảm bảo hiệu suất ổn định.

4
● Cú pháp đơn giản và dễ đọc: Go có cú pháp đơn giản và dễ đọc, giúp nhà phát
triển dễ dàng tiếp cận và hiểu mã nguồn. Nó hạn chế cú pháp phức tạp và quy ước
đồng nhất, giúp giảm thiểu lỗi và tăng tính nhất quán của mã nguồn.

5
● Hỗ trợ đa luồng mạnh mẽ: Golang cung cấp hỗ trợ tích hợp cho đa luồng
(concurrency) thông qua Goroutines và Channels. Goroutines là các tiến trình nhẹ,
giúp thực hiện đồng thời nhiều tác vụ. Channels là cơ chế truyền thông giữa các
Goroutines, cho phép trao đổi dữ liệu an toàn và đồng bộ giữa các luồng.
● Xử lý lỗi dễ dàng: Golang có hệ thống xử lý lỗi đơn giản và mạnh mẽ. Nó sử

dụng cách tiếp cận "error handling" thông qua giá trị trả về của hàm để xử lý lỗi.
Điều này giúp nhà phát triển quản lý lỗi dễ dàng và đảm bảo tính nhất quán trong mã
nguồn.
● Cộng đồng phát triển mạnh mẽ: Golang có một cộng đồng phát triển đông đảo

và nhiệt tình. Cộng đồng này cung cấp nhiều thư viện và framework hữu ích để phát
triển ứng dụng. Các tài liệu, ví dụ và hỗ trợ từ cộng đồng giúp nhà phát triển dễ dàng
học và sử dụng Golang.
● Hỗ trợ đa nền tảng: Golang hỗ trợ việc phát triển ứng dụng trên nhiều nền tảng,

bao gồm Windows, macOS và Linux. Bạn có thể xây dựng ứng dụng Go và triển khai
chúng trên các môi trường khác nhau một cách dễ dàng.
Golang thường được sử dụng trong các hệ thống phân tán, dịch vụ web, các ứng dụng
mạng và các công cụ cần độ tin cậy và hiệu suất cao.

b. Framework Gin Gonic


Gin Gonic là một framework web phát triển bằng ngôn ngữ Go và được sử dụng rộng
rãi trong việc xây dựng các ứng dụng web phía server (backend). Nó được thiết kế để
đơn giản, nhanh chóng và dễ sử dụng.
Dưới đây là một số đặc điểm và lợi ích của Gin Gonic:
● Hiệu suất cao: Gin Gonic được xây dựng với mục tiêu đạt hiệu suất cao. Nó sử

dụng routing nhanh chóng và cung cấp cơ chế xử lý middleware hiệu quả, giúp tăng
tốc độ xử lý yêu cầu của ứng dụng.
● Cú pháp đơn giản: Gin Gonic có cú pháp đơn giản và dễ đọc, giúp nhà phát

triển dễ dàng tiếp cận và làm việc với mã nguồn. Nó sử dụng các hàm và phương
thức rõ ràng để xử lý yêu cầu và phản hồi HTTP.
● Hỗ trợ routing mạnh mẽ: Gin Gonic cung cấp một bộ công cụ mạnh mẽ để định

tuyến (routing) yêu cầu HTTP. Bằng cách sử dụng các phương thức HTTP như GET,
POST, PUT, DELETE, và PATCH, bạn có thể xác định các tuyến đường (routes) và
xử lý các yêu cầu tương ứng.
● Middleware linh hoạt: Gin Gonic hỗ trợ mô hình middleware, cho phép bạn

thêm các lớp xử lý trung gian vào quy trình xử lý yêu cầu. Điều này giúp bạn thực
hiện các tác vụ như xác thực, ghi log, kiểm tra lỗi và nhiều hơn nữa trước khi xử lý
yêu cầu chính.

6
● Hỗ trợ JSON và XML: Gin Gonic cung cấp hỗ trợ tích hợp cho việc xử lý
JSON và XML. Bạn có thể dễ dàng đọc và ghi dữ liệu JSON/XML thông qua các cấu
trúc dữ liệu có sẵn trong framework.
● Cộng đồng phát triển và tài liệu tốt: Gin Gonic có một cộng đồng phát triển sôi

nổi và đông đảo. Nó có một tài liệu chi tiết và ví dụ đầy đủ, giúp bạn nhanh chóng
học và sử dụng framework.
Gin Gonic là một lựa chọn phổ biến cho việc phát triển backend bằng ngôn ngữ Go,
đặc biệt là trong các ứng dụng web nhỏ đến trung bình, cung cấp sự đơn giản, hiệu
suất và tính mở rộng.

3. Kiến trúc hệ thống


Kiến trúc hệ thống Backend (phía máy chủ) thường là một cấu trúc phức tạp và được
thiết kế để xử lý các yêu cầu và nhiệm vụ phía máy chủ của ứng dụng. Dưới đây là
một mô tả tổng quan về kiến trúc hệ thống Backend:
● Mô hình Client-Server: Hệ thống Backend thường tuân theo mô hình Client-

Server, trong đó máy chủ (Server) cung cấp các dịch vụ và xử lý yêu cầu từ phía
Client.
● Mã nguồn: Hệ thống Backend được viết bằng một ngôn ngữ lập trình như Java,

C#, Python, Go, Ruby, hoặc Node.js. Mã nguồn này xử lý các yêu cầu từ phía Client,
truy cập cơ sở dữ liệu, xử lý logic kinh doanh, và tạo ra các phản hồi.
● Web Server: Hệ thống Backend thường chạy trên các Web server như Apache

HTTP Server, Nginx, hoặc Microsoft IIS. Web server này nhận yêu cầu từ phía
Client thông qua giao thức HTTP và chuyển tiếp chúng tới ứng dụng Backend.
● Routing và xử lý yêu cầu: Hệ thống Backend sử dụng các cơ chế định tuyến

(routing) để phân định xem yêu cầu từ phía Client sẽ được xử lý bởi những phần tử
nào trong hệ thống. Điều này có thể được thực hiện thông qua các thư viện,
framework hoặc module định tuyến.
● Controller/Handler: Controller hoặc Handler là thành phần chịu trách nhiệm xử

lý yêu cầu từ Client. Nó nhận yêu cầu, trích xuất thông tin cần thiết, gọi các phương
thức và dịch vụ cần thiết để thực hiện logic kinh doanh và trả về kết quả cho Client.
● Xử lý Logic kinh doanh: Backend chứa logic kinh doanh của ứng dụng, bao

gồm xử lý dữ liệu, kiểm tra quyền truy cập, tính toán, và gọi các dịch vụ hoặc hệ
thống khác khi cần thiết.
● Cơ sở dữ liệu: Hệ thống Backend thường tương tác với cơ sở dữ liệu để lưu trữ

và truy vấn dữ liệu. Các hệ quản trị cơ sở dữ liệu phổ biến bao gồm MySQL,
PostgreSQL, MongoDB, hoặc Redis. Backend sẽ sử dụng ngôn ngữ truy vấn (query
language) phù hợp để tương tác với cơ sở dữ liệu.

7
● Các dịch vụ và API: Hệ thống Backend có thể tích hợp với các dịch vụ bên
ngoài hoặc cung cấp các API để cho phép giao tiếp với các hệ thống khác. Điều này
có thể bao gồm các dịch vụ đám mây như Amazon Web Services (AWS), Google
Cloud Platform (GCP), hoặc các API từ bên thứ ba như Facebook, Twitter, hoặc
PayPal.
● Bảo mật: Hệ thống Backend cần có các biện pháp bảo mật như xác thực và xác

nhận quyền truy cập, mã hóa dữ liệu, kiểm tra lỗi và quản lý phiên làm việc.
● Quản lý lỗi và logging: Backend cần có cơ chế quản lý lỗi và ghi log để theo

dõi và gỡ lỗi hệ thống. Điều này giúp nhận diện và khắc phục các vấn đề xảy ra trong
quá trình vận hành.
● Tính mở rộng: Để đáp ứng tải lớn và sự mở rộng của hệ thống, Backend có thể

triển khai các giải pháp như phân tán, cân bằng tải (load balancing), và bộ nhớ cache
để tăng hiệu suất và khả năng mở rộng.
Kiến trúc hệ thống Backend có thể thay đổi tùy thuộc vào yêu cầu và quy mô của ứng
dụng. Tuy nhiên, mô hình Client-Server, xử lý yêu cầu, logic kinh doanh, tương tác
cơ sở dữ liệu và bảo mật là các thành phần cơ bản thường được tìm thấy trong hầu hết
các hệ thống Backend.

4. Cơ sở dữ liệu
a. Mô tả hệ quản trị cơ sở dữ liệu được sử dụng
Cơ sở dữ liệu (Database) là một phần quan trọng trong hệ thống Backend và giúp lưu
trữ, truy xuất và quản lý dữ liệu. MongoDB là một hệ quản trị cơ sở dữ liệu phi quan
hệ (NoSQL) phổ biến, được sử dụng rộng rãi trong các ứng dụng hiện đại. Dưới đây
là mô tả về cơ sở dữ liệu:
● Cơ sở dữ liệu là một tập hợp có tổ chức của dữ liệu được lưu trữ và quản lý

trên một hệ thống máy tính.


● Nhiệm vụ của cơ sở dữ liệu là cung cấp một cách hiệu quả để lưu trữ, truy

xuất, cập nhật và xóa dữ liệu.


● Nó cung cấp các khả năng như bảo mật, sao lưu và phục hồi dữ liệu, kiểm soát

truy cập và xử lý đồng thời để hỗ trợ các ứng dụng và hệ thống phía Backend.
MongoDB là một hệ quản trị cơ sở dữ liệu phi quan hệ (NoSQL) mã nguồn mở. Nó
sử dụng mô hình lưu trữ dựa trên tài liệu (document) thay vì các bảng, hàng và cột
như trong cơ sở dữ liệu quan hệ truyền thống. Dưới đây là mô tả về cơ sở dữ liệu và
MongoDB:
● MongoDB cung cấp tính năng linh hoạt và dễ sử dụng, cho phép truy vấn

mạnh mẽ, cung cấp khả năng tìm kiếm đa điều kiện, đánh chỉ mục và thống kê dữ
liệu.

8
● Dữ liệu trong MongoDB được tổ chức dưới dạng các tài liệu JSON (JavaScript
Object Notation) hoặc BSON (Binary JSON), cho phép lưu trữ dữ liệu có cấu trúc
linh hoạt và có thể mở rộng.
● Nó hỗ trợ khả năng mở rộng ngang, cho phép phân tán dữ liệu trên nhiều máy

chủ để đáp ứng yêu cầu về tải lớn và khả năng mở rộng của ứng dụng.
● MongoDB cũng cung cấp các tính năng bảo mật như xác thực, phân quyền và

mã hóa dữ liệu để bảo vệ dữ liệu quan trọng.


MongoDB có thể được sử dụng trong nhiều trường hợp sử dụng, bao gồm các ứng
dụng web, ứng dụng di động, phân tích dữ liệu, Internet of Things (IoT) và nhiều hơn
nữa. Nó cung cấp một giải pháp linh hoạt và mở rộng, mang lại hiệu suất và tính sẵn
sàng cao cho việc lưu trữ và truy xuất dữ liệu trong hệ thống BackEnd.

b. Cấu trúc cơ sở dữ liệu và các bảng quan trọng


Database: Xã Thông Minh [TEST]
Bảng quan trọng:
● User: chứa thông tin về các người dùng trong hệ thống. Nó bao gồm các
trường như id, thông tin cá nhân, chức vụ, thông tin định danh của người dùng.
● Sentiment: chứa thông tin về các phản ánh được người dùng đăng lên trong quá

trình sử dụng ứng dụng. Nó bao gồm các trường như tiêu đề, nội dung phản ánh, thời
gian đăng bài, thông tin người đăng.
● Survey: chứa thông tin các cuộc khảo sát do quản trị viên dành cho người

dùng. Nó bao gồm các thông tin về nội dung khảo sát, thống kê câu trả lời của người
dùng, thời gian cập nhật khảo sát
● Notification: chứa thông tin các thông báo cho người dùng. Nó bao gồm các

thông tin về tiêu đề và nội dung thông báo, danh sách người nhận thông báo, các tiêu
chí người dùng để gửi thông báo
● Permission: là một khái niệm trong lĩnh vực quản lý truy cập và bảo mật dữ

liệu. Nó xác định các quyền và khả năng mà người dùng hoặc nhóm người dùng có
thể có đối với các tài nguyên, hệ thống hoặc chức năng cụ thể.
● Ward service: chứa thông tin các dịch vụ dành cho mỗi xã. Nó bao gồm các

trường như tên dịch vụ, danh mục, mức độ ưu tiên và thông tin của xã
c. Mô tả quy trình truy vấn và tương tác với cơ sở dữ liệu
Quy trình truy vấn và tương tác với cơ sở dữ liệu MongoDB trong ứng dụng thường
bao gồm các bước sau:

9
●Kết nối với cơ sở dữ liệu: Đầu tiên, ứng dụng cần thiết lập kết nối với cơ sở dữ
liệu MongoDB. Điều này thường được thực hiện bằng cách sử dụng một thư viện
hoặc trình điều khiển MongoDB phù hợp với ngôn ngữ lập trình mà ứng dụng đang
sử dụng.
● Chọn bảng và tạo truy vấn: Sau khi kết nối thành công, ứng dụng sẽ chọn bảng

(collection) cần truy vấn. MongoDB không có khái niệm về bảng, thay vào đó, dữ
liệu được tổ chức trong các tài liệu (documents) trong các bộ sưu tập (collections).
Ứng dụng sẽ tạo các truy vấn để thực hiện các thao tác như tìm kiếm, thêm, cập nhật
hoặc xóa dữ liệu.
● Thực thi truy vấn: Truy vấn được thực thi bằng cách gửi yêu cầu tương ứng

đến cơ sở dữ liệu. MongoDB sử dụng ngôn ngữ truy vấn linh hoạt và mạnh mẽ (ví
dụ: MongoDB Query Language - MQL hoặc các API cụ thể cho ngôn ngữ lập trình).
Truy vấn sẽ được gửi tới cơ sở dữ liệu và MongoDB sẽ trả về kết quả tương ứng.
● Xử lý kết quả: Kết quả trả về từ cơ sở dữ liệu sẽ được ứng dụng xử lý và sử

dụng theo yêu cầu. Kết quả có thể là các tài liệu (documents) được trả về từ truy vấn
tìm kiếm hoặc thông báo về thành công hay thất bại của các thao tác thêm, cập nhật,
xóa.
● Đóng kết nối: Khi hoàn thành các tác vụ truy vấn và tương tác với cơ sở dữ

liệu, ứng dụng nên đóng kết nối với cơ sở dữ liệu MongoDB để giải phóng tài nguyên
và đảm bảo an toàn.
Lưu ý rằng quy trình truy vấn và tương tác với cơ sở dữ liệu MongoDB có thể thay
đổi tùy thuộc vào ngôn ngữ lập trình, thư viện hoặc framework được sử dụng trong
ứng dụng của bạn. Tuy nhiên, các bước chính như kết nối, tạo truy vấn, thực thi và xử
lý kết quả vẫn là các khái niệm cơ bản trong quá trình này. Dưới đây là một số bộ lọc
trong MongoDB:
STT Bộ lọc Mục tiêu
1 $eq Tìm tất cả các giá trị trường dữ liệu bằng với giá trị đã chỉ định.
2 $ne Tìm tất cả các giá trị trường dữ liệu khác với giá trị đã chỉ định.
3 $gt Tìm tất cả các giá trị trường dữ liệu lớn hơn giá trị đã chỉ định.
4 $gte Tìm tất cả các giá trị trường dữ liệu lớn hơn hoặc bằng giá trị đã chỉ định.
5 $lt Tìm tất cả các giá trị trường dữ liệu nhỏ hơn giá trị đã chỉ định.
6 $lte Tìm tất cả các giá trị trường dữ liệu nhỏ hơn hoặc bằng giá trị đã chỉ định.

7 $in Tìm tất cả các giá trị trường dữ liệu nằm trong danh sách các giá trị đã chỉ định.

8 $nin Tìm tất cả các giá trị trường dữ liệu không nằm trong danh sách các giá trị đã chỉ định.

9 $exists Tìm tất cả các tài liệu có trường dữ liệu đã chỉ định tồn tại hoặc không tồn tại.

10 $regex Tìm tất cả các giá trị trường dữ liệu thỏa mãn một biểu thức chính quy.

10
11 $or Tìm tất cả các giá trị trường dữ liệu thỏa mãn ít nhất một trong các điều kiện.

12 $and Tìm tất cả các giá trị trường dữ liệu thỏa mãn tất cả các điều kiện.

13 $not Tìm tất cả các giá trị trường dữ liệu không thoả mãn một biểu thức truy vấn.

14 $nor Tìm tất cả các giá trị trường dữ liệu không thoả mãn bất kỳ điều kiện nào.
15 $type Tìm tất cả các giá trị trường dữ liệu có kiểu dữ liệu nhất định.

16 $size Tìm tất cả các giá trị trường dữ liệu có số lượng phần tử trong mảng bằng với giá trị đã chỉ định.

Tìm tất cả các giá trị trường dữ liệu chứa tất cả các giá trị trong danh sách các giá trị đã chỉ
17 $all
định.

18 $elemMatch Tìm tất cả các giá trị trường dữ liệu trong các mảng thoả mãn một điều kiện phức tạp.

19 $near Tìm tất cả các giá trị trường dữ liệu gần với một vị trí không gian nhất định.

20 $geoWithin Tìm tất cả các giá trị trường dữ liệu nằm trong một vùng không gian nhất định.

21 $geoIntersects Tìm tất cả các giá trị trường dữ liệu giao với một vùng không gian nhất định.

22 $text Tìm tất cả các giá trị trường dữ liệu thông qua một chuỗi tìm kiếm toàn văn.

23 $mod Tìm tất cả các giá trị trường dữ liệu chia hết cho một giá trị nhất định.
24 $regexMatch Tìm tất cả các giá trị trường dữ liệu thoả mãn một biểu thức chính quy.

25 $expr Tìm tất cả các giá trị trường dữ liệu thoả mãn một biểu thức truy vấn tùy chỉnh.

Thực hiện truy vấn liên kết dữ liệu giữa các bảng (collections) trong cơ sở dữ liệu MongoDB
- "from": Đây là tên của bảng (collection) mà bạn muốn liên kết với bảng hiện tại. Nó đại diện
cho bảng mà bạn muốn truy vấn dữ liệu từ đó.
- "localField": Đây là trường trong bảng hiện tại (collection hiện tại) mà bạn muốn sử dụng để
liên kết với trường trong bảng từ (collection từ). Điều này tương đương với trường khóa ngoại
trong truy vấn join.
26 $lookup
- "foreignField": Đây là trường trong bảng từ (collection từ) mà bạn muốn sử dụng để liên kết
với trường trong bảng hiện tại (collection hiện tại). Điều này tương đương với trường khóa
chính trong truy vấn join.
- "as": Đây là tên của trường kết quả trong bảng hiện tại, trong đó dữ liệu từ bảng từ (collection
từ) sẽ được trả về. Trường kết quả này sẽ chứa các bản ghi từ bảng từ tương ứng với bản ghi
trong bảng hiện tại.

11
5. API và giao tiếp với Frontend
a. Khái niệm về API
API là viết tắt của "Application Programming Interface" (giao diện lập trình ứng
dụng). Nó là một tập hợp các quy tắc và giao thức mà cho phép các phần mềm khác
tương tác với nhau. API xác định các phương thức, tham số và cấu trúc dữ liệu cần
thiết để gửi yêu cầu và nhận phản hồi giữa các thành phần phần mềm khác nhau.
API thường được sử dụng để cho phép các ứng dụng, dịch vụ và hệ thống khác nhau
giao tiếp và tương tác với nhau một cách chặt chẽ. Nó cung cấp một cách tiếp cận
tiêu chuẩn hóa để truyền thông tin và thực hiện các hoạt động như truy vấn dữ liệu,
thêm, sửa đổi hoặc xóa dữ liệu, thực hiện các chức năng cụ thể, và nhiều hơn nữa.
API có thể có nhiều dạng như:
● Web APIs: Cung cấp giao diện cho việc tương tác với các dịch vụ web thông

qua giao thức HTTP. Ví dụ phổ biến là RESTful APIs và SOAP APIs.
● Library APIs: Cung cấp tập hợp các hàm và lớp để phục vụ cho việc lập trình

ứng dụng trong một ngôn ngữ cụ thể. Ví dụ, các thư viện JavaScript như React và
jQuery có các API để thao tác với các thành phần và tương tác với DOM.
● Operating System APIs: Cung cấp các chức năng và giao diện để giao tiếp với

hệ điều hành. Ví dụ, Windows API cung cấp các hàm để quản lý tệp tin, cửa sổ,
mạng, v.v.
API đóng vai trò quan trọng trong việc phát triển phần mềm bởi vì chúng cho phép
các thành phần khác nhau trong hệ thống tương tác với nhau một cách chuẩn mực và
dễ dàng. Các nhà phát triển có thể sử dụng API để sử dụng các chức năng và dữ liệu
từ các dịch vụ và thư viện khác, giúp tăng cường tính mở rộng, tái sử dụng và tách rời
trong quá trình phát triển phần mềm.

b. Các bước phát triển


Để phát triển một API, bạn có thể tuân thủ các bước sau đây:
● Xác định yêu cầu: Đầu tiên, xác định mục tiêu của API và các yêu cầu chức

năng và phi chức năng. Điều này bao gồm xác định loại API (ví dụ: RESTful,
GraphQL), các tài nguyên và thao tác mà API sẽ hỗ trợ, và các yêu cầu bảo mật và
hiệu suất.
● Thiết kế cấu trúc dữ liệu: Xác định cấu trúc dữ liệu cho các tài nguyên mà API

sẽ cung cấp. Điều này bao gồm xác định các trường dữ liệu, quan hệ giữa các tài
nguyên và các thao tác có thể thực hiện trên chúng.
● Chọn công nghệ: Chọn công nghệ phù hợp để xây dựng API. Điều này có thể

bao gồm chọn ngôn ngữ lập trình, framework và công cụ hỗ trợ phù hợp với yêu cầu
của bạn.

12
● Thiết kế giao diện API: Thiết kế các endpoint và phương thức cho API của
bạn. Xác định URL và các phương thức HTTP (GET, POST, PUT, DELETE) và các
tham số cần thiết cho mỗi yêu cầu.
● Xây dựng logic xử lý: Xây dựng logic xử lý cho mỗi endpoint API. Điều này

bao gồm việc xử lý yêu cầu từ client, truy xuất và xử lý dữ liệu từ cơ sở dữ liệu hoặc
hệ thống khác, và tạo phản hồi phù hợp.
● Xác thực và bảo mật: Đảm bảo rằng API của bạn có các cơ chế xác thực và bảo

mật phù hợp. Điều này có thể bao gồm việc sử dụng mã thông báo truy cập (access
token), chữ ký số, SSL/TLS, và kiểm tra quyền truy cập.
● Kiểm thử và gỡ lỗi: Tiến hành kiểm thử API để đảm bảo tính hoạt động và độ

tin cậy. Xử lý các lỗi và sự cố có thể xảy ra trong quá trình sử dụng API.
● Tài liệu hóa API: Tạo tài liệu hướng dẫn sử dụng API cho nhà phát triển. Bao

gồm các tài liệu về cách sử dụng API, cú pháp yêu cầu và phản hồi, ví dụ mã, và
hướng dẫn triển khai.
● Triển khai và quản lý: Triển khai API lên môi trường sản xuất và quản lý vận

hành và mở rộng API theo thời gian.


Lưu ý rằng quá trình phát triển API có thể phức tạp và có thể có các bước và yêu cầu
bổ sung tùy thuộc vào phạm vi và độ phức tạp của dự án.

c. Chuẩn giao tiếp và định dạng dữ liệu


Có nhiều chuẩn giao tiếp và định dạng dữ liệu được sử dụng trong việc phát triển
API. Các chuẩn giao tiếp phổ biến như REST, GraphQL,... và Xã thông minh đang sử
dụng chuẩn giao tiếp RESTful API.
RESTful API (Representational State Transfer) là một kiến trúc giao tiếp phổ biến
trong phát triển API, dựa trên các nguyên tắc và tiêu chuẩn của giao thức HTTP.
RESTful API được thiết kế để cung cấp các phương thức truy cập và quản lý tài
nguyên thông qua các URL duy nhất.
Các đặc điểm chính của một RESTful API bao gồm:

13
● Tài nguyên (Resources): Các tài nguyên được xác định bằng các URL duy
nhất. Ví dụ: "/users" để truy cập danh sách người dùng, "/users/1" để truy cập thông
tin người dùng có ID là 1.
● Phương thức HTTP (HTTP methods): RESTful API sử dụng các phương thức

HTTP như GET, POST, PUT và DELETE để thực hiện các hành động trên tài
nguyên. Ví dụ: GET để lấy dữ liệu, POST để tạo bản ghi mới, PUT & PATCH để cập
nhật bản ghi và DELETE để xóa một bản ghi.
● Trạng thái đại diện (Representational State): Dữ liệu của tài nguyên được

truyền dưới dạng định dạng đại diện như JSON hoặc XML. JSON (JavaScript Object
Notation) là một định dạng dữ liệu phổ biến trong RESTful API.
JSON (JavaScript Object Notation) là một định dạng dữ liệu dựa trên cú pháp
JavaScript, được sử dụng rộng rãi trong việc truyền tải và lưu trữ dữ liệu. JSON sử
dụng cú pháp đơn giản và dễ đọc, là một tập hợp các cặp key-value (khóa-giá trị) và
hỗ trợ các kiểu dữ liệu như số, chuỗi, đối tượng và mảng.
JSON được sử dụng rộng rãi trong RESTful API vì tính linh hoạt, khả năng đọc ghi
dễ dàng cho con người và sự hỗ trợ tốt từ nhiều ngôn ngữ lập trình. Nó cho phép
truyền tải dữ liệu giữa client và server một cách hiệu quả và nhẹ nhàng.

6. Xây dựng API từ thiết kế trên Figma


Dựa vào thiết kế figma, chúng ta có thể xác định các trường dữ liệu cần thiết để quản
lý trong cơ sở dữ liệu. Thiết kế figma giúp chúng ta tạo ra một bản mô phỏng giao
diện người dùng chính xác và chi tiết, từ đó ta có thể xác định được các trường dữ
liệu mà ứng dụng cần thu thập và lưu trữ.
Ví dụ API: Thông tin Du lịch - Điểm tham quan: /api/admin/tourist-attraction

14
● Dữ liệu: Tiêu đề, Nội dung, Đường dẫn VR3D, Đường dẫn Google maps,
Danh sách hình ảnh, Trạng thái của bài viết.
● Chức năng: Xem danh sách bản ghi, Xem chi tiết bản ghi, Tạo bản ghi mới,
Sửa chi tiết bản ghi, Xóa bản ghi.

15
Sau khi xác định các trường dữ liệu, công việc tiếp theo là định dạng dữ liệu và xây
dựng truy vấn để quản lý dữ liệu. Quá trình này bao gồm việc xác định kiểu dữ liệu
cho các lớp và đối tượng được thiết kế để đại diện cho các đối tượng thực tế và quản
lý dữ liệu của chúng. Đồng thời, chúng ta cũng cần xác định các phương thức để thực
hiện các hoạt động như tạo, đọc, cập nhật và xóa dữ liệu.

● Create: Đây là hàm dùng để tạo bản ghi mới trong cơ sở dữ liệu

16
● Find: Đây là hàm dùng để lấy ra nhiều bản ghi trong cơ sở dữ liệu

● First: Đây là hàm dùng để tìm bản ghi đầu tiên thỏa mãn 1 số điều kiện

17
● Find&Update: Đây là hàm dùng để cập nhật dữ liệu của một hoặc nhiều bản
ghi.

● Count: Đây là hàm dùng để thống kê dữ liệu các bản ghi trong cơ sở dữ liệu

18
Tiếp theo, Controller là nơi để xử lý logic và quyết định những hành động và dữ liệu
trả về dựa trên các sự kiện, yêu cầu và hành động từ người dùng. Controller này sẽ
lắng nghe và xử lý các yêu cầu được gửi từ giao diện người dùng, đảm bảo rằng các
hoạt động và thay đổi dữ liệu diễn ra đúng theo ý đồ của người dùng.

API CMS Xã Thông Minh => Yêu cầu đăng nhập

● Thêm mới bản ghi


● Cập nhật dữ liệu
● Lấy danh sách
● Xem chi tiết
● Xóa dữ liệu

API Du Lịch => Không yêu cầu đăng nhập

● Danh sách bản ghi


● Xem chi tiết bản ghi

Cuối cùng, việc viết tài liệu API là rất quan trọng để tạo, tài liệu hóa và kiểm thử các
API. Swagger là một công cụ và một chuẩn mô tả API được sử dụng để viết tài liệu.
Nó cung cấp một cách tiêu chuẩn để mô tả các endpoint, thông tin về yêu cầu và phản
hồi, các tham số, các mô hình dữ liệu và các tài nguyên khác liên quan đến API. Tài
liệu API giúp cho việc phát triển ứng dụng và tích hợp với các hệ thống khác trở nên
dễ dàng và hiệu quả hơn.

Mã nguồn: TẠI ĐÂY

7. Xử lý yêu cầu từ Frontend

19
Backend là phần của một hệ thống phần mềm chịu trách nhiệm xử lý logic và tính
toán dữ liệu. Nó là nơi xử lý các yêu cầu từ phía client (giao diện người dùng, ứng
dụng di động, hoặc các hệ thống khác) và trả về kết quả tương ứng. Dưới đây là mô tả
cách Backend thường xử lý logic và tính toán dữ liệu:
● Xử lý yêu cầu (Request Processing): Backend nhận yêu cầu từ phía client

thông qua một giao thức như HTTP. Đầu tiên, nó phân tích yêu cầu để hiểu tài
nguyên hoặc hành động mà client muốn thực hiện. Backend sẽ kiểm tra tính hợp lệ
của yêu cầu, quyền truy cập và các thông tin liên quan khác.
● Truy cập cơ sở dữ liệu (Data Access): Sau khi xác định yêu cầu, Backend

thường cần truy cập cơ sở dữ liệu để lấy hoặc lưu trữ thông tin. Backend sẽ tạo các
truy vấn cần thiết để truy xuất hoặc cập nhật dữ liệu trong cơ sở dữ liệu. Điều này có
thể bao gồm đọc dữ liệu từ bảng, thực hiện các phép lọc hoặc sắp xếp, và thực hiện
các thao tác CRUD (Create, Read, Update, Delete).
● Xử lý Logic (Business Logic): Backend chịu trách nhiệm xử lý logic kinh

doanh của ứng dụng. Điều này có thể bao gồm kiểm tra và xác thực dữ liệu, áp dụng
luật kinh doanh, tính toán và xử lý các quy tắc nghiệp vụ. Backend sẽ sử dụng các
logic và thuật toán phù hợp để xử lý dữ liệu và đưa ra kết quả mong muốn.
● Tính toán dữ liệu (Data Computation): Backend có thể thực hiện các tính toán

phức tạp trên dữ liệu như phân tích số liệu, tính toán thống kê, tính toán đường dẫn,
hoặc xử lý dữ liệu theo cách đặc biệt. Điều này có thể bao gồm sử dụng các thư viện
và công cụ phù hợp để thực hiện các tính toán phức tạp và xử lý dữ liệu số lượng lớn.
● Tạo và trả về phản hồi (Response Generation): Sau khi xử lý logic và tính toán

dữ liệu, Backend sẽ tạo ra phản hồi phù hợp để gửi trả về cho client. Phản hồi có thể
là các đối tượng dữ liệu (JSON, XML) hoặc các mã lỗi (HTTP status code) tương
ứng với kết quả xử lý yêu cầu. Backend cũng có thể định dạng và bổ sung dữ liệu
phụ, chẳng hạn như thêm header, metadata hoặc các tệp đính kèm.
Quá trình xử lý logic và tính toán dữ liệu bên Backend thường phụ thuộc vào ngôn
ngữ lập trình và framework được sử dụng. Go - Gin cung cấp các công cụ và thư viện
hỗ trợ cho việc xây dựng các hệ thống Backend mạnh mẽ và hiệu quả.

8. Bảo mật và xác thực


a. Khái niệm
Bảo mật và xác thực là những khía cạnh quan trọng trong việc phát triển Backend để
đảm bảo tính an toàn và bảo vệ dữ liệu của hệ thống. Dưới đây là một số phương
pháp và công nghệ thường được sử dụng trong việc bảo mật và xác thực ở phía
Backend:

20
● Xác thực người dùng (User Authentication): Để đảm bảo rằng chỉ người dùng
hợp lệ mới có thể truy cập vào hệ thống, Backend thường sử dụng các phương pháp
xác thực người dùng. Điều này có thể bao gồm việc sử dụng mã xác thực (ví dụ: mã
xác thực một lần - OTP), mật khẩu, thông tin đăng nhập (username/email và mật
khẩu), hoặc các phương pháp xác thực bổ sung như OAuth, OpenID Connect.
● Quản lý phiên (Session Management): Backend thường sử dụng phiên

(session) để theo dõi trạng thái xác thực của người dùng sau khi họ đăng nhập. Mỗi
phiên được gắn với một người dùng và chứa các thông tin như ID người dùng, thời
gian hết hạn, dữ liệu phiên. Backend sẽ kiểm tra và cập nhật phiên để xác thực người
dùng và giới hạn truy cập vào các tài nguyên.
● Phân quyền và kiểm soát truy cập (Authorization and Access Control):

Backend sử dụng phân quyền và kiểm soát truy cập để quản lý quyền truy cập của
người dùng đến các tài nguyên và chức năng trong hệ thống. Điều này đảm bảo rằng
người dùng chỉ có thể truy cập và thực hiện các hành động phù hợp với vai trò và
quyền hạn của họ. Backend thường sử dụng các cơ chế như RBAC (Role-Based
Access Control) hoặc ABAC (Attribute-Based Access Control) để xác định và thực
hiện quyền truy cập.
● Mã hóa và bảo vệ dữ liệu (Data Encryption and Protection): Backend sử dụng

mã hóa để bảo vệ dữ liệu quan trọng khi lưu trữ hoặc truyền tải qua mạng. Nó bao
gồm việc sử dụng các thuật toán mã hóa như AES (Advanced Encryption Standard)
để mã hóa dữ liệu nhạy cảm như mật khẩu, thông tin cá nhân. Backend cũng cần tuân
thủ các phương pháp bảo vệ dữ liệu như không lưu trữ thông tin đăng nhập dưới dạng
văn bản thô, bảo vệ chống tấn công CSRF (Cross-Site Request Forgery) và XSS
(Cross-Site Scripting).
● Giám sát và ghi nhật ký (Monitoring and Logging): Backend cần có hệ thống

giám sát và ghi nhật ký để theo dõi các hoạt động và sự kiện xảy ra trong hệ thống.
Điều này giúp phát hiện và phản ứng nhanh chóng đối với các hoạt động đáng ngờ
hoặc tấn công. Backend thường ghi lại các sự kiện như yêu cầu từ client, lỗi, cảnh
báo, và các hoạt động quan trọng khác để phân tích và điều tra khi cần thiết.
Các phương pháp và công nghệ bảo mật và xác thực ở phía Backend có thể thay đổi
tùy thuộc vào yêu cầu của hệ thống và môhình triển khai. Điều quan trọng là đảm bảo
rằng các biện pháp bảo mật được triển khai một cách chặt chẽ và liên tục được kiểm
tra và cập nhật để đối phó với các mối đe dọa bảo mật mới.

b. Các thư viện được sử dụng trong Golang

21
Khi xây dựng một ứng dụng Backend bằng ngôn ngữ Go với framework Gin Gonic,
có một số thư viện bảo mật phổ biến được sử dụng để bảo vệ ứng dụng và dữ liệu của
bạn. Dưới đây là một số thư viện phổ biến trong cộng đồng Go được tin dùng:
● jwt-go: jwt-go là một thư viện JSON Web Token (JWT) cho Go. Nó cho phép

bạn tạo, xác thực và xử lý JWT trong ứng dụng của bạn. JWT được sử dụng để xác
thực và ủy quyền người dùng trong các tác vụ như xác thực API hoặc các hoạt động
đăng nhập.
● gorilla/csrf: Thư viện gorilla/csrf cung cấp tính năng chống tấn công Cross-Site

Request Forgery (CSRF). Nó giúp bảo vệ ứng dụng của bạn khỏi các cuộc tấn công
CSRF bằng cách tạo và xác thực mã CSRF token trên các yêu cầu.
● go.crypto/securecookie: Thư viện go.crypto/securecookie cung cấp chức năng

mã hóa và giải mã cookie an toàn. Nó giúp đảm bảo rằng dữ liệu trong cookie không
thể bị đánh cắp hoặc sửa đổi bởi bên thứ ba.
● go.crypto/bcrypt: là một phiên bản của bcrypt đã được port sang Go. Nó cung

cấp các hàm để mã hóa và kiểm tra mật khẩu sử dụng bcrypt.
● gin-contrib/sessions: Thư viện này cung cấp hỗ trợ cho việc quản lý phiên

(session) trong Gin Gonic. Nó cho phép bạn lưu trữ và truy xuất dữ liệu phiên từ
phiên bản Gin Gonic.
9. Quản lý lỗi và ghi nhật ký
Quản lý lỗi và ghi nhật ký là một phần quan trọng trong việc xây dựng một ứng dụng
Backend. Dưới đây là một số cách thường được sử dụng để quản lý lỗi và ghi nhật ký
trong Backend:
● Xử lý lỗi và trả về mã lỗi: Trước tiên, bạn nên xác định các điều kiện lỗi có thể

xảy ra trong ứng dụng của bạn và xử lý chúng một cách thích hợp. Khi xảy ra lỗi, hãy
đảm bảo trả về mã lỗi phù hợp và thông báo chi tiết để người dùng hoặc các thành
phần khác của hệ thống có thể hiểu vấn đề.
● Ghi nhật ký (Logging): Sử dụng hệ thống ghi nhật ký cho phép bạn ghi lại các

sự kiện quan trọng, lỗi và thông tin hữu ích trong quá trình chạy ứng dụng. Các thông
tin ghi nhật ký có thể bao gồm thời gian, mức độ lỗi, thông tin yêu cầu, thông tin
người dùng, v.v. Thư viện ghi nhật ký phổ biến trong Go bao gồm logrus, zap và go-
logging.
● Xử lý lỗi middleware: Middleware là một phần quan trọng của framework

Backend như Gin Gonic. Bạn có thể triển khai middleware để xử lý các lỗi chung
trong ứng dụng của bạn, ví dụ: middleware để xử lý lỗi 404 (không tìm thấy),
middleware để xử lý lỗi ngoại lệ, middleware để ghi nhật ký, v.v.

22
● Quản lý lỗi tập trung: Sử dụng các dịch vụ quản lý lỗi tập trung như Sentry
hoặc Rollbar, bạn có thể gửi các báo cáo lỗi tự động, thông tin ghi nhật ký và thông
tin khắc phục lỗi đến một nơi tập trung. Điều này giúp bạn theo dõi và phân tích lỗi
một cách hiệu quả và nhanh chóng.
● Kiểm tra và gỡ lỗi: Đảm bảo triển khai các bộ kiểm tra tự động và gỡ lỗi trong

quá trình phát triển và triển khai ứng dụng. Sử dụng các công cụ như unit testing,
integration testing, và công cụ gỡ lỗi như debugger để phát hiện và sửa lỗi một cách
nhanh chóng.
Tùy thuộc vào yêu cầu và quy mô của dự án, bạn có thể chọn áp dụng một hoặc nhiều
phương pháp trên để quản lý lỗi và ghi nhật ký trong Backend của bạn.

10. Hiệu suất và tối ưu hóa


a. Các biện pháp tối ưu hóa hiệu suất của BackEnd
● Cải thiện cấu trúc dữ liệu: Sử dụng cấu trúc dữ liệu hiệu quả và tối ưu để đảm
bảo tốc độ truy cập và thao tác nhanh chóng. Ví dụ, sử dụng cấu trúc bảng băm (hash
table) thay vì danh sách tuyến tính (linear list) để tìm kiếm và truy xuất dữ liệu nhanh
hơn.
● Tối ưu các truy vấn cơ sở dữ liệu: Đảm bảo các truy vấn cơ sở dữ liệu được tối

ưu hóa để truy xuất dữ liệu một cách hiệu quả. Sử dụng chỉ mục (indexing), tối ưu
hóa câu lệnh SQL, và sử dụng các kỹ thuật như lazy loading hoặc eager loading để
giảm thiểu số lượng truy vấn và tải dữ liệu cần thiết.
● Caching: Sử dụng cơ chế caching để lưu trữ dữ liệu tạm thời và tái sử dụng khi

có các yêu cầu tương tự. Sử dụng bộ nhớ cache như Redis hoặc Memcached để giảm
thời gian truy vấn cơ sở dữ liệu và tăng tốc độ phản hồi.
● Tối ưu mã nguồn: Xem xét và cải thiện mã nguồn của ứng dụng để loại bỏ

những phần không cần thiết, tối ưu hóa thuật toán và sử dụng các kỹ thuật như lazy
loading, stream processing để tăng hiệu suất và giảm tải cho Backend.
● Scale-out và load balancing: Sử dụng công nghệ scale-out để mở rộng hệ thống

Backend bằng cách thêm nhiều máy chủ, vi xử lý hoặc bộ nhớ. Sử dụng load
balancing để phân phối công việc và tải cân bằng giữa các máy chủ, đảm bảo sự ổn
định và khả năng mở rộng của hệ thống.
b. Các công cụ và kỹ thuật để đo lường và nâng cao hiệu suất
● Apache JMeter: Đây là một công cụ mã nguồn mở cho phép bạn kiểm tra và đo
lường hiệu suất ứng dụng Backend. Bạn có thể tạo các kịch bản kiểm tra, tạo tải giả
lập và thu thập dữ liệu hiệu suất để phân tích và tối ưu hóa hiệu suất.

23
● Load balancer: Sử dụng load balancer như Nginx hoặc HAProxy để phân phối
tải và cân bằng tải giữa các máy chủ Backend. Điều này giúp tăng khả năng chịu tải
của hệ thống và đảm bảo rằng không có máy chủ nào bị quá tải khi có lượng người
dùng lớn truy cập vào hệ thống.
● Giám sát hệ thống: Sử dụng các công cụ giám sát hệ thống như Prometheus,

Grafana hoặc Zabbix để theo dõi các thông số hiệu suất của hệ thống Backend như tải
CPU, bộ nhớ, I/O, số lượng kết nối, v.v. Điều này giúp bạn phát hiện và giải quyết
các vấn đề hiệu suất kịp thời.
● Tối ưu hóa cơ sở dữ liệu: Sử dụng công cụ như EXPLAIN để phân tích kế

hoạch truy vấn của cơ sở dữ liệu và tối ưu hóa các truy vấn. Đảm bảo các chỉ mục
(index) được tạo đúng cách và sử dụng các kỹ thuật như sử dụng bộ nhớ đệm
(caching), tối ưu hóa cấu trúc dữ liệu và phân tán dữ liệu để tăng hiệu suất.
● Continuous Integration và Deployment (CI/CD): Sử dụng quy trình CI/CD để

tự động hóa việc triển khai và kiểm tra hiệu suất của ứng dụng Backend. Điều này
giúp bạn phát hiện và giải quyết các vấn đề hiệu suất sớm trong quá trình phát triển
và triển khai.
11. Quản lý phiên và trạng thái
a. Cách BackEnd quản lý phiên làm việc của người dùng
Quản lý phiên là quá trình theo dõi và duy trì thông tin liên quan đến phiên làm việc
của người dùng trên một trang web. Backend có thể sử dụng Session để lưu trữ thông
tin phiên trên máy chủ. Một ID phiên được tạo và gửi cho trình duyệt của người dùng
thông qua cookie hoặc URL rewriting. Backend sẽ lưu trữ thông tin phiên được liên
kết với ID phiên này trên máy chủ và sử dụng nó để duy trì trạng thái phiên cho
người dùng.
Backend có thể lưu trữ thông tin phiên trong cơ sở dữ liệu. Mỗi phiên làm việc được
gán một ID duy nhất và các thông tin phiên được lưu trữ trong bảng hoặc tập tin cơ
sở dữ liệu. Backend sẽ sử dụng ID phiên để truy xuất và cập nhật thông tin phiên liên
quan.

b. Cách lưu trữ và truy xuất trạng thái ứng dụng


Backend có thể lưu trữ và truy xuất trạng thái ứng dụng theo các phương pháp sau:
● Lưu trữ trạng thái trong bộ nhớ: Backend có thể lưu trữ trạng thái ứng dụng

trong bộ nhớ của máy chủ. Điều này thường được sử dụng cho các ứng dụng nhỏ và
đơn giản. Tuy nhiên, nếu máy chủ khởi động lại hoặc có nhiều máy chủ, trạng thái
ứng dụng sẽ bị mất.

24
● Lưu trữ trạng thái trong cơ sở dữ liệu: Backend có thể lưu trữ trạng thái ứng
dụng trong cơ sở dữ liệu. Điều này đảm bảo rằng trạng thái ứng dụng không bị mất
khi máy chủ khởi động lại hoặc khi có nhiều máy chủ. Cơ sở dữ liệu có thể là SQL
hoặc NoSQL, tùy thuộc vào yêu cầu của ứng dụng.
● Sử dụng bộ nhớ cache: Backend có thể sử dụng bộ nhớ cache như Redis hoặc

Memcached để lưu trữ và truy xuất trạng thái ứng dụng. Bộ nhớ cache nhanh chóng
và hỗ trợ lưu trữ dữ liệu tạm thời. Điều này giúp giảm tải cho cơsở dữ liệu chính và
cung cấp truy xuất nhanh hơn cho trạng thái ứng dụng.
● Sử dụng phiên HTTP: Backend có thể sử dụng phiên HTTP để lưu trữ thông

tin trạng thái ứng dụng. Thông tin trạng thái được lưu trữ trên máy chủ và liên kết với
ID phiên được gửi đến từ trình duyệt của người dùng. Backend sử dụng ID phiên để
truy xuất và cập nhật thông tin trạng thái liên quan.
Cách lưu trữ và truy xuất trạng thái ứng dụng phụ thuộc vào tính chất và yêu cầu của
ứng dụng. Cần xem xét các yếu tố như quy mô ứng dụng, hiệu suất, đồng bộ hóa và
khả năng mở rộng để chọn phương pháp lưu trữ và truy xuất phù hợp.

12. Vấn đề mở rộng và mở rộng quy mô


a. Các vấn đề liên quan đến mở rộng quy mô của BackEnd
Khi xây dựng một hệ thống Backend, có một số vấn đề cần xem xét liên quan đến mở
rộng quy mô, bao gồm:
● Hiệu suất: Mở rộng quy mô có thể gặp vấn đề về hiệu suất khi lưu lượng truy

cập tăng lên. Backend cần được thiết kế sao cho có khả năng xử lý và phản hồi nhanh
chóng đối với số lượng lớn yêu cầu từ người dùng.
● Tài nguyên hệ thống: Khi mở rộng quy mô, Backend cần có khả năng sử dụng

tài nguyên hệ thống một cách hiệu quả. Điều này bao gồm quản lý bộ nhớ, CPU và
lưu trữ sao cho tối ưu và tránh tình trạng quá tải.
● Đồng bộ hóa dữ liệu: Khi có nhiều phiên bản của Backend đang chạy song

song để xử lý tải lớn, cần đảm bảo tính nhất quán và đồng bộ hóa dữ liệu giữa các
phiên bản. Điều này đặc biệt quan trọng khi có các hoạt động ghi dữ liệu.
● Quản lý phiên và trạng thái: Khi mở rộng quy mô, quản lý phiên và trạng thái

của người dùng trên các phiên bản Backend khác nhau trở nên phức tạp. Cần xem xét
các phương pháp hiệu quả để đồng bộ hóa và quản lý phiên và trạng thái giữa các
phiên bản.
b. Cách thiết kế để hỗ trợ mở rộng và tăng quy mô
Để hỗ trợ mở rộng và tăng quy mô, Backend có thể được thiết kế theo các nguyên tắc
sau:

25
● Phân tách chức năng: Backend nên được phân tách thành các thành phần nhỏ,
độc lập và có khả năng mở rộng riêng biệt. Điều này cho phép mỗi thành phần được
mở rộng độc lập mà không ảnh hưởng đến các thành phần khác.
● Khả năng mở rộng ngang: Backend nên được thiết kế để có thể mở rộng ngang

bằng cách thêm các phiên bản mới. Thay vì tăng cường tài nguyên cho một phiên bản
duy nhất, mở rộng ngang cho phép chia tải công việc và tăng khả năng xử lý bằng
cách thêm nhiều phiên bản Backend.
● Cân bằng tải: Backend nên có khả năng cân bằng tải giữa các phiên bản. Có thể

sử dụng các công nghệ như load balancer để phân phối yêu cầu từ người dùng đến
các phiên bản Backend khác nhau, đảm bảo rằng tải được phân chia đồng đều và
tránh tình trạng quá tải.
● Cơ sở dữ liệu phân tán: Nếu Backend sử dụng cơ sở dữ liệu, có thể xem xét

việc sử dụng cơ sở dữ liệu phân tán để hỗ trợ mở rộng và tăng quy mô. Cơ sở dữ liệu
phân tán cho phép dữ liệu được phân chia và lưu trữ trên nhiều nút, giúp giảm tải cho
một nút duy nhất và cải thiện khả năng mở rộng.
● Caching: Sử dụng bộ nhớ cache để lưu trữ dữ liệu tạm thời có thể giúp cải

thiện hiệu suất và giảm tải cho Backend. Caching giúp giảm số lượng truy vấn vào cơ
sở dữ liệu và cung cấp truy xuất nhanh hơn cho dữ liệu phổ biến.
● Giám sát và điều chỉnh: Để hỗ trợ mở rộng và tăng quy mô, Backend cần được

giám sát và điều chỉnh một cách liên tục. Theo dõi hiệu suất, tài nguyên và các chỉ số
quan trọng khác giúp xác định khi nào cần mở rộng và điều chỉnh hệ thống.
● Hệ thống có khả năng phục hồi: Mở rộng và tăng quy mô có thể đặt ra rủi ro về

sự cố và mất dữ liệu. Backend nên có khả năng phục hồi để xử lý các sự cố và đảm
bảo an toàn dữ liệu.
● Kiến trúc dựa trên dịch vụ: Thiết kế Backend theo kiến trúc dựa trên dịch vụ

(microservices) có thể hỗ trợ mở rộng và tăng quy mô. Kiến trúc này cho phép phát
triển và triển khai các dịch vụ độc lập nhau, giúp mở rộng và cập nhật từng dịch vụ
một cách độc lập.
Các nguyên tắc và phương pháp thiết kế trên giúp Backend hỗ trợ mở rộng và tăng
quy mô một cách linh hoạt và hiệu quả. Tuy nhiên, mỗi ứng dụng có yêu cầu và quy
mô riêng, vì vậy cần xem xét và tùy chỉnh thiết kế dựa trên yêu cầu cụ thể của dự án.

13. Các công cụ hỗ trợ


a. Các công cụ đang sử dụng
● Server: Docker, Docker Swarm, Swarmpit
● Nền tảng quản lý mã nguồn: Gitlab
● Môi trường phát triển tích hợp (IDE): Goland, Visual Studio Code

26
● Công cụ quản lý cơ sở dữ liệu: Navicat, MongoDB Compass, Table Plus
● Giám sát và hiển thị dữ liệu hệ thống: Prometheus, Grafana
● Kiểm thử đổ tải: Apache JMeter
b. Cách cài đặt môi trường
● Cài đặt Docker: Install Docker Desktop on Windows | Docker Docs
● Cài đặt Redis:
○ docker run --name redis-container -p 6379:6379 -d redis
● Cài đặt Golang: Download and install - The Go Programming Language
● Cài đặt môi trường phát triển:
○ Goland (Trả phí): Download GoLand: A Go IDE
○ Visual Studio Code (Miễn phí): Download Visual Studio Code - Download
● Cài đặt Git: Git - Downloads (git-scm.com)
● Cài đặt công cụ quản lý cơ sở dữ liệu:
○ Navicat (Trả phí): Navicat Premium | GUI Download
○ Table Plus (Trả phí): TablePlus | Tool for Database Management
○ MongoDB Compass (Miễn phí): MongoDB Compass Download (GUI)
● Cài đặt Postman: Download Postman | Get Started for Free
● Sao chép mã nguồn về máy:
○ Đăng nhập vào tài khoản Gitlab
○ Tải mã nguồn về máy: git clone “đường_dẫn_thư_mục_git”
● Cài đặt các thư viện cần thiết:
○ go mod tidy
○ go mod vendor
○ go get github.com/pilu/fresh hoặc go install
github.com/cosmtrek/air@latest
● Chạy mã nguồn:
○ fresh hoặc air
● Build docker image:
○ Mở terminal và chạy ./deploy.sh

27
14. Phụ lục hình ảnh mã nguồn

Logic đọc chi tiết bản ghi

28
Logic tạo bản ghi mới

29
Logic lấy danh sách bản ghi

30
Logic xóa bản ghi

31
Logic cập nhật bản ghi

Định danh URI cho api CMS

32
Định danh URI cho api Web du lịch

33
Tài liệu API cho Web Du lịch - 1

Tài liệu API cho Web Du lịch - 2

34
Tài liệu API cho CMS - 1

35
Tài liệu API cho CMS - 2

36
Tài liệu API cho CMS - 3

37
Tài liệu API cho CMS - 4

38
Tài liệu API cho CMS - 5

39

You might also like