2012-08-10 40 views
7

Tôi đang sử dụng thư viện boto trong Python để nhận các thông báo SQS của Amazon. Trong các trường hợp đặc biệt, tôi không xóa các tin nhắn khỏi hàng đợi để cung cấp thêm một vài thay đổi để phục hồi các lỗi tạm thời. Nhưng tôi không muốn tiếp tục nhận được tin nhắn không thành công liên tục. Những gì tôi muốn làm là xóa tin nhắn sau khi nhận được nhiều hơn 3 lần hoặc không nhận được tin nhắn nếu nhận được nhiều hơn 3.Làm thế nào để nhận được tin nhắn được đếm trong SQS của Amazon bằng cách sử dụng thư viện boto bằng Python?

Cách thanh lịch nhất để làm điều đó là gì?

Trả lời

3

Có ít nhất một vài cách để thực hiện việc này.

Khi bạn đọc thư trong boto, bạn nhận được một đối tượng Thư hoặc một số phân lớp của thư đó. Đối tượng Message có một trường "attributes" là một dict chứa tất cả các thuộc tính message được SQS biết đến. Một trong những điều SQS là số lần gần đúng của thông điệp đã được đọc. Vì vậy, bạn có thể sử dụng giá trị này để xác định xem thư có bị xóa hay không nhưng bạn sẽ phải thoải mái với tính chất "gần đúng" của giá trị.

Ngoài ra, bạn có thể ghi lại ID thư trong một số loại cơ sở dữ liệu và tăng trường đếm trong cơ sở dữ liệu mỗi khi bạn đọc thư. Điều này có thể được thực hiện trong một dict Python đơn giản nếu các thông điệp luôn được đọc trong một quá trình duy nhất hoặc nó có thể được thực hiện trong một cái gì đó như SimpleDB nếu bạn cần ghi lại các bài đọc trên các quy trình.

Hy vọng điều đó sẽ hữu ích.

Dưới đây là một số mã ví dụ:

>>> import boto.sqs 
>>> c = boto.sqs.connect_to_region() 
>>> q = c.lookup('myqueue') 
>>> messages = c.receive_message(q, num_messages=1, attributes='All') 
>>> messages[0].attributes 
{u'ApproximateFirstReceiveTimestamp': u'1365474374620', 
u'ApproximateReceiveCount': u'2', 
u'SenderId': u'419278470775', 
u'SentTimestamp': u'1365474360357'} 
>>> 
+0

cảm ơn câu trả lời của bạn. Tôi đã lướt qua tài liệu boto nhưng không thể tìm thấy bất kỳ đầu mối nào để nhận được số lượng tin nhắn. Bạn có biết nó ở đâu không? Bằng cách có một cơ sở dữ liệu cục bộ đơn giản là cách thay thế của tôi trong việc quản lý vấn đề này nhưng trước tiên tôi muốn giữ nó đơn giản giống như nhận được số đếm - nếu có thể .. – huzeyfe

+0

Bạn có thể thêm một ví dụ cú pháp không? Tất cả những gì tôi tìm thấy là một từ điển trống khi tôi đọc một tin nhắn nhiều hơn một lần và nhìn vào message_instance.attributes. – tponthieux

1

Nó nên được thực hiện trong vài bước.

  1. tạo kết nối SQS: - sqsconnrec = SQSConnection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  2. tạo đối tượng hàng đợi: - request_q = sqsconnrec.create_queue ("queue_Name")
  3. tải các thông điệp đợi: - thông điệp = request_q.get_messages()
  4. bây giờ bạn nhận được mảng đối tượng tin nhắn và tìm tổng số thư: - chỉ cần làm len (thư)

nên hoạt động như sự quyến rũ.

+0

Cảm ơn sự quan tâm của bạn nhưng tôi e rằng đây không phải là trường hợp của tôi. Tôi không cần len (tin nhắn) Tôi cần số lượng nhận của một thông điệp nhất định. – huzeyfe

+1

có, không có hàm nào được xác định trong boto để nhận số đếm. Tôi sẽ đề nghị bạn duy trì một tuple địa phương mà sẽ có id tin nhắn, số lượng và cơ thể tin nhắn. bạn tải các tin nhắn từ hàng đợi sau một thời gian nhất định, kiểm tra xem id có xuất hiện trong tuple không, nếu có, tăng số lượng nhận, nếu số nhận> 3, bạn có thể xóa tin nhắn. Tôi thấy thư mục của đối tượng tin nhắn và nó không có chức năng đếm nhận. Hy vọng nó sẽ giúp vấn đề của bạn. –

+0

Đây là giải pháp thay thế mà tôi đoán bây giờ tôi chỉ có tùy chọn này. Cảm ơn rất nhiều .. – huzeyfe

4

Cách khác có thể là bạn có thể đặt số nhận dạng bổ sung ở cuối thư trong hàng đợi SQS của mình. Mã định danh này có thể giữ số đếm số lần tin nhắn được đọc. Ngoài ra nếu bạn muốn dịch vụ của bạn không nên thăm dò ý kiến ​​các tin nhắn này một lần nữa và một lần nữa sau đó bạn có thể tạo thêm một hàng đợi nói "Hàng đợi tin nhắn chết" và có thể chuyển sau đó tin nhắn đã vượt qua ngưỡng đến hàng đợi này.

1

Nhận được ApproximateReceiveCount thuộc tính từ thư bạn đã đọc. di chuyển nó đến hàng đợi khác (hơn là bạn có thể quản lý thông báo lỗi) hoặc chỉ cần xóa nó.

foreach (var message in response.Messages){ 
     try{ 
      var notifyMessage = JsonConvert.DeserializeObject<NotificationMessage>(message.Body); 
        Global.Sqs.DeleteMessageFromQ(message.ReceiptHandle); 
      } 
     catch (Exception ex){ 
      var receiveMessageCount = int.Parse(message.Attributes["ApproximateReceiveCount"]); 
      if (receiveMessageCount >3) 
       Global.Sqs.DeleteMessageFromQ(message.ReceiptHandle); 
      } 
     } 
2

AWS đã trong xây dựng hỗ trợ cho điều này, chỉ cần làm theo các bước dưới đây:

  1. tạo một hàng đợi thư chết
  2. kích hoạt chính sách Redrive cho hàng đợi nguồn bằng cách kiểm tra "Sử dụng chính sách Redrive"
  3. chọn hàng đợi thư chết mà bạn đã tạo ở bướC# 1 cho "Hàng đợi thư chết"
  4. Đặt "Số tiền nhận tối đa" là "3" hoặc bất kỳ giá trị nào từ 1 đến 1000

Cách hoạt động là, bất cứ khi nào một nhân viên nhận được tin nhắn, số gia số nhận được. Khi nó đạt đến "Số lần nhận tối đa", thông báo sẽ được đẩy tới hàng đợi thư chết. Lưu ý, ngay cả khi bạn truy cập thư thông qua giao diện điều khiển aws, số gia số nhận được.

Nguồn Using Amazon SQS Dead Letter Queues

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