Trong dự án công trình hiện nay của tớ lúc đến phần scaling hệ thống thì phong cách thiết kế hiện giờ theo hướng microservice gặp mặt đề nghị một vấn đề: đều service trong hệ thống mọi liên tưởng thẳng với database nên xẩy ra vụ việc càng nhiều service thì sẽ càng các kết nối tới database dẫn mang lại tình trạng xẩy ra deadlock, performance cũng khá lờ lững vày mọi kết nối tới database từ bỏ đầy đủ service bắt buộc hóng nhau giải pđợi.

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

Bài Viết: Celery là gì

Sau lúc được gợi nhắc về Việc gửi thanh lịch sử dụng mặt hàng ngóng vắt vì chưng nhằm hầu hết service thao tác làm việc trực tiếp cùng với database, bản thân gồm dành thời hạn tìm hiểu thêm về phong cách xây dựng Queue. Do dự án chạy hầu hết bằng pythuôn yêu cầu tech lead gợi nhắc thực hiện Celery, một khối hệ thống quản trị queue phổ biến.

Kiến trúc sau thời điểm đưa sang áp dụng queue vào hệ thống của mình đang nhỏng sau. Một nội dung bài viết hơi cụ thể về một dạng kiến tạo queue là message queue hầu như bạn hoàn toàn có thể đọc thêm sinh sống toidicodedao


*

Về CeleryLà một hệ thống quản trị mặt hàng đợi xử trí task thời hạn thực. Trong hệ thống Celery họ vẫn áp dụng khái niệm task hệt như job ngơi nghỉ một vài framework khác như Sidekiq.Input của celery đề xuất liên kết với một một số loại message broker còn output hoàn toàn có thể kết nối tới một hệ thống backover nhằm tàng trữ kết quả

Mọi fan hoàn toàn có thể tham khảo một bài viết không giống về Celery trên viblo ở chỗ này. Trong khi Celery cũng có thể có một khối hệ thống document ví dụ với đọc dễ dàng ngơi nghỉ trang chủ https://docs.celeryproject.org/en/latest/getting-started/introduction.html.

Những bài tân oán cần áp dụng CeleryChạy background jobsChạy hầu như job lập lịchTính toán thù phân tánXử lý tuy nhiên songCác tính năng chính Celery cung cấpMonitor: giám sát và đo lường phần nhiều job/task được đưa vào queueScheduling: chạy các task lập lịch (giống cronjob)Workflows: chế tạo ra một luồng xử lý taskTime và Rate Limits: kiểm soát điều hành con số task được thực thi vào một khoảng chừng thời gian, thời hạn một task được chạy,…Resource Leak Protection: điều hành và kiểm soát tài nguyên ổn trong quá trình xử lý taskUser Component: được phxay người tiêu dùng tự customize phần nhiều worker.Cơ chế của CeleryCelery chuyển động dựa vào quan niệm task queue. Đây là hiệ tượng queue dùng làm điều păn năn phần lớn job/work trong những thứ khác nhau. Những worker đang dìm task, chạy task cùng trả về tác dụng.Input của queue:TaskNhững process trên từng worker đang theo dõi và quan sát queue để tiến hành đầy đủ task new được đẩy vào queueCelery hay sử dụng một message broker để điều phối hận task trong những clients và worker. Để tạo thành một task bắt đầu client sẽ thêm một message vào queue, broker tiếp nối vẫn đưa message này cho tới worker. Celery hỗ trợ 3 nhiều loại broker:RabbitMQRedisSQSMột khối hệ thống sử dụng celery có thể có khá nhiều workers với brokers, nhờ vào vậy Việc scale theo hướng ngang sẽ khá tiện lợi.Những module chính của Celery


Application

Một instance được khởi tạo trường đoản cú thư viện Celery được Call là application

hầu hết Celery application rất có thể thuộc mãi mãi trong một process

Khởi tạo nên một celery application:

