CELERY LÀ GÌ

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

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

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

Sau Lúc được gợi nhắc về câu hỏi chuyển thanh lịch dùng hàng đợi cố kỉnh bởi vì nhằm mọi service thao tác trực tiếp cùng 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 đa phần bằng pynhỏ nhắn đề xuất tech lead gợi ý sử dụng Celery, một hệ thống quản trị queue thông dụng.

Kiến trúc sau thời điểm đưa thanh lịch sử dụng queue trong hệ thống của mình vẫn nhỏng sau. Một nội dung bài viết hơi ví dụ về một dạng xây dựng queue là message queue gần như fan có thể tìm hiểu thêm sống toidicodedao


*

Về CeleryLà một khối hệ thống quản trị sản phẩm đợi xử lý task thời hạn thực. Trong hệ thống Celery chúng ta đang sử dụng tư tưởng task giống như job nghỉ ngơi một trong những framework khác ví như Sidekiq.Input của celery phải liên kết với một một số loại message broker còn output hoàn toàn có thể liên kết cho tới một hệ thống backover để tàng trữ kết quả

Mọi bạn rất có thể tìm hiểu thêm một bài viết không giống về Celery bên trên viblo tại đây. Hình như Celery cũng đều có một hệ thống document ví dụ với đọc dễ sinh sống trang chủ https://docs.celeryproject.org/en/latest/getting-started/introduction.html.

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


Application

Một instance được khởi sinh sản từ thư viện Celery được gọi là application

Nhiều Celery application hoàn toàn có thể cùng mãi sau trong một process

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

from celery import Celeryphầm mềm = Celery()Khi gửi một message cho tới queue, message này sẽ chỉ cất thương hiệu của task nên thực hiện.

Những celery worker đã bản đồ thân tên của task với hàm triển khai task đó, câu hỏi mapping những điều đó được Điện thoại tư vấn là task registry

ứng dụng.taskdef add(x, y):return x + y

Tasks

Task trong Celery bao gồm hai trọng trách chính:tư tưởng gần như gì vẫn xẩy ra sau thời điểm một task được hotline (gửi đi message)định nghĩa những gì vẫn xẩy ra khi 1 worker cảm nhận message đóMỗi task có một tên riêng ko trùng lặp, thương hiệu này sẽ tiến hành refer vào message nhằm worker có thể kiếm được đúng hàm nhằm tiến hành. Nếu không tư tưởng tên cho task thì task đó sẽ được trường đoản cú đặt tên dựa vào module mà lại task được tư tưởng cùng thương hiệu function của task.Những message của task sẽ không bị xóa bỏ queue chừng nào message đó không được một worker cách xử trí. Một worker có thể giải pháp xử lý các message, nếu như worker bị crash mà lại chưa xử trí hết gần như message kia thì chúng vẫn có thể được gửi lại tới một worker khácCác function của task bắt buộc ngơi nghỉ tâm trạng idempotent: function không gây ra liên quan gì kể cả khi tất cả bị hotline không hề ít lần với cùng 1 tđam mê số => một task đã thực hiện vẫn đảm bảo không bị chạy lại đợt nữa.

Tạo task

Để chế tạo ra task bọn họ dùng decorator ứng dụng.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 bao gồm 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()Để biết thêm công bố và tâm trạng của task bạn có thể áp dụng Task.request


tiện ích.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 ngại trị tâm trạng của tasks và rất có thể lưu chúng Một trong những hệ thống gọi là result backover. Vòng đời khoác định của task trong Celery gồm:

PENDING: task chờ được triển khai.

STARTED: task đang khởi chạy

SUCCESS: task đang chạy thành công

FAILURE: task gặp gỡ lỗi sau khi khởi chạy

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

REVOKED: task được thu hồi lại

Ngoài phần đông tinh thần mang định trên chúng ta có thể trường đoản cú quan niệm thêm tinh thần và update tâm lý mang lại 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))

Điện thoại tư vấn task

Celery ưng ý phần đông API để Điện thoại tư vấn task sau khoản thời gian đã tư tưởng chúng sống trên.

Xem thêm: Cách Nấu Mực Xào Dứa Thơm Ngon, Giòn Thịt, Không Bị Tanh Đơn Giản Hơn Bạn Tưởng

3 method chính:

