Mở đầu
Y như tiêu đề bài viết, trong bài viết này mình sẽ hướng dẫn mọi người chạy những dịch vụ dạng background worker trên nền tảng Serverless. Mình sẽ lựa chọn Framework mà quen thuộc với đa số mọi người đó chính là Celery (Python) và sử dụng nền tảng serverless "make in Vietnam" là Bizfly Cloud App Engine..
Python Celery là gì?
Dành cho ai chưa quen thuộc lắm với Python Celery
Python Celery là một framework mã nguồn mở được sử dụng để xây dựng các hệ thống xử lý tác vụ bất đồng bộ. Với Celery, bạn có thể thiết kế hệ thống xử lý tác vụ mà không bị giới hạn về thời gian xử lý hay số lượng tác vụ cần thực hiện.
Các lợi ích của việc sử dụng Celery bao gồm:
- Tăng hiệu quả xử lý với khả năng xử lý các tác vụ bất đồng bộ.
- Giảm thiểu thời gian chờ đợi cho người dùng.
- Tăng độ tin cậy của hệ thống bằng cách xử lý tác vụ theo cách phân tán.
- Dễ dàng tích hợp với các framework khác như Django, Flask và Pyramid.
Celery có thể được sử dụng để xử lý các tác vụ nặng, tính toán phức tạp, tương tác với các hệ thống khác, và trong các ứng dụng web hoặc mobile. Ví dụ, Celery có thể được sử dụng để xử lý tác vụ như gửi email đại diện cho người dùng, tạo báo cáo phức tạp, hoặc phân tích dữ liệu lớn.
Với các tính năng mạnh mẽ của nó, Python Celery là một lựa chọn tuyệt vời cho các nhà phát triển muốn xây dựng các hệ thống xử lý tác vụ bất đồng bộ, tăng hiệu quả và độ tin cậy của ứng dụng của mình.
Mô hình
Mô hình hoạt động của Celery sẽ dạng như sau:
Sẽ có các Producer gửi các công việc (Tasks) vào trong Broker để đẩy vào hàng đợi, Broker ở đây có thể là (RabbitMQ, Redis, Amazon SQS,...). Các Consumer là các Celery Worker sẽ nghe liên tục lắng nghe các task được thêm vào trong Broker để lấy ra và xử lý.
Trong bài hôm nay mình sẽ sử dụng Broker khá phổ biến là Redis để lưu trữ task, mô hình hoạt động trong bài viết này sẽ có dạng như sau:
Dựng Redis
Để sử dụng nền tảng Serverless Bizfly Cloud App Engine bạn cần đăng ký tài khoản tại đây: https://manage.bizflycloud.vn/register
Sau khi tạo tài khoản và đăng nhập xong bạn tìm đến dịch vụ App Engine ở thanh menu bên trái
Bắt đầu tạo App đầu tiên với tên worker-example. Sau khi tạo xong ta sẽ được chuyển vào trang tạo Service, ở đây ta chọn xuống mục OneClick Service Deploy và chọn Khởi tạo Redis.
Ta chọn cấu hình phù hợp và cấu hình thêm username/password nếu cần. Nếu không cấu hình username/password thì hệ thống sẽ sinh ngẫu nhiên.
Sau khi chọn xong ta ấn xác nhận để tạo. Sau vài phút thì Redis sẽ Up, bạn chọn Chi tiết để lấy thông tin kết nối đến Redis.
Như vậy ta đã có broker để lưu trữ task. Tiếp theo ta sẽ code 1 đoạn Celery đơn giản đóng vai trò Consumer và triển khai nó chạy trên App Engine.
Dựng Consumer - Celery Worker
Cài đặt thư viện
Bạn cần cài một số thư viện để chạy được Celery với Redis, câu lệnh như sau:
pip install celery celery[redis]
Tạo project code
Đầu tiên ta tạo file tasks.py với nội dung
from celery import Celery
app = Celery('tasks', broker='redis://:H47FH4d4JLjpPJpp@tcp.appengine.bfcplatform.vn:14123') @app.task
def add(x, y): return "Gia tri da tinh duoc: " + str(x + y)
File trên sẽ tạo ra worker Celery kết nối Redis đã tạo ở phần trước được cấu hình trong mục broker= cùng với đó ta định nghĩa một hàm add đơn giản với mục đích cộng 2 số rồi in ra kết quả. Khá đơn giản đúng không nào
Lưu ý: Thông tin kết nối đến Redis ta sẽ sử dụng URI
Định nghĩa Run command
Ta cần định nghĩa thêm Run command (câu lệnh sẽ dùng để chạy ứng dụng) cho các ứng dụng Python. Ta tạo thêm file với tên Procfile có nội dung:
worker: celery -A tasks worker --loglevel=INFO
Tạo file requirements.txt
Bạn cần tạo file này để hệ thống App Engine có thể biết được các thư viện ứng dụng bạn cần sử dụng để cài đặt. Bạn có thể tạo bằng câu lệnh:
pip freeze >> requirements.txt
Định nghĩa Python runtime (Nếu cần)
Bạn có thể định nghĩa thêm Python Runtime bằng cách tạo file runtime.txt với nội dung là version của python ví dụ:
python-3.11.0
Nếu không định nghĩa Runtime, hệ thống sẽ chạy code bạn với Runtime version mới nhất 3.11.
Cuối cùng Project chúng ta sẽ có các file sau:
Tạo service Worker trên App Engine
Giờ code đã sẵn sàng, chúng ta sang bước tiếp theo là triển khai source code này lên Bizfly Cloud App Engine. Quay trở lại màn list service ta chọn Tạo Service.
Ở đây mình sẽ tạo service với tên là celery-worker, thông tin triển khai mình sẽ chọn Upload để tải code lên từ máy tính luôn, ngoài ra bạn có thể đẩy lên Git hoặc đóng gói thành image.
Loại ứng dụng ta sẽ chọn dạng Worker. Service dạng Worker thì sẽ không thể truy cập từ bên ngoài.
Sau khi điền đầy đủ các thông tin xong thì ta ấn Xác nhận thông tin service để tạo. Chỉ với vài phút Worker service của bạn sẽ được triển khai thành công.
Thử nghiệm
Như vậy đã triển khai xong worker chạy trên nền tảng Serverless, giờ ta sẽ thử đẩy task vào để xem worker có nhận được task và xử lý hay không.
Tại folder chứa code ta chạy lần lượt 2 lênh sau trong trình biên dịch Python:
from tasks import add add.delay(5,12)
Vào trong phần Logs của worker ta thấy worker đã nhận được task và xử lý! 😁😁😁😁
Ưu điểm
Khi triển khai service Worker trên nền tảng Serverless:
- Bạn có thể dễ dàng mở rộng số lượng Worker lên tới 100 node chỉ trong tích tắc
- Triển khai phiên bản mới cho Worker mà không có Downtime
- Theo dõi tài nguyên sử dụng 24/7
- ...
Kết
Như vậy trong bài viết này mình đã hướng dẫn mọi người triển khai dịch vụ dạng Worker sử dụng Celery (Python) lên trên nền tảng Serverless BizflyCloud App Engine. Nền tảng Serverless này đang hoàn toàn miễn phí 100%, các bạn có thể sử dụng để triển khai nhiều loại ứng dụng khác nhau.
Hy vọng bài viết này giúp ích được cho công việc của bạn. Hãy UpVote và Follow mình để theo dõi thêm nhiều bài viết nữa nhé! Thank all.
Bất cứ thắc mắc hay đóng góp nào bạn có thể nhắn cho mình qua Telegram @HoangViet12 nhé!