Nâng tầm kỹ năng backend với kỹ thuật sử dụng task queue

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

Sau lúc được lưu ý về việc chuyển sang sử dụng hàng chờ thay vày để các service thao tác làm việc trực tiếp cùng với database, mình bao gồm dành thời gian tham khảo thêm về phong cách thiết kế Queue. Do dự án công trình chạy đa số bằng python phải tech lead nhắc nhở sử dụng Celery, một hệ thống quản lý queue phổ biến.

Bạn đang xem: Nâng tầm kỹ năng backend với kỹ thuật sử dụng task queue

Bạn vẫn xem: Celery là gì

Kiến trúc sau khoản thời gian chuyển sang sử dụng queue trong màng lưới hệ thống của mình sẽ như sau. Một nội dung bài viết khá cụ thể cụ thể về một dạng họa tiết thiết kế queue là message queue các người trọn vẹn có thể đọc thêm ở toidicodedao

*

Về CeleryLà một mạng lưới hệ thống quản trị hàng đợi giải quyết và xử trí task thời hạn thực. Vào mạng lưới hệ thống Celery vớ cả chúng ta sẽ sử dụng khái niệm task giống hệt như job ở một số ít framework khác như Sidekiq. Input đầu vào của celery cần liên kết với một nhiều loại message broker còn đầu ra hoàn toàn rất có thể liên kết cho tới một mạng lưới khối hệ thống backend để tàng trữ hiệu quảMọi người trọn vẹn có thể tìm hiểu thêm một bài viết khác về Celery trên viblo sinh sống đây. Hình 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 bài toán nên sử dụng CeleryChạy background jobsChạy số đông job lập lịchTính toán phân tánXử lý mặc dù songCác tác dụng chính Celery cung cấpMonitor : giám sát và đo lường những job / task được đưa vào queueScheduling : chạy phần nhiều task lập định kỳ ( kiểu như cronjob ) Workflows : chế tạo ra 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 thực thi trong một khoảng tầm 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à xử lý và xử lý taskUser Component : được cho phép người dùng tự customize phần nhiều worker. Vẻ ngoài của CeleryCelery hoạt động giải trí dựa vào khái niệm task queue. Đây là cơ chế queue dùng để làm điều phối phần lớn job / work một trong những máy khác nhau. Các worker đã nhận task, chạy task cùng trả về hiệu quả. đầu vào của queue : TaskCác process bên trên từng worker vẫn theo dõi queue để tiến hành những task bắt đầu được đẩy vào queueCelery hay sử dụng một message broker nhằm điều phối task trong số những clients với worker. Để tạo ra một task bắt đầu client đang thêm một message vào queue, broker sau đó sẽ chuyển message này tới worker.

Xem thêm: Để Chơi Candy Crush Saga Trên Facebook Thì Cần Phải Làm Gì? Candy Crush Saga

Celery cứu giúp 3 loại broker : RabbitMQRedisSQSMột mạng lưới hệ thống sử dụng celery trọn vẹn có thể có tương đối nhiều workers cùng brokers, nhờ vậy vấn đề scale theo hướng ngang sẽ tương đối thuận tiện. Những module bao gồm của Celery

Application

Một instance được khởi chế tạo từ thư viện Celery được hotline là applicationNhiều Celery application hoàn toàn có thể cùng sinh tồn 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 đó sẽ chỉ chứa tên của task cần thực thi .Các celery worker sẽ map giữa thương hiệu của task cùng với hàm triển khai task đó, việc mapping vì thế được hotline là task registryapp.taskdef địa chỉ cửa hàng ( x, y ) : return x + y

Tasks

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

Xem thêm: Game Đập Bong Bóng Thấy Ma

Tạo task

Để 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 chủ yếu instance của nó

task ( bind = True ) def địa chỉ ( self, x, y ) : logger.info ( self.request.id ) Task cũng trả 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à tâm lý 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 ở bên trên .

apply_async : gởi task message.delay : gởi task messagecalling : task message sẽ không được gửi tiếp cận worker cơ mà task sẽ tiến hành thực thi luôn bởi process lúc này .Có một task như sau :app.taskdef add ( x, y ) : return x + yĐể điện thoại tư vấn task này tất cả chúng ta sẽ thử 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 ) cần sử dụng apply_async thì cần viết phức tạp hơn một chú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à 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ả bọn họ chỉ hoàn toàn rất có thể truyền vào số đông tham số đề xuất đã tư tưởng trong function của task, còn với apply_async tất cả bọn họ hoàn toàn hoàn toàn có thể truyền thêm hầu hết tham số khác ví như queue vớ cả họ muốn gởi message vào, …. Best practice là nên sử dụng apply_async nhằm tiện bài toán config chạy task tùy theo nhu cầu sử dụng .Celery tương hỗ việc hotline task theo hình thức chaining, công dụng của task này hoàn toàn 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 cơ chế này bạn cũng 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 tương thích với dự án công trình Bất Động Sản. Như đã nói ở trên Celery cứu giúp 3 loại message broker là RabbitMQ, Redis, SQS. Mình sẽ đi sâu vào phân tích và so với từng các 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

Lưu tác dụng

Cấu hình Celery

Cấu hình mang định cơ bản của celery :# # Broker settings. Broker_url = “ redis : / / localhost : 6379 / 0 ″ # danh mục of modules to lớn import when the Celery worker starts.imports = ( “ myapp.tasks ”, ) # # Using the database khổng lồ store task state and results. Result_backend = “ db + sqlite : / / / results.db ” task_annotations = “ tasks.add ” : “ rate_limit ” : “ 10 / s ” Best practice : tạo thành 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 tới queue ao ước muốnNgoài phương pháp tạo file config bên trên ra tất cả bọn họ cũng hoàn 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 những mà chỉ cần import từ module thực hiện 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 rất có thể tự retryMột process của Celery hoàn toàn rất có thể giải quyết và xử lý hàng triệu task trong 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ữ chức năng trên hồ hết 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 hơn về worker vào Celery cùng hai loại message broker cơ mà Celery cứu giúp : SQS – Redis, đồng thời dựng một áp dụng cơ phiên bản sử dụng mạng lưới khối hệ thống này .Chuyên mục : Hỏi Đáp