2015-11-02 44 views
0

我寫了下面的代碼將幾條消息寫入SQS隊列並立即刪除它們。不過,我在輸出中看到,每條消息都會立即被刪除。不過,我看到消息數量非常隨機出現。我的意思是最初顯示1,然後再次顯示2,儘管刪除了一個更多。我已將可見性超時設置爲50秒,就像這個post中提到的那樣。我嘗試了這個程序的一部分。爲什麼SQS消息的寫入和刪除給出了錯誤的計數?

所以我的疑問是刪除消息立即發生。如果是的話,這將如何影響線程數。請參閱下面的代碼和輸出。

__author__ = 'Dhanapathi.Marepalli' 

import boto.sqs 

conn = boto.sqs.connect_to_region("us-east-1", aws_access_key_id="********", 
            aws_secret_access_key="************") 
my_queue = conn.get_queue('SMSQueue') 


def write_messages(): 
    print("Writing messages.") 
    for i in range(1, 5): 
     new_message = Message() 
     message_body = str(random.randint(1111111111, 9999999999)) 
     print("Message body is ", message_body) 
     new_message.set_body(message_body) 
     my_queue.write(new_message) 
     print("Message with message body {0} is written.".format(message_body)) 
    print("Messages completed. Totally {0} messages written to Queue.".format(my_queue.count())) 


def retrieve_messages(): 
    while True: 
     counter = 0 
     rs = my_queue.get_messages() 
     for message in rs: 
      counter = 1 
      body = message.get_body() 
      print(current_thread().getName(), " Message is ", body) 
      print(current_thread().getName(), " Assume something happened in between.") 
      is_message_deleted = my_queue.delete_message(message) 
      if is_message_deleted: 
       print("{0}: Message with body {1} is deleted.".format(current_thread().getName(), body)) 
      else: 
       print("{0}: Message with body {1} failed to delete.".format(current_thread().getName(), body)) 

      print(current_thread().getName(), " thread count is ", my_queue.count()) 

     if counter == 0: 
      print("Thread1:No messages inside the Queue.") 
      break 

if __name__ == "__main__": 
    write_messages() 
    retrieve_messages() 

已生成的輸出如下:預先

Writing messages. 
Message body is 8111076750 
Message with message body 8111076750 is written. 
Message body is 4927934264 
Message with message body 4927934264 is written. 
Message body is 8511692382 
Message with message body 8511692382 is written. 
Message body is 9718698315 
Message with message body 9718698315 is written. 
Messages completed. Totally 4 messages written to Queue. 
MainThread Message is 8111076750 
MainThread Assume something happened in between. 
MainThread: Message with body 8111076750 is deleted. 
MainThread thread count is 3 
MainThread Message is 4927934264 
MainThread Assume something happened in between. 
MainThread: Message with body 4927934264 is deleted. 
MainThread thread count is 2 
MainThread Message is 9718698315 
MainThread Assume something happened in between. 
MainThread: Message with body 9718698315 is deleted. 
MainThread thread count is 1 
MainThread Message is 8511692382 
MainThread Assume something happened in between. 
MainThread: Message with body 8511692382 is deleted. 
MainThread thread count is 2 
Thread1:No messages inside the Queue. 

感謝。

回答

4

SQS是一個分佈式系統。你想要的是規模和可靠性。但是,由於系統的分佈性,它不能保證100%的一致性。爲了獲得隊列中的項目的數量,boto使用隊列屬性ApproximateNumberOfMessages,顧名思義,它只能提供隊列中可用消息的近似計數。

如果您的應用程序需要隊列中消息的確切計數,SQS可能不是您的問題的正確答案。不過,對於理解其一致性限制的應用程序而言,它是一種非常可靠且可擴展的排隊服務。