apply_async: gửi task message.delay: gửi task messagecalling: task message sẽ không còn được gửi đi tới worker cơ mà task sẽ tiến hành triển khai luôn luôn bởi vì process hiện giờ.

Có một task nhỏng sau:

tiện ích.taskdef add(x, y):return x + yĐể Hotline task này bọn họ vẫn test dùng 2 method là apply_async với delay

Với delay họ vẫn viết nhỏng 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 tạp rộng 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 tế delay và apply_async là tương đồng nhưng delay đã có tương đối nhiều sẵn phần đa tùy chỉnh thiết lập mang định và bọn họ chỉ có thể truyền vào hầu như ttê mê số nên vẫn khái niệm trong function của task, còn với apply_async chúng ta cũng có thể truyền thêm số đông tsay đắm số khác ví như queue bọn họ ý muốn gửi message vào,…. Best practice là nên áp dụng apply_async để tiện vấn đề config chạy task tùy trực thuộc theo nhu yếu thực hiện.

Celery cung cấp việc Gọi task theo mô hình chaining, kết quả của task này 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 lý lẽ này chúng ta có thể xây cất callbaông xã cho task như 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 cân xứng với dự án. Như đã nói ở trên Celery cung cấp 3 loại message broker là RabbitMQ, Redis, SQS. Mình đang đi sâu vào phân tích từng loại message broker vào phần sau về Celery.


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

from celery Import Celerytiện ích = Celery(“name of module”, broker=”url_of_broker”)phầm mềm.taskdef add(x, y):return x + yChạy worker

$ celery -A tasks worker –loglevel=infoĐiện thoại tư vấn task

Lưu kết quả

Celery hoàn toàn có thể lưu giữ trạng thái của tasks ví như bọn họ nên theo dõi và quan sát tasks sau đây. Với đông đảo khối hệ thống tiến hành task theo cách làm state machine thì Việc khối hệ thống phải thế được luồng tâm trạng của task là cực kì đặc biệt quan trọng.

Những khối hệ thống celery dùng để làm giữ tâm lý task:

SQLAlchemyMemcachedRedis

Để áp dụng cơ chế lưu công dụng trong Celery chúng ta knhị báo celery worker bao gồm tđê mê số backkết thúc. Tại trên đây bản thân sử dụng redis cho cả Việc lưu hiệu quả task lẫn làm cho message broker

ứng dụng = Celery(“tasks”, backend=”redis://localhost”, broker=”redis://localhost:6379/0″)

Cấu hình Celery

Cấu hình mặc định cơ phiên bản của celery:

## Broker settings.broker_url = “redis://localhost:6379/0″# List of modules to import when the Celery worker starts.imports = (“myứng dụng.tasks”,)## Using the database to store task state với results.result_backend = “db+sqlite:///results.db”task_annotations = “tasks.add”: “rate_limit”: “10/s”Best practice: tạo nên một tệp tin config riêng cho 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 cho tới queue ước ao muốnNgoài phương pháp sản xuất tệp tin config bên trên ra chúng ta cũng có thể config trực tiếp bằng application của Celery phầm mềm.conf

app.conf.update(enable_utc=True, timezone=”Europe/London”,)Tổng kếtCelery không cần thiết phải config các mà chỉ cần import từ module thực hiện thẳng nlỗi sau

from celery Import Celerytiện ích = Celery(“name of module”, broker=”url_of_broker”)Worker với client của Celery có thể tự retry

Một process của Celery có thể xử trí hàng tỷ task vào một phút í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 gần như hệ thống:AmqpRedisMemcachedSQLAlchemyAmazon S3File systemSerializationjsonyaml

Tại phần sau bài viết bản thân đang đi sâu rộng về worker trong Celery cùng nhị các loại message broker nhưng Celery hỗ trợ: SQS – Redis, mặt khác dựng một vận dụng cơ bạn dạng sử dụng 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://mni-alive.com Celery Là Gì – Nghĩa Của Từ Celery Trong Tiếng Việt


Related


About The Author
*

Là GìE-Mail Author

Leave a Reply Hủy

Lưu tên của mình, tin nhắn, với website vào trình chăm chú này mang đến lần comment tiếp đến của tớ.

Leave a Reply

Your email address will not be published. Required fields are marked *