from celery import Celeryphầm mềm = Celery()lúc gửi một message cho tới queue, message này sẽ chỉ chứa tên của task đề nghị triển khai.

Những celery worker đã bản đồ thân thương hiệu của task cùng với hàm thực thi task kia, việc mapping như vậy được Call là task registry

phầm mềm.taskdef add(x, y):return x + y

Tasks

Task trong Celery có nhì trọng trách chính:tư tưởng đều gì sẽ xẩy ra sau thời điểm một task được Call (gửi đi message)quan niệm hầu như gì đã xảy ra khi 1 worker cảm nhận message đóMỗi task gồm một thương hiệu riêng rẽ ko giống nhau, tên này sẽ tiến hành refer trong message để worker rất có thể tìm kiếm được đúng hàm nhằm tiến hành. Nếu không tư tưởng thương hiệu mang lại task thì task kia sẽ tiến hành tự đánh tên dựa vào module mà task được tư tưởng với tên function của task.Những message của task đã không bị xóa bỏ queue chừng nào message kia không được một worker cách xử lý. Một worker hoàn toàn có thể giải pháp xử lý nhiều message, giả dụ worker bị crash mà không giải pháp xử lý hết phần đa message đó thì bọn chúng vẫn rất có thể được gửi lại tới một worker khácCác function của task đề xuất sinh sống tâm trạng idempotent: function không gây ra liên quan gì của cả khi bao gồm bị hotline không ít lần với một tham số => một task đang triển khai sẽ đảm bảo an toàn không xẩy ra chạy lại lần nữa.

Tạo task

Để tạo nên task họ cần sử dụng decorator ứng dụng.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 add(self, x, y):logger.info(self.request.id)Task cũng rất có thể kế thừa

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()Để hiểu thêm thông báo và tinh thần của task chúng ta có thể sử dụng Task.request


app.task(bind=True)def dump_context(self, x, y):print(“Executing task id 0.id, args: 0.args!r kwargs: 0.kwargs!r”.format( self.request))Celery quản trị tinh thần của tasks với có thể lưu chúng trong những hệ thống điện thoại tư vấn là result backover. Vòng đời khoác định của task vào Celery gồm:

PENDING: task đợi được thực thi.

STARTED: task vẫn khởi chạy

SUCCESS: task vẫn chạy thành công

FAILURE: task gặp gỡ lỗi sau thời điểm khởi chạy

RETRY: task đang rất được chạy lại

REVOKED: task được tịch thu lại

Ngoài các tinh thần khoác định bên trên chúng ta có thể tự tư tưởng thêm tâm lý và update tâm lý đến task bằng method update_state

app.task(bind=True)def upload_files(self, filenames):for i, tệp tin in enumerate(filenames): if not self.request.called_directly: self.update_state(state=”PROGRESS”, meta=“current”: i, “total”: len(filenames))

Call task

Celery vừa lòng phần lớn API để Call task sau khi vẫn tư tưởng bọn chúng ở bên trên.

Xem thêm: Lập Trình Hướng Đối Tượng Là Gì? Opp Là Gì ? Opp Là Gì? Túi Opp Là Gì

3 method chính:

apply_async: gửi task message.delay: gửi task messagecalling: task message sẽ không được gửi đi tới worker nhưng task sẽ tiến hành triển khai luôn luôn vày process hiện tại.

Có một task nlỗi sau:

tiện ích.taskdef add(x, y):return x + yĐể Điện thoại tư vấn task này họ vẫn demo cần sử dụng 2 method là apply_async cùng delay

Với delay bọn họ vẫn viết nlỗi 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 chú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 chất delay và apply_async là giống hệt dẫu vậy delay đang có rất nhiều sẵn đều thiết lập mặc định với họ chỉ rất có thể truyền vào đều tsay đắm số bắt buộc vẫn tư tưởng vào function của task, còn cùng với apply_async chúng ta cũng có thể truyền thêm hầu như tmê man số khác như queue chúng ta ao ước gửi message vào,…. Best practice là nên sử dụng apply_async nhằm luôn tiện vấn đề config chạy task tùy trực thuộc theo nhu cầu áp dụng.

