2016-08-03 17 views
5

Lưu ý: đây là bản đăng lại của chuỗi từ here.Đọc từ hàng đợi SQS với nhiều chủ đề

Xin chào tất cả, Tôi có một quy trình xử lý thư trong một hàng đợi SQS. Hàng đợi có thể có nhiều thông báo trong đó và mỗi thông điệp dẫn đến một lần truy cập cơ sở dữ liệu. Vì vậy, tôi muốn tạo luồng cho các độc giả của hàng đợi này.

Các mã cơ bản cho mỗi thread là:

public void run() { 
    while(true) { 
     ReceiveMessageRequest rmr = new ReceiveMessageRequest(queueUrl) 
       .withMaxNumberOfMessages(10) 
       .withWaitTimeSeconds(3); 
     List<Message> messages = sqsClient.receiveMessage(rmr).getMessages(); 
     // process messages 
     // delete messages 
    } 
} 

gì tôi nhìn thấy là có tấn điệp trùng lặp giữa các chủ đề. Tôi biết rằng tôi nên mong đợi một vài bản sao ở đây và ở đó, nhưng nó xuất hiện rằng mỗi thread được cùng một tập hợp các thông điệp và, thực tế, chỉ có một sợi bao giờ làm nhiều công việc.

Tôi có hiểu lầm về cách sử dụng API hoặc tôi đang làm điều gì khác sai? Các Javadocs chỉ ra rằng lớp AmazonSQS là luồng an toàn và, thực sự, thậm chí tạo ra một lớp AmazonSQS mới cho mỗi luồng không thay đổi gì cả.

Mọi con trỏ sẽ được đánh giá cao nhất. Suy nghĩ hiện tại của tôi về sửa chữa là có một chuỗi chỉ đọc từ hàng đợi SQS, đặt mỗi thông điệp vào một cái gì đó giống như một LinkedBlockingDeque và sau đó có các nhân viên đọc nó. Nhưng tôi cảm thấy rằng việc thực hiện đó sẽ không làm cạn kiệt hàng đợi nhanh như tôi muốn.

+1

gì về nghe hàng đợi trong một chủ đề duy nhất, và sau đó quay lên chủ đề mới để xử lý mỗi tin nhắn bạn nhận được? –

+0

@Mark B - Đó là một biến thể của những gì tôi đề xuất trong đoạn cuối của tôi - tôi đã hy vọng để tránh điều đó nhưng nó có thể là đặt cược tốt nhất. – stdunbar

+2

Quá trình của bạn mất bao lâu? Bạn có thể cần phải sử dụng setVisibilityTimeout trên yêu cầu thông báo của bạn để cho quá trình xử lý và xóa các thông báo của bạn. – Larry

Trả lời

1

Khi bạn có một lần truy cập cơ sở dữ liệu cho mỗi thư, có vẻ như việc xử lý mỗi thư cần có thời gian. Bạn nên tăng thời gian chờ hiển thị của hàng đợi.

Từ AWS tài liệu SQS:

Ngay sau khi nhận được tin nhắn, nó vẫn còn trong hàng đợi. Để ngăn người tiêu dùng khác xử lý lại thư, Amazon SQS đặt thời gian chờ hiển thị, một khoảng thời gian trong đó Amazon SQS ngăn các thành phần tiêu thụ khác nhận và xử lý thông báo .

(http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html)

+0

Thời gian chờ hiển thị thấp có thể gây ra các vấn đề trùng lặp trong trường hợp thời gian xử lý tin nhắn dài nhưng rõ ràng không phải là nguyên nhân gốc trong trường hợp của tôi vì nó được đặt thành 3 phút và tôi đã nhìn thấy các thông báo trùng lặp trước khi SQS làm cho chúng sẵn sàng trở lại . Tôi đã kết thúc bằng cách sử dụng dispatcher pinned trong Akka để đảm bảo rằng một sợi duy nhất hiện tất cả các đọc từ hàng đợi. Xử lý tin nhắn mặc dù được thực hiện bởi các chủ đề khác nhau để ngăn chặn nó can thiệp vào việc đọc tin nhắn mới từ hàng đợi –

Các vấn đề liên quan