Build Microservices với Django

Microservices architecture (thường được viết tắt là Microservices) cho phép chia nhỏ một ứng dụng lớn thành các phần độc lập nhỏ hơn, trong đó mỗi phần giữ một vai trò riêng. Để đáp ứng một request của người dùng, ứng dụng dựa trên microservices (microservices-based application) có thể gọi tới nhiều microservices bên trong để phản hồi.

Kiến trúc Microservices là gì?

Kiến trúc microservices là một loại kiến trúc ứng dụng trong đó ứng dụng được phát triển dưới dạng một tập hợp các dịch vụ (services). Nó cung cấp Framework để phát triển, triển khai, duy trì các sơ đồ và dịch vụ kiến trúc microservices một cách độc lập. Trong kiến trúc microservices, mỗi microservice là một dịch vụ duy nhất được xây dựng để đáp ứng một tính năng của ứng dụng và xử lý các tác vụ riêng biệt.

Lợi ích của kiến trúc Microservices so với kiến trúc Monolithic

Đối với kiến trúc Monolithic, một server lớn sẽ chịu trách nhiệm xử lý tất cả các request từ người dùng. Một vài tác vụ nặng được truy cập thường xuyên sẽ yêu cầu nhiều tài nguyên để xử lý, tuy nhiên cũng sẽ có các dịch vụ truy cập ít tài nguyên và ít thường xuyên, điều này dẫn đến vấn đề khó khăn cho việc scale khi triển khai hệ thống.

Kiến trúc Microservices được xây dựng dưới dạng các service nhỏ độc lập xử lý các tác vụ riêng biệt. Do đó, khi một service có nhiều requests và cần dùng nhiều tài nguyên hơn thì chúng ta chỉ cần scale up đúng service đó, các service khác vẫn sẽ được giữ ở mức sử dụng hợp lý. Điều này giúp giảm đáng kể các chi phí khi triển khai hệ thống, đồng thời các service riêng lẻ có thể được tái sử dụng ở các project khác một cách nhanh chóng.
Lợi ích của kiến trúc microservices:

  • Các service tồn tại độc lập với nhau: các service được triển khai và hoạt động độc lập, do đó 1 service nào đó chết sẽ không kéo theo các service khác. Đồng thời có thể tái sử dụng các service ở project khác một cách nhanh chóng.
  • Các service có thể được scale độc lập: tùy theo nhu cầu sử dụng của hệ thống mà có thể scale riêng service đó trong khi vẫn giữ nguyên các service khác.
  • Source code gọn hơn: do hệ thống lúc này đã được triển khai dưới dạng các service nhỏ, mỗi service chỉ tập trung vào một hoặc một vài nghiệp vụ chính do đó source code lúc này đơn giản và gọn hơn.

microservices-vs-monolithic

Django là gì?

Django là một framework web Python bậc cao miễn phí và mã nguồn mở được viết bằng ngôn ngữ Python.
Các ưu điểm của Django có thể kể đến như:

  • Tốc độ phát triển: Framework Django được tổ chức tốt, dễ dàng cài đặt và học hỏi, do đó có thể sử dụng được chỉ trong vài giờ tìm hiểu. Các nhà thiết kế Django đã phát triển framework để có thể dễ dàng triển khai trên bất kì kiến trúc web nào bằng code.
  • Tối ưu chi phí: Django là một project miễn phí mã nguồn mở viết bằng Python Một tổ chức phi lợi nhuận có tên là Django Software Foundation hỗ trợ, khuyến khích sử dụng và bảo trì Django. Họ tổ chức các cuộc gặp gỡ, họp mặt và các sự kiện cộng dồng thường xuyên để khuyến khích các nhà phát triển review và đóng góp cho dự án Django. Kết quả là một framework web chất lượng cao, giàu tính năng được sử dụng miễn phí.
  • Phổ biến: Hàng ngàn dự án mã nguồn mở và các trang web nổi tiếng sử dụng Django như: Pinterest, Instagram, Mozilla Firefox,… Vì tính phổ biến của nó nên framework này tiếp tục được phát triển và có nền tảng hỗ trợ mạnh mẽ.

