2012-06-21 43 views
8

Tôi có một tập lệnh python bằng cách sử dụng thư viện boto trên cá thể ec2 là một phần của nhóm tự động tính toán. Tập lệnh xử lý các thư từ hàng đợi SQS:Xử lý hàng đợi SQS bằng boto

import boto 
from boto.sqs.message import Message 

conn = boto.connect_sqs() 
q = conn.create_queue('queue-name') 

while (qin.count() > 0): 
    m = q.get_messages() 
    #do something with the message 

Có sử dụng câu lệnh trong khi có ý nghĩa không? Liệu count() cập nhật trong thời gian thực như sau: (? Hay tôi sẽ nhớ họ)

  1. trường hợp khác mất thông điệp ra khỏi hàng đợi (hay tôi sẽ tăng gấp đôi lên)
  2. tin nhắn mới được thêm vào hàng đợi

Làm cách nào để làm cho tập lệnh này liên tục nghe những bổ sung mới vào hàng đợi, ngay cả khi hàng đợi trống?

Trong câu hỏi này Processing items in SQS queue with a php script nó đã được đề cập rằng thư viện khách hàng 'sqy ruby ​​có một phương pháp "thăm dò ý kiến" liên tục thăm dò hàng đợi và nhận tin nhắn trong hàng đợi chuyển nó tới một khối'. Có tương đương trong Python không? Nó cũng đã được gợi ý rằng SNS có thể được sử dụng để thông báo cho các kịch bản của tình trạng hàng đợi tin nhắn nhưng tôi không thấy làm thế nào bạn có thể cấu hình một hệ thống đáp ứng với SNS như báo động số liệu không đủ hạt mịn.

+0

bạn biết rằng những thư viện ruby?Tôi muốn xem nó – Hassek

+0

nop xin lỗi, tôi chỉ thấy nó trong câu hỏi được liên kết ở trên. – waigani

+0

Thanh toán SNS - tốt hơn là ấn để kéo. và chúng hoạt động thực sự tốt với nhau http://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html –

Trả lời

6

Bạn không nên dựa vào số lượng hàng đợi vì nó chỉ có nghĩa là cung cấp số lượng gần đúng và không được đảm bảo chính xác.

Nếu bạn muốn chỉ cần giữ phiếu mãi mãi, chỉ cần làm điều này:

while 1: 
    messages = q.get_messages() 
    # do something with messages 
    time.sleep(N) 

Tôi đã thêm các cuộc gọi đến time.sleep để giới thiệu một sự chậm trễ trong vòng lặp. Giá trị của N phải có ít nhất một giây và có thể đáng kể hơn, tùy thuộc vào tốc độ bạn mong đợi các tin nhắn mới xuất hiện trong hàng đợi của bạn. Nếu bạn không đặt một số loại chậm trễ trong vòng lặp, bạn có thể sẽ bắt đầu nhận được throttled bởi dịch vụ.

Để tránh tin nhắn được đọc nhiều lần, bạn nên cố gắng điều chỉnh thời gian chờ hiển thị của hàng đợi thành giá trị lớn hơn thời gian bạn xử lý tin nhắn và sau đó đảm bảo bạn xóa tin nhắn khi xử lý hoàn thành.

3
  1. Khi bạn kéo một thư từ SQS, thư sẽ trở thành vô hình và không thể truy cập bởi các truy vấn hàng đợi khác (chỉnh sửa - khả năng hiển thị có thể được đặt trong khoảng từ 0 đến 12 giờ).
  2. Bạn sẽ phải nhận lại hàng đợi mỗi khi có thêm tin nhắn mới, nhưng đây không phải là vấn đề - đó là lý do tại sao dịch vụ xếp hàng tồn tại ngay từ đầu.

Nếu bạn muốn kiểm tra liên tục hàng đợi, hãy thử gọi số Long Polling - bạn có thể có cuộc thăm dò liên tục trong tối đa 20 giây trả về khi hàng đợi được điền.

Hy vọng điều đó hữu ích, nếu không thì hãy nhảy xung quanh khu vực boto vuông documentation.

+0

Tính năng ẩn thư là mặc định 30 giây, không phải 4 ngày. Và giai đoạn này có thể được sửa đổi. –

2

Ví dụ:

# wait_time_seconds count only 1 request in x seconds (0 - 20) 
# num_messages get x messages in same request (1 - 10) 
while 1: 
    logger.info("... waiting messages ...") 
    messages = queue_in.get_messages(wait_time_seconds=20, num_messages=10) 
    for message in messages: 
     logger.info('message: %s' % (message,)) 
     queue_in.delete_message(message) 
Các vấn đề liên quan