Xin chào các bạn, tiếp nối chủ đề lập trình bất đồng bộ trong Python.
Trong part 6 của serie ngày hôm nay, mình xin được giới thiệu tới mọi người về Celery.
Một thư viện mạnh mẽ được sử dụng để quản lý, chạy các tác vụ bất đồng bộ và hàng đợi tin nhắn trong ứng dụng Python.
Ok mình cùng bắt đầu thôi.
1. Tổng quan về Celery
Khi phát triển các ứng dụng Python web, phần lớn thời gian chúng ta sẽ xử lý với các vụ yêu cầu kết quả ngay lập tức (các task vụ đồng bộ). Chẳng hạn như tìm thông tin mà cô gái mà bạn thích, số dư tài khoản ngân hàng, etc. Bên cạnh đó cũng có rất nhiều task vụ không cần yêu cầu trả về kết quả ngay, đây là các task vụ bất đồng bộ (asynchronous task) ví dụ như gửi email thông báo tới người dùng, export file, etc.
Đối với các task vụ bất đồng bộ thế này, người dùng không cần thiết phải đợi tới khi task vụ đó hoàn thành. Ý tưởng để giải quyết bài toán này đó là chúng ta sẽ đưa ra một nơi khác để thực thi nhằm tránh block luồng chính, tăng khả năng đáp ứng của ứng dụng.
Ở các task vụ đơn giản để cải thiện hiệu suất chúng ta có thể đưa task vụ đó ra backgroud thread để xử lý. Nhưng nếu số lượng requests nhiều và lỗi xảy ra trong quá trình thực thi task thì làm sao để quản lý hiệu quả. Tệ hơn là bạn có thể sẽ chịu ảnh hưởng GIL (Global Interpreter Lock) chỉ cho phép 1 thread thực thi tại một thời điểm.
Một giải pháp thay thế là sử dụng task queue để cung cấp khả năng xử lý độc lập với server. Lúc này cũng chính là lúc Celery bước vào cuộc chơi . Celery thường được sử dụng cho các tác vụ có async không yêu cầu kết quả ngay lập tức hoặc được sử để chạy các tác vụ định kỳ (scheduled tasks).
Minh họa một hệ thống FastAPI sử dụng Celery để quản lý task queue với Redis đóng vai trò là message broker và là nơi store backend result.
2. Tính năng chính
- Xử lý tác vụ bất đồng bộ: Celery cho phép thực hiện các tác vụ mà không cần chờ đợi chúng hoàn thành, giúp cải thiện hiệu suất của ứng dụng.
- Hàng đợi tác vụ: Celery quản lý các hàng đợi tin nhắn (message queue) và điều phối việc thực thi các tác vụ cho các worker từ các hàng đợi này.
- Scheduled tasks: Celery hỗ trợ chạy các tác vụ định kỳ, tương tự như cron jobs. Với Celery Beat bạn có thể lập lịch cho task vụ chạy định kỳ trong một khoảng thời gian xác định. Chẳng hạn như tự động gửi tin nhắn chúc ngủ ngon cho người thương lúc 10 pm tối.
- Khả năng mở rộng: Celery có thể mở rộng dễ dàng mở rộng theo chiều ngang bằng cách tăng số lượng worker để xử lý các tác vụ song song.
- Retry và quản lý lỗi: Khi một tác vụ thất bại, Celery có khả năng tự động retry tác vụ đó hoặc retry theo như cấu hình được chỉ định.
3. Cấu trúc chính của Celery
- Workers: Đây là các process chịu trách nhiệm lấy và thực thi các tác vụ từ hàng đợi.
- Broker: Đứng giữa ứng dụng và worker là các message broker. Thành phần chịu trách nhiệm quản lý hàng đợi tin nhắn (message queue). Các broker phổ biến nhất được sử dụng là Redis hoặc RabbitMQ, Amazon SQS. Celery sử dụng các broker này để gửi các tác vụ đến worker xử lý.
- Task: Đơn vị thực thi công việc trong Celery được gọi là task. Task sẽ được các phân phối vào các worker để xử lý.
- Backend Result: Nơi được sử dụng để lưu trữ kết quả của các task khi hoàn thành trong các Database như Redis, Postgres, etc.
Celery là hệ thống quản lý task vụ phổ biến trong Python. Dễ dàng tích hợp với các web framework như Django, Flask, FastAPI để tạo ra một ứng dụng web hiệu năng cao. Ngoài ra, chúng ta có thể sử dụng Flower một công cụ để giám sát và quản lý các worker, task vụ Celery một cách trực quan qua giao diện web.
4. Tổng kết
Trên đây là phần giới thiệu tổng quan nhất về Celery và những ứng dụng của nó trong phát triển các ứng dụng bất đồng bộ trong Python.
Hi vọng bạn đọc sẽ nhận được các thông tin hữu ích.
Again, mình là Phan một chàng developer tò mò và tận tâm.
Hẹn gặp các bạn trong những bài viết sắp tới.