Celery cung ứng câu hỏi call task theo phương thức chaining, hiệu quả của task này có thể được truyền vào task tiếp theo

add.apply_async((2, 2), link=add.s(16)) # 20Nhờ vào vẻ ngoài này bạn có thể thiết kế callbaông xã mang đến task nhỏng sauứng dụng.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

Setup

pip install -U Celery

Sử dụng

Lựa lựa chọn nhiều loại message broker phù hợp cùng với dự án công trình. Nhỏng vẫn nói trên Celery cung ứng 3 nhiều loại message broker là RabbitMQ, Redis, SQS. Mình đã đi sâu vào đối chiếu từng loại message broker vào phần sau về Celery.


Tạo một celery worker cùng với task add

from celery Import Celeryứng dụng = Celery(“name of module”, broker=”url_of_broker”)tiện ích.taskdef add(x, y):return x + yChạy worker

$ celery -A tasks worker –loglevel=infoHotline task

Lưu kết quả

Celery có thể lưu giữ trạng thái của tasks giả dụ họ đề nghị theo dõi tasks trong tương lai. Với gần như khối hệ thống thực hiện task theo phương thức state machine thì việc hệ thống đề nghị chũm được luồng tinh thần của task là cực kỳ đặc biệt quan trọng.

Những hệ thống celery dùng để giữ trạng thái task:

SQLAlchemyMemcachedRedis

Để áp dụng qui định lưu giữ công dụng vào Celery bọn họ khai báo celery worker bao gồm tham số backover. Ở trên đây mình thực hiện redis cho tất cả bài toán giữ kết quả task lẫn có tác dụng message broker

tiện ích = Celery(“tasks”, backend=”redis://localhost”, broker=”redis://localhost:6379/0″)

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″# List of modules to import when the Celery worker starts.imports = (“myapp.tasks”,)## Using the database to lớn store task state với results.result_backover = “db+sqlite:///results.db”task_annotations = “tasks.add”: “rate_limit”: “10/s”Best practice: sản xuất một tệp tin config riêng rẽ đến celery celeryconfig.py

broker_url = “redis://localhost:6379/0://”result_backkết thúc = “rpc://”task_serializer = “json”result_serializer = “json”accept_nội dung = 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 nên tệp tin config bên trên ra họ cũng có thể config thẳng bởi application của Celery phầm mềm.conf

ứng dụng.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ỉ việc import từ bỏ module sử dụng thẳng nlỗi sau

from celery Import Celeryứng dụng = Celery(“name of module”, broker=”url_of_broker”)Worker với client của Celery rất có thể từ retry

Một process của Celery hoàn toàn có thể xử lý hàng tỷ 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ữ kết quả trên đa số hệ thống:AmqpRedisMemcachedSQLAlchemyAmazon S3File systemSerializationjsonyaml

Tại phần sau nội dung bài viết mình sẽ đi sâu rộng về worker trong Celery với nhị các loại message broker mà lại Celery hỗ trợ: SQS – Redis, đồng thời dựng một áp dụng cơ phiên bản thực hiện khối hệ thống này.

Thể Loại: Chia sẻ Kiến Thức Cộng Đồng
Bài Viết: Celery Là Gì – Nghĩa Của Từ Celery Trong Tiếng Việt

Thể Loại: LÀ GÌ

Nguồn Blog là gì: https://man-city.net Celery Là Gì – Nghĩa Của Từ Celery Trong Tiếng Việt


Related


About The Author
*

Là GìThư điện tử Author

Leave a Reply Hủy

Lưu thương hiệu của tôi, gmail, cùng trang web trong trình chú tâm này đến lần phản hồi tiếp đến của mình.