Tôi có một hàng đợi công việc (sử dụng SQS của Amazon) để thực hiện các công việc cho nhiều máy để tìm nạp và xử lý các tài liệu khác nhau qua HTTP. Có hàng trăm máy chủ khác nhau được truy cập và không có thứ tự có thể dự đoán được cho công việc.Phương pháp tự sắp xếp lại hàng đợi công việc
Để lịch sự, tôi không muốn hệ thống của mình liên tục phát trên một máy chủ. Vì vậy, nếu tôi nhận được một công việC# 123 để lấy một cái gì đó từ example.com, nhưng tôi thấy rằng tôi vừa lấy một thứ khác từ example.com trong X giây qua, tôi nên chuyển sang một thứ khác và lưu công việC# 123 cho một lát sau.
Câu hỏi là, cách tốt nhất để triển khai mẫu này là gì?
Dường như bước đầu tiên là để người chạy công việc giữ danh sách ở một nơi nào đó trong tất cả các miền và lần cuối cùng nội dung nào đó trên miền đó được truy cập. Tôi cho rằng đây có thể là một bảng DB đơn giản.
Sau đó, có rất nhiều tùy chọn có thể cho việc cần làm nếu bộ xử lý tin nhắn nhận được lệnh phải hoãn lại.
Chỉ cần đẩy bản sao của thư vào cuối hàng đợi và vứt nó đi mà không cần thực hiện. Hy vọng rằng, vào lần tới nó đến, đủ thời gian sẽ trôi qua. Điều này có thể dẫn đến rất nhiều thông điệp SQS dư thừa, đặc biệt nếu một cụm công việc lớn cho cùng một tên miền đi qua cùng một lúc.
Ngủ trong nhiều giây là cần thiết cho đến khi lịch sự ra lệnh cho công việc có thể được thực thi. Điều này có thể dẫn đến rất nhiều bộ xử lý hàng đợi đồng thời không làm gì cả.
Chấp nhận công việc, nhưng lưu nó vào hàng đợi cục bộ ở đâu đó trên mỗi bộ xử lý hàng đợi. Tôi tưởng tượng mỗi bộ xử lý có thể "tuyên bố" một số công việc theo cách này, và sau đó chọn để xử lý chúng theo thứ tự bất kỳ đạt được sự lịch sự tối đa. Điều này vẫn có thể không đoán trước được, bởi vì mỗi bộ xử lý hàng đợi cần phải nhận thức được các tên miền bị tấn công bởi tất cả những người khác.
Thiết lập hàng đợi riêng cho từng miền và có một quy trình dành riêng cho từng hàng đợi. Mỗi quá trình sẽ phải tạm dừng cho X giây giữa mỗi công việc, vì vậy có rất nhiều quá trình ngủ trên đầu, nhưng có lẽ đây không phải là một điều xấu.
Bạn có kinh nghiệm thiết kế loại điều này không? Bạn sẽ đề xuất chiến lược nào?
Bạn có bị kẹt 100% trên SQS không? Có những thiết kế tốt KHÔNG ép bạn vào giải pháp hàng đợi trên mỗi miền, nhưng chúng yêu cầu bạn phải kiểm soát trực tiếp hàng đợi mà tôi giả định SQS không cung cấp (chính xác, khả năng "duyệt" hàng đợi mà không cần phải lấy phần tử và khả năng lấy phần tử Nth thay vì phần trên - về cơ bản, xử lý hàng đợi là danh sách được liên kết kép mà không chèn và không phải là hàng đợi thuần túy). – DVK