Trong môi trường của chúng tôi, chúng tôi sử dụng RabbitMQ và Celery trên AWS để chạy các tác vụ song song trên nhiều nút.Thả kết nối cần tây với AWS ELB và RabbitMQ
Gần đây, chúng tôi đã biến RabbitMQ thành một cụm gồm 3 nút, cấu hình chính sách ha và thêm bộ cân bằng tải đàn hồi AWS (ELB) cho cổng 5672 cho tất cả 3 nút. Tất cả nhân viên Celery và mã khách hàng đều sử dụng DNS ELB làm URL của nhà môi giới.
Chúng tôi đã nhận thấy kể từ khi thay đổi đó, chờ đợi cho các tác vụ không đồng bộ để hoàn thành sẽ ném một ngoại lệ IOError: Socket closed
.
ELB sẽ tắt tất cả các kết nối không hoạt động sau 60 giây. Chúng tôi có các nhiệm vụ mất vài giờ để hoàn thành.
Đặt BROKER_HEARTBEAT thành giá trị thấp hơn 60 kết nối được giải quyết giảm trên đầu người lao động. Nhưng chúng tôi dường như không thể tìm thấy bất kỳ cài đặt nào sẽ giữ kết nối khách hàng còn sống.
Đây có phải là cách tiếp cận chính xác để chờ các nhiệm vụ chạy dài với Celery không?
Một cách giải quyết khác mà chúng tôi chưa thử nghiệm, là nhớ lại phương thức AsyncResult.wait()
cho đến khi kết thúc thành công. Vì vậy, ví dụ:
async_result = task.delay(params)
while True:
try:
async_result.wait()
break
except IOError:
pass
Chúng tôi sử dụng:
- RabbitMQ 3.6.5
- Cần tây 3.1.20
- Cần tây backend là pyamqp
- kết quả Cần tây backend là rpc
Tôi sẽ đi ra ngoài trên một chi ở đây, nhưng tôi muốn nói rằng bạn đã có cho mình một vấn đề XY cổ điển. Ngay lập tức dơi có mùi đáng kể liên quan đến việc đình chỉ một sợi cho giờ chờ đợi trên công việc async. Thứ hai và trong trường hợp chung ELB/Tuyến 53 được thiết kế để phục vụ hàng triệu và hàng triệu yêu cầu. Với điều này xem xét trong tâm trí nếu họ giữ ổ cắm của bạn mở cửa cho giờ kết thúc họ sẽ bị choáng ngợp khá nhanh chóng. Tôi nghĩ rằng bạn sẽ tìm thấy bạn đang lau sàn với một con bạch tuộc ở đây, bạn phải bỏ cuộc và đi mua một cây lau. – nsfyn55