Celery là gì

     
Review Celery Là Gì – Nghĩa Của từ bỏ Celery Trong tiếng Việt là conpect trong câu chữ ngày bây giờ của bọn chúng tôi. Theo dõi nội dung để biết rất tương đối đầy đủ nhé .Trong dự án công trình Bất Động Sản hiện tại tại của bản thân khi cho tới phần scaling mạng lưới hệ thống thì phong cách thiết kế hiện tại theo hướng microservice chạm mặt phải một nhân tố : đầy đủ service trong mạng lưới hệ thống đều ảnh hưởng trực tiếp với database nên xảy ra yếu tố càng nhiều service thì càng nhiều link tới database dẫn đến hoàn cảnh xảy ra deadlock, performance cũng khá chậm vì chưng những liên kết tới database từ đều service cần chờ nhau hóa giải .Bạn đang xem : Celery là gì

Sau khi được lưu ý về câu hỏi chuyển sang cần sử dụng hàng chờ thay vì chưng để những service làm việc trực tiếp cùng với database, mình tất cả dành thời gian đọc thêm về kiến trúc Queue. Do dự án công trình chạy hầu hết bằng python đề xuất tech lead lưu ý sử dụng Celery, một hệ thống thống trị queue phổ biến.




Bạn đang xem: Celery là gì

Kiến trúc sau thời điểm chuyển sang áp dụng queue trong mạng lưới hệ thống của chính mình sẽ như sau. Một bài viết khá cụ thể cụ thể về một dạng phong cách thiết kế queue là message queue phần nhiều người hoàn toàn có thể bài viết liên quan ở toidicodedao

*
Về CeleryLà một mạng lưới khối hệ thống quản trị sản phẩm đợi xử lý và xử trí task thời hạn thực. Vào mạng lưới khối hệ thống Celery vớ cả bọn họ sẽ thực hiện khái niệm task y như job ở một trong những ít framework khác như Sidekiq. Input của celery cần liên kết với một một số loại message broker còn đầu ra hoàn toàn hoàn toàn có thể liên kết tới một mạng lưới hệ thống backend nhằm tàng trữ hiệu quảMọi người trọn vẹn có thể xem thêm một bài viết khác về Celery bên trên viblo sinh sống đây. Dường như Celery cũng có thể có một mạng lưới hệ thống document cụ thể và đọc dễ ở home https://docs.celeryproject.org/en/latest/getting-started/introduction.html .Các câu hỏi nên thực hiện CeleryChạy background jobsChạy đông đảo job lập lịchTính toán phân tánXử lý mặc dù songCác chức năng chính Celery cung cấpMonitor : thống kê giám sát những job / task được đưa vào queueScheduling : chạy hồ hết task lập kế hoạch ( tương đương cronjob ) Workflows : tạo một luồng giải quyết và xử lý và cách xử trí taskTime cùng Rate Limits : trấn áp số lượng task được triển khai trong một khoảng chừng thời hạn, thời hạn một task được chạy, … Resource Leak Protection : trấn áp khoáng sản trong quy trình giải quyết và cách xử trí taskUser Component : được được cho phép người sử dụng tự customize rất nhiều worker. Nguyên lý của CeleryCelery vận động giải trí dựa trên khái niệm task queue. Đây là cơ chế queue dùng để điều phối phần nhiều job / work trong những máy khác nhau. Những worker sẽ nhận task, chạy task và trả về hiệu quả. Input đầu vào của queue : TaskCác process trên từng worker đã theo dõi queue để tiến hành những task new được đẩy vào queueCelery thường dùng một message broker nhằm điều phối task trong số những clients và worker. Để chế tạo ra một task bắt đầu client vẫn thêm một message vào queue, broker kế tiếp sẽ gửi message này cho tới worker. Celery tương hỗ 3 một số 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 cùng brokers, nhờ vậy vấn đề scale theo chiều ngang sẽ rất thuận tiện. Các module bao gồm của Celery


Application

Một instance được khởi tạo ra từ tủ sách Celery được điện thoại tư vấn là applicationNhiều Celery application trả toàn rất có thể cùng sống sót trong một processKhởi chế tạo ra một celery application :from celery import Celeryapp = Celery ( ) Khi nhờ cất hộ một message tới queue, message đó sẽ chỉ cất tên của task cần tiến hành .Các celery worker sẽ maps giữa tên của task với hàm tiến hành task đó, câu hỏi mapping vì thế được call là task registryapp.taskdef add ( x, y ) : return x + y

Tasks

