Tôi tự hỏi liệu có cách nào để thiết lập RabbitMQ hoặc Redis để làm việc với Celery để khi tôi gửi một nhiệm vụ đến hàng đợi, nó không đi vào một danh sách các nhiệm vụ, mà là vào một tập hợp các nhiệm vụ được khóa dựa trên tải trọng nhiệm vụ của tôi, để tránh trùng lặp.Hàng đợi nhiệm vụ phân tán Dựa trên các bộ như cấu trúc dữ liệu thay vì danh sách
Đây là thiết lập của tôi để biết thêm ngữ cảnh: Python + Cần tây. Tôi đã dùng thử RabbitMQ làm phụ trợ, giờ tôi đang sử dụng Redis làm phụ trợ vì tôi không cần độ tin cậy 100%, dễ sử dụng hơn, dấu chân bộ nhớ nhỏ, v.v.
Tôi có khoảng 1000 id cần làm việc liên tục. Giai đoạn 1 của đường dẫn dữ liệu của tôi được kích hoạt bởi một trình lên lịch và nó xuất ra các nhiệm vụ cho giai đoạn 2. Nhiệm vụ chỉ chứa id mà công việc cần được thực hiện và dữ liệu thực được lưu trữ trong cơ sở dữ liệu. Tôi có thể chạy bất kỳ kết hợp hoặc chuỗi các giai đoạn 1 và nhiệm vụ giai đoạn 2 mà không gây hại.
Nếu giai đoạn 2 không có đủ sức mạnh xử lý để xử lý khối lượng công việc đầu ra theo giai đoạn 1, hàng đợi nhiệm vụ của tôi tăng và tăng. Điều này sẽ không phải là trường hợp nếu hàng đợi nhiệm vụ được sử dụng đặt làm cấu trúc dữ liệu cơ bản thay vì danh sách.
Có giải pháp off-the-shelf để chuyển từ danh sách thành tập hợp dưới dạng hàng đợi công việc được phân phối không? Celery có khả năng này không? Gần đây tôi đã thấy rằng Redis vừa phát hành một phiên bản alpha của một hệ thống xếp hàng, vì vậy chưa sẵn sàng để sử dụng sản xuất.
Tôi có nên kiến trúc sư cho đường ống của mình theo cách khác không?
Với RabbitMQ, bạn có thể tạo một hàng đợi cho mỗi ID duy nhất với độ sâu hàng đợi tối đa ('x-max-length') là 1. Có thêm dịch vụ dọn dẹp xuất bản và đăng ký 1000 hàng đợi khác nhau, nhưng các bản sao sẽ bị loại bỏ theo yêu cầu của bạn. – tariksbl
Đây chính xác là loại kiểu workaround logic mà tôi đang tìm kiếm, nhưng giải pháp đặc biệt này có vẻ tẻ nhạt và tôi cũng muốn tránh xa RabbitMQ về sau. Tuy nhiên, cảm ơn bạn vì sự sáng tạo! – Heliodor