Dự án này cung cấp một hệ thống backend sử dụng ExpressJS và Prisma ORM. Nó được thiết kế để tách biệt xử lý logic giữa các thành phần khác nhau trong hệ thống (API, worker, socket, message queue, v.v.) nhằm đảm bảo tính module và dễ bảo trì.
- API: Xử lý logic API và trả về phản hồi cho người dùng.
- Worker: Xử lý các tác vụ nền và tính toán nặng.
- Thành phần khác: Các thành phần bổ sung như socket, message queue, v.v., được quản lý riêng biệt.
- Common: Xử lý các tác vụ chung của các thành phần khác (business logic, adapter,... và những tài nguyên dùng để phục vụ chính trong
common
). - Config: Chứa các thành phần khai báo const của các đối tượng và data fix cứng trong hệ thống.
- Event và Job Sẽ được khai báo và đăng ký và khai báo thông qua các thành phần liên quan.
Toàn bộ logic nghiệp vụ được xử lý trong thư mục common
và services
bên trong common
, tránh phụ thuộc chéo giữa các thành phần khác nhau trong hệ thống.
Dự án này tuân theo cách tiếp cận lập trình theo module, trong đó entity được quản lý và xử lý trong một module riêng biệt, đảm bảo tính mở rộng và dễ bảo trì.
VD: module của đối tượng auth
chỉ xử lý liên quan đến API sẽ quy vào cùng một folder auth (route, controller, validator), các logic liên quan đến xử lý chung giữa các thành phần cũng sẽ quy về một folder auth
trong common (service, event)
Các message được trả về sẽ được dịch tự động qua 2 ngôn ngữ là Anh và Việt theo request của user theo config trong i18.middleware và response.middleware. VD: máy client có ngôn ngữ là tiếng Việt thì message từ mỗi response sẽ trả về tiếng Việt và ngược lại.
Để đảm bảo khả năng tái sử dụng và bảo trì các tác vụ phụ (side effects), dự án này sử dụng lập trình hướng sự kiện với Node.js
EventEmitter
.
Link tham khảo
Dễ dàng triển khai triến lược multiple entrypoint khi cần scale hệ thống. Đối với các hệ thống tải lớn có khả năng mở rộng CPU với nhiều core và đa luồng có thể xử lý tách các tác vụ ra thành các entrypoint để quản lý các process ra riêng biệt và tận dụng được khả năng đa luồng của CPU.
Link tham khảo
- Tách biệt logic: Logic nghiệp vụ và các tác vụ phụ (ghi log, thông báo, cập nhật cache,... ) được xử lý riêng biệt.
- Tái sử dụng tốt hơn: Nhiều module có thể lắng nghe cùng một sự kiện mà không cần chỉnh sửa logic cốt lõi.
- Dễ mở rộng: Có thể thêm các bộ xử lý sự kiện mới mà không cần thay đổi mã nguồn hiện có.
- Cải thiện tốc độ phản hồi sau mỗi request: Các side effect được tách biệt và xử lý bất đồng bộ sẽ làm giảm thời gian phản hồi của app
yarn dev
Chạy dự án với môi trường devyarn build
Build project vào thư mục dist. Thường sẽ chạy build trước khi đẩy lên main để đảm bảo build trên github action không xảy ra lỗiyarn format
Format toàn bộ source trong dự ányarn clean
Tương tự như câu lệnhrm -rf
trên Unix/Linux dùng để clean dữ liệu trong thư mục distyarn start
Chạy ứng dụng trong thư mục dist (production)
yarn prisma:push
Để đồng bộ schema với database hiện tại sau khi thay đổi về dbyarn prisma:gen
Generate schemayarn prisma:mig
Tạo vào áp dụng migrationyarn prisma:seed
Để khởi tạo dữ liệu mẫu từ file seed.tsyarn prisma:reset
Để xóa toàn bộ dữ liệu trong database