Task vào Celery gồm hai trách nhiệm chính : định nghĩa gần như gì vẫn xảy ra sau khoản thời gian một task được hotline ( nhờ cất hộ đi message ) định nghĩa đầy đủ gì sẽ xảy ra khi một worker cảm nhận message đóMỗi task bao gồm một tên riêng không trùng lặp, thương hiệu này sẽ tiến hành refer vào message để worker trả toàn hoàn toàn có thể tìm được đúng hàm nhằm thực thi. Còn nếu như không định nghĩa tên cho task thì task đó sẽ được tự để tên phụ thuộc module cơ mà task được tư tưởng và tên function của task. Những message của task sẽ không biến thành xóa ngoà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 rất có thể giải quyết và xử lý những message, trường hợp worker bị crash nhưng mà chưa giải quyết và xử lý và cách xử trí hết phần lớn message kia thì chúng vẫn hoàn toàn hoàn toàn có thể được gửi lại cho tới một worker khácCác function của task buộc phải ở trạng thái idempotent : function không gây ra tác động ảnh hưởng gì bao gồm cả khi có bị gọi nhiều lần với một tham số => một task đã tiến hành sẽ bảo đảm an toàn không bị chạy lại lần tiếp nữa .

Tạo task

Để chế tạo task bọn 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 chúng ta có thể bound task vào bao gồm instance của nó


task ( bind = True ) def địa chỉ ( 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 tin tức và tâm trạng của task bạn cũng có thể sử dụng Task.request

Gọi task

Celery đáp ứng những API để gọi task sau khoản thời gian đã định nghĩa chúng ở bên trên .




Xem thêm: Trường Đh Nguyễn Tất Thành Công Bố Điểm Sàn Đại Học Nguyễn Tất Thành 2021

apply_async : nhờ cất hộ task message.delay : giữ hộ task messagecalling : task message sẽ không còn được gửi đi tới worker cơ mà task sẽ tiến hành thực thi luôn bởi process bây giờ .Có một task như sau :app.taskdef showroom ( x, y ) : return x + yĐể điện thoại tư vấn task này vớ cả họ sẽ thử sử dụng 2 method là apply_async và delayVới delay tất 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ì cần viết phức hợp hơn một í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 ra delay cùng apply_async là giống hệt nhưng delay đã tất cả sẵn những thiết lập mặc định cùng tất cả bọn họ chỉ hoàn toàn có thể truyền vào đa số tham số buộc phải đã khái niệm trong function của task, còn với apply_async vớ cả bọn họ hoàn toàn rất có thể truyền thêm đều tham số khác như queue tất cả bọn họ muốn gửi message vào, …. Best practice là nên thực hiện apply_async nhằm tiện việc config chạy task tùy theo nhu yếu sử dụng .Celery tương hỗ việc gọi task theo hình thức chaining, hiệu quả của task này hoàn toàn có thể được truyền vào task tiếp theo

add.apply_async((2, 2), link=add.s(16)) # 20Nhờ vào phép tắc này chúng ta cũng có thể thiết kế callback mang đến 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 tương hợp với dự án Bất Động Sản. Như đã nhắc đến ở trên Celery tương hỗ 3 nhiều loại message broker là RabbitMQ, Redis, SQS. Mình đang đi sâu vào nghiên cứu và phân tích và phân tích từng một số loại message broker trong phần sau về Celery .Tạo một celery worker cùng 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: Nghĩa Của Từ Cohesion Là Gì, Coherence And Cohesion Là Gì

Lưu tác dụng

Cấu hình Celery

Cấu hình mang định cơ bạn dạng của celery :# # Broker settings. Broker_url = “ redis : / / localhost : 6379 / 0 ″ # danh sách of modules to import when the Celery worker starts.imports = ( “ myapp.tasks ”, ) # # Using the database to store task state và results. Result_backend = “ db + sqlite : / / / results.db ” task_annotations = “ tasks.add ” : “ rate_limit ” : “ 10 / s ” Best practice : tạo ra một tệp tin config riêng cho 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 tới queue mong mỏi muốnNgoài phương pháp tạo tệp tin config bên trên ra vớ cả bọn họ cũng trả toàn hoàn toàn 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 cần thiết phải config nhiều mà chỉ cần import từ module sử dụng trực tiếp như saufrom celery Import Celeryapp = Celery ( “ name of module ”, broker = ” url_of_broker ” ) Worker và client của Celery trả toàn hoàn toàn có thể tự retryMột process của Celery trả toàn có thể giải quyết và cách xử trí hàng triệu task trong một phút với độ trễ chỉ vài miligiây

Celery hỗ trợ:


Message brokers : RabbitMQRedisSQSXử lý concurrencymultiprocessingmultithreadsingle threadeventlet, geventLưu trữ chức năng trên gần như mạng lưới khối hệ thống : AmqpRedisMemcachedSQLAlchemyAmazon S3File systemSerializationjsonyamlỞ phần sau bài viết mình vẫn đi sâu rộng về worker trong Celery cùng hai nhiều loại message broker nhưng Celery cứu giúp : SQS – Redis, bên cạnh đó dựng một áp dụng cơ bạn dạng sử dụng mạng lưới khối hệ thống này .Chuyên mục : Hỏi Đáp