Sau khi được gợi ý về việc chuyển sang dùng hàng đợi thay vì để các service thao tác trực tiếp với database, mình có dành thời gian tìm hiểu thêm về kiến trúc Queue. Do dự án chạy chủ yếu bằng python nên tech lead gợi ý sử dụng Celery, một hệ thống quản lý queue phổ biến.
Bạn đang xem: Celery
Bạn đang đọc: Sự thật về Celery Là Gì – Nghĩa Của Từ Celery Trong Tiếng Việt
Kiến trúc sau khi chuyển sang sử dụng queue trong mạng lưới hệ thống của mình sẽ như sau. Một bài viết khá chi tiết cụ thể về một dạng phong cách thiết kế queue là message queue mọi người hoàn toàn có thể đọc thêm ở toidicodedao

Xem thêm: Tải Game Win888 Club Ios/Apk Đánh Bài Uy Tín Vô Minh Bạch Đổi Thẻ Auto
Đây là chính sách queue dùng để điều phối những job / work giữa những máy khác nhau. Các worker sẽ nhận task, chạy task và trả về hiệu quả. Input của queue : TaskCác process trên từng worker sẽ theo dõi queue để thực thi những task mới được đẩy vào queueCelery thường dùng một message broker để điều phối task giữa những clients và worker. Để tạo một task mới client sẽ thêm một message vào queue, broker sau đó sẽ chuyển message này tới worker. Celery tương hỗ 3 loại broker : RabbitMQRedisSQSMột mạng lưới hệ thống sử dụng celery hoàn toàn có thể có nhiều workers và brokers, nhờ vậy việc scale theo chiều ngang sẽ rất thuận tiện. Các module chính của CeleryApplication
Một instance được khởi tạo từ thư viện Celery được gọi là applicationNhiều Celery application hoàn toàn có thể cùng sống sót trong một processKhởi tạo một celery application :from celery import Celeryapp = Celery ( ) Khi gửi một message tới queue, message đó sẽ chỉ chứa tên của task cần thực thi .Các celery worker sẽ map giữa tên của task với hàm thực thi task đó, việc mapping như vậy được gọi là task registryapp.taskdef add ( x, y ) : return x + y
Tasks
Task trong Celery có hai trách nhiệm chính : định nghĩa những gì sẽ xảy ra sau khi một task được gọi ( gửi đi message ) định nghĩa những gì sẽ xảy ra khi một worker nhận được message đóMỗi task có một tên riêng không trùng lặp, tên này sẽ được refer trong message để worker hoàn toàn có thể tìm được đúng hàm để thực thi. Nếu không định nghĩa tên cho task thì task đó sẽ được tự đặt tên dựa vào module mà task được định nghĩa và tên function của task. Các message của task sẽ không bị xóa khỏi queue chừng nào message đó chưa được một worker giải quyết và xử lý. Một worker hoàn toàn có thể giải quyết và xử lý nhiều message, nếu worker bị crash mà chưa giải quyết và xử lý hết những message đó thì chúng vẫn hoàn toàn có thể được gửi lại tới một worker khácCác function của task nên ở trạng thái idempotent : function không gây ra tác động ảnh hưởng gì kể cả khi có bị gọi nhiều lần với cùng một tham số => một task đã thực thi sẽ bảo vệ không bị chạy lại lần nữa .
Tạo task
Để tạo task chúng ta dùng decorator app.task(name=”create_new_user”)def create_user(username, password):User.objects.create(username=username, password=password)Để task có thể retry chúng ta có thể bound task vào chính instance của nó
task ( bind = True ) def add ( self, x, y ) : logger.info ( self.request.id ) Task cũng hoàn toàn có thể thừa kế
import celeryclass MyTask(celery.Task):def on_failure(self, exc, task_id, args, kwargs, einfo): print(“0!r failed: 1!r”.format(task_id, exc))task(base=MyTask)def add(x, y):raise KeyError()Để biết thêm thông tin và trạng thái của task chúng ta có thể sử dụng Task.request
Gọi task
Celery cung ứng những API để gọi task sau khi đã định nghĩa chúng ở trên .