Amazon web services 为什么SQS消息写入和删除的计数错误?

Amazon web services 为什么SQS消息写入和删除的计数错误?,amazon-web-services,boto,amazon-sqs,Amazon Web Services,Boto,Amazon Sqs,我编写了以下代码,将少量消息写入SQS队列并立即删除它们。然而,我在输出中看到,每条消息都会立即被删除。尽管如此,我还是看到消息计数非常随机。我的意思是它最初显示为1,然后再次显示为2,尽管又删除了一个。我已将可见性超时设置为50秒,如本文所述。我也试过同样的方法作为程序的一部分 所以我怀疑删除消息是否会立即发生。如果是这样的话,这将如何影响线程数。请参阅下面的代码和输出 __author__ = 'Dhanapathi.Marepalli' import boto.sqs conn = b

我编写了以下代码,将少量消息写入SQS队列并立即删除它们。然而,我在输出中看到,每条消息都会立即被删除。尽管如此,我还是看到消息计数非常随机。我的意思是它最初显示为1,然后再次显示为2,尽管又删除了一个。我已将可见性超时设置为50秒,如本文所述。我也试过同样的方法作为程序的一部分

所以我怀疑删除消息是否会立即发生。如果是这样的话,这将如何影响线程数。请参阅下面的代码和输出

__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.

提前感谢。

SQS是一个分布式系统。你想要它的规模和可靠性。然而,由于系统的分布式性质,它不能保证100%的一致性。为了获得队列中的项目计数,boto使用队列属性
approximateEnumberOfMessages
,顾名思义,该属性只能提供队列中可用消息的近似计数


如果您的应用程序需要队列中消息的精确计数,那么SQS可能不是解决问题的正确答案。然而,对于了解其一致性限制的应用程序来说,它是一种非常可靠和可扩展的排队服务。

SQS是一种分布式系统。你想要它的规模和可靠性。然而,由于系统的分布式性质,它不能保证100%的一致性。为了获得队列中的项目计数,boto使用队列属性
approximateEnumberOfMessages
,顾名思义,该属性只能提供队列中可用消息的近似计数

如果您的应用程序需要队列中消息的精确计数,那么SQS可能不是解决问题的正确答案。然而,对于理解其一致性限制的应用程序来说,它是一种非常可靠和可扩展的排队服务