Django quản lý code cho hệ thống request và response bằng cách sử dụng kiến trúc ModelViewTemplate (MVT).

  • Model: Django Model đóng vai trò như là interface giữa database và server code. Chúng là nguồn thông tin duy nhất và chính xác về dữ liệu của bạn. Những data models này chứa các field và operator cần thiết mà bạn cần để tương tác với database. Django Model chuyển đổi các bảng trong cơ sở dữ liệu thành các Class hoặc Object trong Python. Điều này được gọi là ánh xạ đối tượng-quan hệ (object-relational mapping). Mỗi model ánh xạ đến một database table duy nhất và có các thuộc tính đại diện cho các field dữ liệu.
  • View: Django View xử lý request bằng cách sử dụng các model. Chúng ta có thể viết một view function cho mỗi loại request mà khách truy cập website có thể thực hiện trên website. View function có thể nhận request làm input và trả về response (có thể là mã lỗi, ảnh, file hoặc bất kì kiểu dữ liệu nào). Django có một trình ánh xạ URL, hoặc trình điều phối URL, dùng để ánh xạ các view function đến các URL.
  • Template: Django Template quản lý việc trình bày trang web trên trình duyệt. Có thể sử dụng HTML để trình bày template. Django cũng hỗ trợ Django Template Language của riêng mình và một giải pháp thay thế phổ biến có tên là Janja2.

Nhóm phát triển Django đã thiết kế framework web này để sử dụng hiệu quả phần cứng trong hệ thống. Với kiến trúc không chia sẻ (shared-nothing architecture), Django tách biệt các thành phần như tầng cơ sở dữ liệu (models) và tầng ứng dụng (views). Bạn có thể thêm phần cứng vào bất kỳ cấp độ nào mà không ảnh hưởng đến phần còn lại của hệ thống. Bạn có thể thêm nhiều máy chủ cơ sở dữ liệu hoặc máy chủ ứng dụng vào hệ thống của mình, và Django sẽ sử dụng các tài nguyên này một cách hiệu quả để xử lý nhiều lượt truy cập.

Xử lý đa luồng (multi-thread)

Trong Python, multi-thread cho phép bạn chạy đồng thời nhiều thread trong một process duy nhất. Thông thường, một process sẽ luôn bắt đầu với một luồng duy nhất (main thread). Khi cần thiết, một luồng mới có thể được khởi chạy và nhiệm vụ phụ được giao cho nó. Bây giờ hai luồng sẽ làm việc theo cách chồng chéo nhau. Khi nhiệm vụ được giao cho luồng thứ cấp hoàn thành, nó sẽ hợp nhất với luồng chính.

Trong project của chúng tôi, chúng tôi tách module YOLO dùng để detect vật thể thành một microservice, triển khai độc lập và xử lý đa luồng trên service này. Khi xử lý đa luồng, nếu 1 instance YOLO đang detect chưa hoàn tất mà có 1 request khác gọi đến thì sẽ trả về 2 kết quả sai. Do đó, chúng tôi tạo ra 2 mảng (array): mảng 1 chứa các instance của model YOLO, mảng 2 chứa trạng thái của các instance với kích thước mỗi mảng bằng với số luồng tối đa có thể thực thi (max thread).
Khi gọi đến service, hệ thống sẽ kiểm tra xem các instance có đang khả dụng hay không, nếu có sẽ dùng instance đó để detect, đồng thời chuyển trạng thái khả dụng của instance sang False. Nếu không có instance nào khả dụng thì hệ thống sẽ chờ đến khi 1 instance detect hoàn tất và khả dụng trở lại mới tiếp tục.
Khi có nhiều request cùng lúc đến hệ thống, Django sẽ tự động handle và phân bổ hợp lí các request.

Hướng dẫn triển khai

  1. Cài đặt Python 3.8
  2. Clone source code ở cuối bài viết
  3. Vào folder chứa source code, cài đặt các thư viện cần thiết: pip install -r requirements.txt
  4. Tải file weight yolov7.pt của model YOLOv7, sau đó đặt vào theo đúng đường dẫn server/lib/yolov7/yolov7.pt
  5. Chạy file start.bat
  6. Run cell code trong notebook test.ipynb để test

Source code

https://github.com/thigiacmaytinh/Microservice_Django.git