Sự thật về celery là gì
Sau khi được nhắc nhở về việc chuyển sang sử dụng hàng đợi thay bởi 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ề phong cách thiết kế Queue. Do dự án chạy hầu hết bằng python phải tech lead nhắc nhở sử dụng Celery, một hệ thống làm chủ queue phổ biến.
Bạn đang xem: Sự thật về celery là gì
Kiến trúc sau khoản thời gian chuyển sang thực hiện 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 phần nhiều người trọn vẹn có thể đọc thêm ở toidicodedao

Application
Một instance được khởi tạo ra từ tủ sách Celery được hotline là applicationNhiều Celery application trả toàn rất có thể cùng tồn tại trong một processKhởi chế tạo một celery application :from celery import Celeryapp = Celery ( ) Khi gởi một message cho tới queue, message này sẽ chỉ chứa tên của task cần thực thi .Các celery worker sẽ maps giữa tên của task cùng với hàm xúc tiến task đó, việc mapping bởi vậy được hotline là task registryapp.taskdef add ( x, y ) : return x + y
Tasks
Task trong Celery bao gồm hai nhiệm vụ chính : định nghĩa đa số gì vẫn xảy ra sau thời điểm một task được hotline ( giữ hộ đi message ) định nghĩa rất nhiều gì sẽ xẩy ra khi một worker nhận ra message đóMỗi task có một thương hiệu riêng ko trùng lặp, thương hiệu này sẽ tiến hành refer trong message để worker trả toàn có thể tìm được đúng hàm nhằm thực thi. Nếu như không định nghĩa tên mang đến task thì task đó sẽ được tự đặt tên phụ thuộc module nhưng task được quan niệm và tên function của task. Các message của task sẽ không biến thành xóa ngoài queue chừng như thế nào message đó không được một worker giải quyết và xử lý và xử lý. Một worker hoàn toàn có thể giải quyết với xử lý các message, ví như worker bị crash nhưng chưa giải quyết và xử lý và xử lý hết hầu hết message kia thì chúng vẫn trả toàn rất có thể được gửi lại tới một worker khácCác function của task bắt buộc ở tâm trạng idempotent : function không khiến ra tác động tác động gì tất cả khi bao gồm bị gọi nhiều lần với cùng một tham số => một task đã triển khai sẽ bảo đảm không bị chạy lại đợt nữa .
Tạo task
Để tạo nên task họ dùng decorator app.task(name=”create_new_user”)def create_user(username, password):User.objects.create(username=username, password=password)Để task rất có thể retry bạn có thể bound task vào thiết yếu instance của nó
task ( bind = True ) def địa chỉ cửa hàng ( 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 bạn cũng có thể sử dụng Task.request
Gọi task
Celery đáp ứng những API để hotline task sau thời điểm đã định nghĩa chúng ở trên .
Xem thêm: Kết Quả Soi Tươi Là Gì ? Soi Tươi Cổ Tử Cung Là Gì
apply_async : gửi task message.delay : nhờ cất hộ task messagecalling : task message sẽ không còn được gửi tiếp cận worker nhưng task sẽ được thực thi luôn luôn bởi process bây giờ .Có một task như sau :app.taskdef showroom ( x, y ) : return x + yĐể gọi task này tất cả chúng ta sẽ thử dùng 2 method là apply_async và delayVới delay vớ cả chúng ta sẽ viết như sau :# task.delay ( arg1, arg2, kwarg1 = ” x ”, kwarg2 = ” y ” ) add.delay ( 10, 5 ) add.delay ( a = 10, b = 5 ) dùng apply_async thì đề xuất viết phức hợp hơn một chút ít # task. Apply_async ( args =, kwargs = ” kwarg1 ″ : “ x ”, “ kwarg2 ” : “ y ” ) add. Apply_async ( queue = ” low_priority ”, args = ( 10, 5 ) ) add. Apply_async ( queue = ” high_priority ”, kwargs = ” a ” : 10, “ b ” : 5 ) Về thực tế delay với apply_async là tương đồng nhưng delay đã tất cả sẵn những thiết lập mặc định cùng tất cả họ chỉ hoàn toàn hoàn toàn có thể truyền vào hồ hết tham số nên đã khái niệm trong function của task, còn cùng với apply_async vớ cả bọn họ hoàn toàn có thể truyền thêm các tham số khác như queue tất cả họ muốn gởi message vào, …. Best practice là nên áp dụng apply_async nhằm tiện bài toán config chạy task tùy theo yêu cầu sử dụng .Celery tương trợ việc call task theo dạng chaining, kết quả của task này trả toàn rất có thể được truyền vào task tiếp theo
add.apply_async((2, 2), link=add.s(16)) # 20Nhờ vào nguyên tắc này chúng ta có thể thiết kế callback mang lại task như sauapp.taskdef error_handler(uuid):result = AsyncResult(uuid)exc = result.get(propagate=False)print(“Task 0 raised exception: 1!r2!r”.format( uuid, exc, result.traceback))add.apply_async((2, 2), link_error=error_handler.s())Sử dụng Celery
Cài đặt
pip install – U Celery
Sử dụng
Lựa chọn một số loại message broker cân xứng với dự án Bất Động Sản. Như đã nói ở trên Celery tương hỗ 3 các loại message broker là RabbitMQ, Redis, SQS. Mình đang đi sâu vào phân tích và so với từng một số loại message broker vào phần sau về Celery .Tạo một celery worker với task add
from celery Import Celeryapp = Celery(“name of module”, broker=”url_of_broker”)app.taskdef add(x, y):return x + yChạy worker
USD celery – A tasks worker – loglevel = infoGọi task
Xem thêm: Từ Điển Anh Việt " Red Meat Là Gì ? Red Meat Thành Ngữ, Tục Ngữ, Slang Phrases
Lưu tác dụng
Cấu hình Celery
Cấu hình khoác định cơ phiên bản của celery :# # Broker settings. Broker_url = “ redis : / / localhost : 6379 / 0 ″ # các mục of modules khổng lồ import when the Celery worker starts.imports = ( “ myapp.tasks ”, ) # # Using the database to lớn store task state and results. Result_backend = “ db + sqlite : / / / results.db ” task_annotations = “ tasks.add ” : “ rate_limit ” : “ 10 / s ” Best practice : sản xuất một file config riêng mang đến celery celeryconfig.pybroker_url = “ redis : / / localhost : 6379 / 0 : / / ” result_backend = “ rpc : / / ” task_serializer = “ json ” result_serializer = “ json ” accept_content = timezone = “ Europe / Oslo ” enable_utc = Truetask_routes = “ tasks.add ” : “ low-priority ”, # routing một task cho tới queue hy vọng muốnNgoài giải pháp tạo tệp tin config trên ra vớ cả họ cũng trả toàn rất có thể config trực tiếp bởi application của Celery app.confapp.conf.update ( enable_utc = True, timezone = ” Europe / London ”, ) Tổng kếtCelery không nhất thiết phải config các mà chỉ việc import trường đoản cú module thực hiện trực tiếp như saufrom celery Import Celeryapp = Celery ( “ name of module ”, broker = ” url_of_broker ” ) Worker cùng client của Celery hoàn toàn rất có thể tự retryMột process của Celery hoàn toàn hoàn toàn có thể giải quyết và xử trí hàng triệu task vào một phút cùng với độ trễ chỉ vài miligiây
Celery hỗ trợ:
Message brokers : RabbitMQRedisSQSXử lý concurrencymultiprocessingmultithreadsingle threadeventlet, geventLưu trữ công dụng trên số đông mạng lưới khối hệ thống : AmqpRedisMemcachedSQLAlchemyAmazon S3File systemSerializationjsonyamlỞ phần sau bài viết mình sẽ đi sâu rộng về worker trong Celery cùng hai loại message broker cơ mà Celery tương hỗ : SQS – Redis, đôi khi dựng một ứng dụng cơ phiên bản sử dụng mạng lưới hệ thống này .Chuyên mục : Hỏi Đáp