Trong dự án công trình hiện tại của mình khi cho tới phần scaling hệ thống thì bản vẽ xây dựng hiện tại theo hướng microservice gặp gỡ phải một vấn đề: gần như service trong khối hệ thống đều can dự trực tiếp cùng với database nên xẩy ra vấn đề càng nhiều service thì càng nhiều liên kết tới database dẫn mang đến tình trạng xẩy ra deadlock, performance cũng tương đối chậm bởi những liên kết tới database từ các service buộc phải chờ nhau giải phóng.
Bạn đang xem: Celery
Bài Viết: Celery là gì
Sau lúc được gợi ý về bài toán chuyển sang sử dụng hàng đợi thay do để số đông service thao tác trực tiếp với database, mình tất cả dành thời gian tìm hiểu thêm về phong cách xây dựng Queue. Do dự án công trình chạy đa số bằng python đề xuất tech lead nhắc nhở sử dụng Celery, một khối hệ thống quản trị queue thịnh hành.
Kiến trúc sau khi chuyển sang thực hiện queue trong hệ thống của mình sẽ như sau. Một bài viết khá ví dụ về một dạng xây dựng queue là message queue mọi người dân có thể tìm hiểu thêm ở toidicodedao

Về CeleryLà một khối hệ thống quản trị hàng đợi giải pháp xử lý task thời gian thực. Trong hệ thống Celery họ sẽ áp dụng khái niệm task giống hệt như job ở một số trong những framework khác như Sidekiq.Input của celery cần liên kết với một các loại message broker còn output rất có thể kết nối cho tới một hệ thống backend để tàng trữ kết quả
Mọi người rất có thể tham khảo một nội dung bài viết khác về Celery trên viblo ngơi nghỉ đây. Bên cạnh đó Celery cũng đều có một hệ thống document ví dụ và dễ nhìn đọc ở trang chủ https://docs.celeryproject.org/en/latest/getting-started/introduction.html.
Những câu hỏi nên áp dụng CeleryChạy background jobsChạy hầu hết job lập lịchTính toán phân tánXử lý tuy vậy songCác tác dụng chính Celery cung cấpMonitor: đo lường và tính toán những job/task được chuyển vào queueScheduling: chạy đa số task lập định kỳ (giống cronjob)Workflows: sản xuất một luồng giải pháp xử lý taskTime & Rate Limits: kiểm soát và điều hành số lượng task được tiến hành trong một khoảng thời gian, 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 quy trình xử lý taskUser Component: được phép người mua tự customize hầu như worker.Cơ chế của CeleryCelery hoạt động dựa trên định nghĩa task queue. Đây là chính sách queue dùng làm điều phối phần lớn job/work một trong những máy không giống nhau. Phần đông worker đang nhận task, chạy task cùng trả về kết quả.Input của queue:TaskNhững process bên trên từng worker đã theo dõi queue để thực hiện những task mới được đẩy vào queueCelery hay được dùng một message broker để điều phối task một trong những clients và worker. Để tạo thành một task mới client đã thêm một message vào queue, broker sau đó sẽ đưa message này tới worker. Celery hỗ trợ 3 các loại broker:RabbitMQRedisSQSMột hệ thống sử dụng celery tất cả thể có không ít workers với brokers, dựa vào vậy câu hỏi scale theo hướng ngang sẽ tương đối dễ dàng.Những module chủ yếu của Celery
Application
Một instance được khởi tạo từ thư viện Celery được hotline là application
Nhiều Celery application có thể cùng tồn tại trong một process
Khởi sản xuất 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.
Những celery worker sẽ maps giữa tên của task cùng với hàm tiến hành task đó, việc mapping do đó được hotline là task registry
app.taskdef add(x, y):return x + y
Tasks
Task vào Celery bao gồm hai nhiệm vụ chính:định nghĩa đa số gì đang xảy ra sau khi một task được hotline (gửi đi message)định nghĩa phần lớn gì sẽ xẩy ra khi một worker nhận thấy message đóMỗi task tất cả một tên riêng ko trùng lặp, thương hiệu này sẽ tiến hành refer trong message để worker có thể tìm được đúng hàm nhằm thực thi. Nếu không định nghĩa tên mang đến task thì task đó sẽ tiến hành tự đặt tên phụ thuộc vào module mà lại task được khái niệm và tên function của task.Những message của task sẽ không bị xóa khỏi queue chừng nào message đó chưa được một worker xử lý. Một worker rất có thể xử lý những message, giả dụ worker bị crash mà chưa xử lý hết gần như message đó thì chúng vẫn có thể được giữ hộ lại tới một worker khácCác function của task yêu cầu ở trạng thái idempotent: function không khiến ra tương quan gì kể cả khi gồm bị gọi rất nhiều lần với cùng một tham số => một task đã xúc tiến sẽ đảm bảo không bị chạy lại lần nữa.
Tạo task
Để tạo nên task chúng ta dùng decorator app.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 chủ yếu instance của nó
task(bind=True)def add(self, x, y):logger.info(self.request.id)Task cũng hoàn toàn 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 tin tức và trạng thái 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 ngại trị tâm trạng của tasks và có thể lưu chúng một trong những hệ thống call là result backend. Vòng đời khoác định của task trong Celery gồm:
PENDING: task ngóng đượ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 khoản thời gian khởi chạy
RETRY: task đang được chạy lại
REVOKED: task được tịch thu lại
Ngoài phần đông trạng thái mặc định trên chúng ta cũng có thể tự tư tưởng thêm trạng thái cùng update trạng thái cho 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))
Gọi task
Celery vừa ý những API để điện thoại tư vấn task sau thời điểm đã định nghĩa chúng ở trên.
3 method chính:
apply_async: gửi task message.delay: giữ hộ task messagecalling: task message sẽ không được gửi tiếp cận worker cơ mà task sẽ được thực thi luôn luôn bởi process hiện nay tại.
Có một task như sau:
app.taskdef add(x, y):return x + yĐể gọi task này chúng ta sẽ thử cần sử dụng 2 method là apply_async với delay
Với delay họ 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ì nên viết phức tạ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 tế delay với apply_async là đồng nhất nhưng delay đã có tương đối nhiều sẵn những tùy chỉnh cấu hình mặc định và chúng ta chỉ có thể truyền vào phần nhiều tham số nên đã khái niệm trong function của task, còn với apply_async bạn cũng có thể truyền thêm phần lớn tham 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 ở trong theo nhu yếu sử dụng.
Celery cung ứng việc điện thoại tư vấn task theo dạng chaining, công dụng 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 chế độ này bạn 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
Setup
pip install -U Celery
Sử dụng
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 ứng 3 loại message broker là RabbitMQ, Redis, SQS. Mình đã đi sâu vào đối chiếu từng 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
$ celery -A tasks worker –loglevel=infoGọi task
Lưu kết quả
Celery hoàn toàn có thể lưu lại tâm trạng của tasks nếu chúng ta cần theo dõi tasks sau này. Cùng với những hệ thống thực hiện task theo thủ tục state machine thì việc hệ thống cần nỗ lực được luồng trạng thái của task là khôn cùng quan trọng.
Những khối hệ thống celery dùng làm lưu tâm trạng task:
SQLAlchemyMemcachedRedis
Để thực hiện cơ chế lưu kết quả trong Celery họ khai báo celery worker có tham số backend. Ở trên đây mình áp dụng redis cho tất cả việc lưu tác dụng task lẫn làm message broker
app = Celery(“tasks”, backend=”redis://localhost”, broker=”redis://localhost:6379/0″)
Cấu hình Celery
Cấu hình khoác đị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 cùng results.result_backend = “db+sqlite:///results.db”task_annotations = “tasks.add”: “rate_limit”: “10/s”Best practice: chế tác một tệp tin config riêng cho celery celeryconfig.py
broker_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 ý muốn muốnNgoài cách thức tạo tệp tin config trên ra chúng ta cũng hoàn toàn có thể config trực tiếp bởi application của Celery app.conf
app.conf.update(enable_utc=True, timezone=”Europe/London”,)Tổng kếtCelery không cần phải config các mà chỉ việc import từ module áp dụng trực tiếp như sau
from celery Import Celeryapp = Celery(“name of module”, broker=”url_of_broker”)Worker với client của Celery hoàn toàn có thể tự retry
Một process của Celery rất có thể xử lý hàng triệu task vào một phút cùng với độ trễ chỉ vài ba miligiây
Celery hỗ trợ:
Message brokers:RabbitMQRedisSQSXử lý concurrencymultiprocessingmultithreadsingle threadeventlet, geventLưu trữ công dụng trên phần đông hệ thống:AmqpRedisMemcachedSQLAlchemyAmazon S3File systemSerializationjsonyaml
Ở phần sau nội dung bài viết mình vẫn đi sâu hơn về worker trong Celery với hai nhiều loại message broker cơ mà Celery hỗ trợ: SQS – Redis, mặt khác dựng một áp dụng cơ bạn dạng sử dụng khối hệ thống này.
Xem thêm: Mẫu Báo Cáo Thực Hành Xác Định Công Suất Của Các Dụng Cụ Điện Sgk Trang 42
Thể Loại: share Kiến Thức cùng Đồng
Bài Viết: Celery Là Gì – Nghĩa Của từ bỏ Celery Trong giờ Việt
Thể Loại: LÀ GÌ
Nguồn Blog là gì: https://romanhords.com Celery Là Gì – Nghĩa Của trường đoản cú Celery Trong tiếng Việt
Related
About The Author

Là GìEmail Author
Leave a Reply Hủy
lưu tên của tôi, email, và trang web trong trình chuyên chú này mang lại lần comment kế tiếp của tôi.